如何从按钮调用外部源的功能。 [蟒蛇]

时间:2017-02-08 14:34:46

标签: python oop tkinter

我一直在拼命想让这部分代码在我的程序中运行。我本质上想从文件中读取几个选项,并从这些选项中创建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

中描述的那个

2 个答案:

答案 0 :(得分:0)

让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()

答案 1 :(得分:0)

假设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)))