我绝对建议创建一个类Item
,即使你只有text
和function
属性!谁知道你以后需要什么样的复杂逻辑。 考虑到这一点,造就了菜单可能会是这个样子:
main = Menu()
main.AddItem(Item("Open", openFile))
main.AddItem(Item("Close", closeFile))
此外,您text
和function
属性之上,你应该添加parent
属性到Item
类。 parent
只需在我们的项目的父菜单指出:
main = Menu()
# automatically calls main.AddItem(item1)
open = Item("Open", openFile, main)
# automatically sets parent to main
main.Add(Item("Close", closeFile))
现在我们知道如何适当Menu
和Item
应该工作,我们就可以开始编写类。
菜单
这应该不是太难,我们需要的是add_item()
,remove_item()
和draw()
方法和items
列表。 也可以画出我们的菜单名称,因此可以添加name
属性。
class Menu:
def __init__(self, name, items=None):
self.name = name
self.items = items or []
def add_item(self, item):
self.items.append(item)
if item.parent != self:
item.parent = self
def remove_item(self, item):
self.items.remove(item)
if item.parent == self:
item.parent = None
def draw(self):
print(self.label)
for item in self.items:
item.draw()
显然,我们可以编写更多的方法和我们的菜单属性,但包括所有必要的方法。
项目
项目类应该是更容易,它几乎不需要任何方法都没有。 该项目显然需要一个name
和一个function
(函数将在物件被激活时运行),最重要的是它具有前面提到的parent
属性。 我们可能应该为parent
创建一个setter,它会自动将该项目移动到其他菜单下,但如果您想要这样做,我会为您保留该项目。 也不要忘记draw()
- 物品的方法,我们必须能够绘制我们的物品他们想绘制的方式,而不是我们的Menu
想要绘制它们的方式。
class Item:
def __init__(self, name, function, parent=None):
self.name = name
self.function = function
self.parent = parent
if parent:
parent.add_item(self) # use add_item instead of append, since who
# knows what kind of complex code you'll have
# in add_item() later on.
def draw(self):
# might be more complex later, better use a method.
print(" " + self.name)
最后的想法
现在,我们已经完成了我们的菜单,它的工作原理,你应该能够使用它作为一个基本的菜单。 但是,卓越的控制台菜单将只有一个名为MenuItem
的类。 每个项目的母公司将是其他MenuItem
(每个,但根本MenuItem
当然的),菜单会是这个样子,当它得出:
[-] Root
[+] Submenu of Root
[-] An other submenu of Root
This menu runs functions, others open/close
<This menu has focus on it>
Select this menu by pressing mousedown
[+] A third submenu of Root
如果不给function
参数将创建items
列表允许用户关闭/打开菜单项。 如果给出function
,它将正常工作,并且只在选择时才执行该功能。为了更进一步,我们将分开MenuItem
和两个子类:ActionMenu
和ContainerMenu
。 但请记住,这是有点难以编码,不适合初学者。你可能想坚持我经历的第一个版本。
有人真的花了一些时间在菜单上工作?这给了我很多新的信息,完全得到了我的赞赏! – 2013-02-26 10:02:59