【问题标题】:How to apply function with arguments to buttons in TkInter [duplicate]如何将带有参数的函数应用于 TkInter 中的按钮 [重复]
【发布时间】:2019-09-02 16:50:15
【问题描述】:

我正在尝试制作一个界面,用户单击 TkInter 按钮以选择一种语言,然后该按钮调用一个函数(带有特定语言的参数)来设置程序的语言。

我尝试使用 Lambda 来传递函数,但没有成功。

def showLangButtons():
    tk = Tk()
    root = Canvas(tk, width=100, height=100)
    root.pack()
    langButtons = []
    langs = []
    for a in langf:
        langs.append(a)
    for a in sorted(langs):
        langButtons.append(Button(root, text=lang_names[a][a], width=19,
                                  height=2, command = lambda:setLang(a)))
    # This part of the function displays the buttons on a grid
    const = 0
    while const < (len(langButtons))**(1/2)/1.75:
        const += 1
    n = 0
    while n < len(langButtons):
        langButtons[n].grid(row = int(n/const), column = n%const, sticky = W)
        n+=1
    tk.update()

langf 是一个包含支持语言列表的字典。 lang_names 是一个字典,其中包含每种语言的名称(由 ISO 639-3 代码索引)。 setLang() 将字符串作为参数,特别是该语言的 ISO 639-3 代码。

我希望根据用户单击的任何按钮设置语言,但它总是将语言设置为语言列表中的最后一种语言。例如,目前支持 2 种语言:英语和冰岛语。无论我点击哪个按钮,它总是将语言设置为冰岛语,因为它按字母顺序排在最后。

【问题讨论】:

标签: python tkinter


【解决方案1】:

使用lambda时需要强制关闭:

command=lambda lang=a: setLang(lang)

【讨论】:

  • 在这段代码中,所有的按钮都会做同样的事情
  • 是的,我确定。 command=setLang 表示每个按钮都会调用setLang。您永远不会重新定义 setLang 是什么,因此所有按钮都做同样的事情。此外,args 不是 Button 类的有效选项。
  • 我不知道你想让我怎么想。问题或答案中没有提到guizero,所以无论它做什么都是无关紧要的。最重要的是,您提供的答案无效。
  • 你在说谜语,我不知道你在说什么。为什么你觉得我的想法太简单了?说不正确的代码确实不正确有多“简单”?
  • 老兄。严重地?任何定义过一次、从不重新定义并以完全相同的方式调用的函数,每次都绝对会以相同的方式调用。根据定义,以相同的方式调用它会导致以相同的方式调用它。
猜你喜欢
  • 2013-11-10
  • 1970-01-01
  • 2023-03-10
  • 2020-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多