属性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()
もちろん、メニューにはもっと多くのメソッドと属性をコーディングできますが、これにはすべての重要なメソッドが含まれています。
アイテム
アイテムクラスはさらに簡単なはずです。メソッドはほとんど必要ありません。アイテムには明らかにaname
とaが必要function
です(アイテムがアクティブ化されると関数が実行されます)。さらに、前述のparent
属性があります。おそらく、他のメニューの下にアイテムを自動的に移動するセッターを作成する必要がありparent
ますが、必要に応じてそれを残しておきます。また、アイテムの-methodも忘れないでください。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)
最終的な考え
これでメニューが完成しました。これで機能し、基本メニューとして使用できるようになります。ただし、優れたコンソールメニューには、と呼ばれるクラスが1つだけあります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
、2つのサブクラスを分離します:ActionMenu
とContainerMenu
。ただし、これはコーディングがやや難しく、初心者向けではないことに注意してください。あなたは私が経験した最初のバージョンに固執したいかもしれません。