我绝对推荐创建一个类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()
显然,我们可以为菜单编写更多方法和属性,但这包括所有基本方法。
物品
项目类应该更容易,它几乎不需要任何方法。Item 显然需要 aname
和 a function
(当 item 被激活时将运行函数),除此之外它还具有前面提到的parent
属性。我们可能应该创建一个 setter parent
,它会自动将项目移动到另一个菜单下,但如果你想这样做,我会留给你。也不要忘记draw()
item 的 - 方法,我们必须能够以他们想要的方式绘制我们的项目,而不是我们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
(每个,但当然是 rootMenuItem
的),并且菜单在绘制时看起来像这样:
[-] 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
。但请记住,这有点难以编码,不适合初学者。你可能想坚持我经历的第一个版本。