【问题标题】:How to call function from external source from button. [Python]如何从按钮调用外部源的函数。 [Python]
【发布时间】:2017-02-08 14:34:46
【问题描述】:

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

【问题讨论】:

  • 如何导入 Steg ?
  • 刚刚编辑,以便您查看。
  • menu[1][counter] 中有什么内容?它是字符串,还是对函数的实际引用?运行问题中的代码时遇到什么错误?我们无法运行它,因为它依赖于我们未知的变量。如果您阅读并遵循How to create a Minimal, Complete, and Verifiable example 处的说明,将会有所帮助

标签: python oop tkinter


【解决方案1】:

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

【讨论】:

    【解决方案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)))
    

    【讨论】:

    • 您好,感谢您的帮助。您是否有机会快速分解并解释您放在那里的第二行代码。我有点困惑,但了解它是如何工作的。
    猜你喜欢
    • 1970-01-01
    • 2013-01-23
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-05-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多