如何从按钮的外部源调用函数。[Python]

2024-10-02 10:28:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我一直在拼命尝试让这段代码在我的程序中工作。我基本上想从一个文件中读入几个选项,并从这些选项中创建Tkinter按钮。创建按钮是没有问题的;目前,我只是不能让代码运行我想要的函数。你知道吗

from Lib import StegosaurMainCode as Steg
...
class App:
    def __init__(self, master, menu):
        buttons = []
        for counter in range(0, len(menu[0])):
            text = menu[0][counter]
            func = menu[1][counter]
            att = menu[2][counter]
            buttons.append(Button(text=text, command=lambda: Steg.func(att)))
        frame = Frame(master)
        for item in buttons:
            item.pack()
        frame.pack()

在这个类中,func是我要调用的函数,Steg是另一个文件中的外部代码,att是函数的属性。我似乎不明白为什么Steg.func不会尝试调用Steg中名为“func”的函数,而不是变量func中描述的函数


Tags: 文件函数代码textinmasterfor选项
2条回答

假设menu[1][counter]包含字符串而不是对实际函数的引用,则需要获取对函数的引用,然后将其用作command属性的值。您可以使用getattr:

func = getattr(steg, menu[1][counter])

一旦这样做了,就可以像使用实际函数一样使用func。但是,需要将变量绑定到它们的当前值,因此需要将它们作为参数传递给lambda:

button = Button(text=text, command=lambda func=func, attr=att: func(att)))

让lambda在每次调用时重新绑定其att参数。你知道吗

class App:
    def __init__(self, master, menu):
        buttons = []
        for counter in range(0, len(menu[0])):
            text = menu[0][counter]
            func = menu[1][counter]
            att = menu[2][counter]
            buttons.append(Button(text = text, command = lambda att = att: Steg.func(att)))
        frame = Frame(master)
        for item in buttons:
            item.pack()
        frame.pack()

相关问题 更多 >

    热门问题