根据OptionMenu的选择运行命令

4

如何调整代码,使得当从菜单选择 xyz17 时,执行函数 xyz17()

我知道可以使用 command = xyz17,但不确定如何使其动态化,以依赖于菜单的选择。

from tkinter import *

def xyz17():
    print('xyz17')
def abc27():
    print('abc27')
def qwe90():
    print('qwe90')
def uio19():
    print('uio19')
def jkl09():
    print('jkl09')
def zxc28():
    print('zxc28')

class Menu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options)

def main():        
    TopFrame = Frame(root)
    TopFrame.pack()

    Menu1 = Menu(TopFrame, 'xyz', 'xyz17','abc27','qwe90')
    Menu2 = Menu(TopFrame, 'uio', 'uio19','jkl09','zxc28')

    Menu1.pack()
    Menu2.pack()

root = Tk()
main()
root.mainloop()

请注意,打印值的每个函数仅供示例,我希望代码运行函数本身。我意识到这一点:
class Menu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options, command=self.func)
    def func(self,value):
        print (value)

但是,这与我的情况无关,因为它只是获取值并将其打印出来,我希望它能够实际运行函数本身。


@Nae 我已经修复了错误,请查看编辑。 - jim bob
1
哦,好的。那就是我正在使用的。 - jim bob
1
@Nae 在我的实际代码中没有 xyz17,我只是为了举例而添加的。在我的代码中有一个下拉菜单,当选择一个选项时,我希望运行该函数。此外,该函数不仅仅打印值,这只是一个示例。 - jim bob
我刚刚进行了一次编辑,我认为那会更好地解释事情。 - jim bob
@Nae 我不确定如何处理这个问题:你可以使用if过滤器来根据该字符串运行任何方法 - jim bob
显示剩余4条评论
2个回答

1
如果你想运行特定选项的方法,只需检查发送的字符串并使用 if / elif 语句基于字符串选择方法:
from tkinter import *


def xyz17():
    print('xyz17')
def abc27():
    print('abc27')
def qwe90():
    print('qwe90')
def uio19():
    print('uio19')
def jkl09():
    print('jkl09')
def zxc28():
    print('zxc28')

class Menu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options, command=self.option_handle)


    def option_handle(self, selected):
        # above specific case is simply print(selected) but
        if selected == "xyz17":
            xyz17()
        elif selected == "abc27":
            abc27()
        elif selected == "qwe90":
            qwe90()
        elif selected == "uio19":
            uio19()
        elif selected == "jkl09":
            jkl09()
        elif selected == "zxc28":
            zxc28()
        # if you specifically want to call methods that has exactly
        # the same name as options
        # eval(selected + "()")


def main():        
    TopFrame = Frame(root)
    TopFrame.pack()

    Menu1 = Menu(TopFrame, 'xyz', 'xyz17','abc27','qwe90')
    Menu2 = Menu(TopFrame, 'uio', 'uio19','jkl09','zxc28')

    Menu1.pack()
    Menu2.pack()

root = Tk()
main()
root.mainloop()

好的,我明白了。非常感谢。 - jim bob

0

根据选项菜单选择运行命令的一种方法是使用函数字典:func_dict = {option: function, ...},然后将以下函数传递给OptionMenucommand选项:

def func(value):
    func_dict[value]() 

执行与所选选项对应的函数。

以下是一个示例:

from tkinter import *

options = ['xyz', 'xyz17', 'abc27', 'qwe90', 'uio', 'uio19', 'jkl09', 'zxc28']
func_dict = {option: lambda opt=option: print(opt) for option in options}

class Menu(OptionMenu):
    def __init__(self, master, status, *options):
        self.var = StringVar(master)
        self.var.set(status)
        OptionMenu.__init__(self, master, self.var, *options, command=self.func)

    def func(self, option):
        func_dict[option]()

def main():        
    topFrame = Frame(root)
    topFrame.pack()

    menu1 = Menu(topFrame, 'xyz', 'xyz17','abc27','qwe90')
    menu2 = Menu(topFrame, 'uio', 'uio19','jkl09','zxc28')

    menu1.pack()
    menu2.pack()

root = Tk()
main()
root.mainloop()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接