用Python制作菜单[重复]

Posted

技术标签:

【中文标题】用Python制作菜单[重复]【英文标题】:Making a menu in Python [duplicate] 【发布时间】:2011-11-07 06:51:25 【问题描述】:

可能重复:Calling a function from a string with the function's name in Python

我想我可以编写一些糟糕的代码来做到这一点,但我更愿意看到“干净的版本”。

对我来说,最好的方法是制作一个包含给定对象可以使用的各种功能的字典。然后当用户被指示告诉对象它在做什么时,它会根据该字典吐出一个菜单。

我搜索了一下,并没有真正看到适用于我的东西,所以我想我会试一试。好吧,它没有用。

class Man(object):
    def __init__(self):
        self.cmds = ['foo', 'bar']

    def foo(self):
        print "Foo called."

    def bar(self):
        print "Bar called."

    def junk(self):
        print "Junk called." ##not in dict, on purpose, will explain

    def menu(self):
        while True:
            print "List of actions:"
            for acts in self.cmds:
                print acts
            cmd = raw_input("> ")
            if cmd in self.cmds:
                cmd()    ##doesn't work.
                         ##neither did self.cmd() (got AttributeError, obviously)

                result = getattr(self, cmd)() ## this works! thanks cdhowie
            else:
                pass

Stick = Man()
Stick.menu()

如果不是很明显,每当我输入 if-else 认为是 True 的内容时,程序都会给出 TypeError - 在这种情况下,输入“foo”或“bar”。 事情是这样的,我知道我可以在这里写一个又长又丑的 if-else 东西并使这个例子工作 - 但我希望能够从 self.cmds 中追加/删除来改变对象的功能。因此第三个函数 Junk(); Stick 无法从当前的 dict-menu 访问 'Junk()',但通过一点 self.cmds.append 操作我希望它能够访问。

怪异的 Python,它们是如何工作的?这是解决这个问题的正确方法,还是有更简单的方法?

编辑:我的答案是在 getattr 的魔力中找到的。谢谢 cdhowie。诀窍是更改 while 循环以具有此位: result = getattr(self, cmd)()

我现在知道我的下一个任务是最终弄清楚 getattr() 的实际作用。原谅我的菜鸟身份,呵呵,我不知道我的代码是什么:)

最终编辑:虽然 cdhowie 的示例适用于原始程序,但我后来发现 ders 的回答允许我在功能上做一些我无法用 getattr() 做的事情; ders 的解决方案使我更容易在 Man 的 init 中的其他对象中使用函数 - 我认为这称为“对象组合”对吗?无论如何,getattr() 将 AttributeError 任何从除 Man 之外的任何地方添加到 self.cmds 的函数。或者我可能只是再做一次奇怪的事情。但我只想说,ders FTW。

【问题讨论】:

如果您想按名称调用方法,This question 是相关的。 哦,那确实可以解决问题。快速简单的回答,谢谢薄荷糖。 您是否通过解决您的问题的代码更新来编辑您的问题?如果是这样,这个Q需要被删除或关闭。 是的,我同意。由于我显然是新用户,因此我无法再回答自己的问题...... 7 小时。所以是的。 【参考方案1】:

在您的示例中 Man.cmds 是一个列表而不是字典。因此,当 self.cmds 列表中的字符串作为函数调用时,会引发 TypeError。

创建一个字典,函数名作为字符串与函数本身配对。

    def __init__(self):
        self.cmds = 'foo':self.foo, 'bar':self.bar

在您的菜单功能中,检查用户是否输入了有效的功能名称。如果是这样,将其从字典中取出并调用它。

            if cmd in self.cmds:
                command = self.cmds[cmd]
                command()
            else:
                pass

要动态添加垃圾功能,可以update cmds:

Stick.cmds.update('junk':Stick.junk)

【讨论】:

这个 答案实际上让我走上了我需要的道路。惊人的。谢谢。 不要使用updateStick.cmds添加单个项目,使用Stick.cmds['junk'] = Stick.junk即可。

以上是关于用Python制作菜单[重复]的主要内容,如果未能解决你的问题,请参考以下文章

我想制作一个侧面菜单,并在单击 [重复] 时更改类

python gui编程,我是初学者。用tk,制作下拉菜单的command不分我想打开另一个界面。如和解决,求解!!

如何在 KivyMD、Python 中制作下拉菜单

Python之运用字典,制作简单三级菜单

如何快速制作侧边菜单(subSidemenu

如何在 Android 上制作 Facebook 的应用新菜单? [复制]