【问题标题】:Why is my button calling a function before actually clicking the button in tkinter? [duplicate]为什么我的按钮在实际单击 tkinter 中的按钮之前调用了一个函数? [复制]
【发布时间】:2020-08-06 12:19:50
【问题描述】:

我正在尝试创建一个更改标签文本的按钮,我觉得它应该可以正常工作,但是我分配给按钮命令的功能在我按下按钮之前就被调用了,为什么会发生这种情况并且存在我能做些什么来解决它?

这是我的代码:

import tkinter as tk

def changeLabelText(my_label, new_text):
    my_label.config(text = new_text)

root = tk.Tk()
root.geometry("500x500")

label = tk.Label(root, text = "Old Text", font = ("font", 30))
label.grid(row = 0)

changeTextButton = tk.Button(root, text = "Click to change label text",
                             command = changeLabelText(label, "New Text"))
changeTextButton.grid(row = 1)

tk.mainloop()

【问题讨论】:

    标签: python-3.x tkinter tk


    【解决方案1】:

    使用 lambda 将变量传递给回调。

    command = lambda: changeLabelText(label, "New Text"))
    

    【讨论】:

      【解决方案2】:

      不是传递你的函数,而是调用它并传递它返回的内容。 您可以通过省略括号来传递不带参数的函数

      command = func
      

      或者您可以使用 lambda:

      command = lambda: changeLabelText(label, "New Text")
      

      【讨论】:

      • 这个答案和上一个答案一样:(
      【解决方案3】:

      您应该使用lambda 进行回调。它允许为命令参数创建小的内联函数。 lambda 函数是 Python 中的匿名函数。您可以阅读更多相关信息:https://www.w3schools.com/python/python_lambda.asp

      意思是你应该把这个参数command = changeLabelText(label, "New Text")改成这个command=lambda: changeLabelText(label, "New Text")

      完整代码:

      import tkinter as tk
      
      
      def changeLabelText(my_label, new_text):
          my_label.config(text=new_text)
      
      
      root = tk.Tk()
      root.geometry("500x500")
      
      label = tk.Label(root, text="Old Text", font=("font", 30))
      label.grid(row=0)
      
      changeTextButton = tk.Button(
          root, text="Click to change label text", command=lambda: changeLabelText(label, "New Text")
      )
      changeTextButton.grid(row=1)
      
      tk.mainloop()
      

      “点击前”GUI:

      “点击后”界面:

      【讨论】:

        猜你喜欢
        • 2019-06-17
        • 1970-01-01
        • 2018-08-11
        • 2022-10-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-11-12
        相关资源
        最近更新 更多