gpt4 book ai didi

python - Python 中的控制台菜单生成器

转载 作者:太空宇宙 更新时间:2023-11-03 13:48:14 24 4
gpt4 key购买 nike

正如标题所说,我正在用 Python 编写一个控制台菜单生成器。我有 2 个类,菜单和项目。但是我遇到了麻烦。这是代码:

class Menu:
def AddItem(self,item):
class Item:
def __init__(self,text,ToDoNext):
self.text=text
??????????????
self.item.append(Item())
def Show():
for i in range(len(self.item)):
print(str(i+1)+") "+str(self.item[i])+"\n")
print("0) Back\n")
option=int(input())
self.item[option].????????????

这段代码基本上完成了接下来的工作:

Main=Menu()
Menu.AddItem("Open file",ToDo1)
Menu.AddItem("Save file",ToDo2)
Menu.Show()

'''1) Open file
2) Save file
0) Back
_
'''

例如,如果我写 1 并按回车键,应该执行代码 ToDo1 的部分。我认为的解决方案是下一个:

def ToDo1():
print("Hello, world!")
Menu.AddItem("Say Hello","ToDo1()")

并在 Show() 中使用 eval() 函数。

但我不太确定这不是正确的方法。

我希望你向我展示一个更好的方法,如果你曾经做过类似的事情(控制台菜单生成器)来共享代码并查看另一种方法来做同样的事情。

最佳答案

我绝对建议创建一个类 Item,即使您只有 textfunction 属性!谁知道你以后需要什么样的复杂逻辑。考虑到这一点,创建菜单可能看起来像这样:

main = Menu()
main.AddItem(Item("Open", openFile))
main.AddItem(Item("Close", closeFile))

此外,在 textfunction 属性之上,您应该将 parent 属性添加到 Item类(class)。 parent 简单地指向我们项目的父菜单:

main = Menu()

# automatically calls main.AddItem(item1)
open = Item("Open", openFile, main)

# automatically sets parent to main
main.Add(Item("Close", closeFile))

既然我们知道了正确的 MenuItem 应该如何工作,我们就可以开始编写类了。


菜单

这不应该太难,我们只需要 add_item()remove_item()draw() 方法以及一个项目列表。绘制我们的菜单名称也很好,所以让我们添加 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 类应该更简单,它几乎不需要任何方法。Item 显然需要一个 name 和一个 function(函数将在 item 被激活时运行),最重要的是它有前面提到的 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 和两个子类:ActionMenuContainerMenu。但请记住,这有点难以编码,不适合初学者。您可能想要坚持使用我经历过的第一个版本。

关于python - Python 中的控制台菜单生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15083900/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com