我絕對建議創建一個類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