为什么在我单击按钮之前会出现测试标签



我用tkinter实现了一个python程序,我想在单击按钮后显示fct1的结果。当我运行程序时,即使我没有单击按钮,结果也会显示在窗口中。

from tkinter import *
def fct1():
u = 0.1
while 1 + u != 1:
u /= 10
return u * 10
def create_gui():
window = Tk()
window.title("Math")
window.geometry('350x200')
label1 = Label(text=' ')
label1.grid(column=2, row=0)
btn = Button(window, text="Function1", command=clicked(label1))
btn.grid(column=1, row=0)
window.mainloop()
def clicked(label1):
output = fct1()
label1['text']=str(output)
create_gui()

我认为您应该稍微重构一下代码。tkinter GUI在全局名称空间或类中更好。也就是说,由于括号的原因,你的命令不起作用。实际情况是,该命令在带有括号的init中只调用一次,因此您需要在没有括号的情况下或在lambda函数中调用该命令。

清理示例:

import tkinter as tk

def fct1():
u = 0.1
while 1 + u != 1:
u /= 10
return u * 10

def clicked():
label1['text'] = fct1()

window = tk.Tk()
window.title("Math")
window.geometry('350x200')
label1 = tk.Label(text=' ')
label1.grid(column=2, row=0)
tk.Button(window, text="Function1", command=clicked).grid(column=1, row=0)
window.mainloop()

最好使用类。你可以通过这种方式避免很多问题:

import tkinter as tk

class App(tk.Tk):
def __init__(self):
super().__init__()
self.title("Math")
self.geometry('350x200')
self.label1 = tk.Label(self, text=' ')
self.label1.grid(column=2, row=0)
tk.Button(self, text="Function1", command=self.clicked).grid(column=1, row=0)
def clicked(self):
self.label1['text'] = self.fct1()
def fct1(self):
u = 0.1
while 1 + u != 1:
u /= 10
return u * 10

App().mainloop()

注释中的mike - smt解释了原因,因为有括号,Python在读取代码时执行函数,但没有括号(括号(,Python将其视为对以后可以调用的函数的引用。

我发现避免这种情况的最佳方法是使用lambda函数。

这里最好解释一下,但我会在这里总结一下

正如我所说,当创建一个按钮时,它将运行您希望在单击它时运行的命令。

要创建一个用参数调用按钮函数的lambda函数,您可以执行以下操作:

lambda: button('ping pong')

你最终得到了一个功能等效的函数:

def function():
button('ping pong')

lambda返回对该无名称函数的引用。由于引用是命令选项所期望的,因此可以在创建按钮时直接使用lambda

所以不是

btn = Button(window, text="Function1", command=clicked(label1))

使用lambda函数调用像这样的自定义函数

btn = Button(window, text="Function1", command=lambda: clicked('label1'))

最新更新