首页 > 解决方案 > 除非从循环外部调用,否则 mainloop 中的 Python Tkinter 变量不会显示

问题描述

第一次尝试 tkinter。下面的代码有 4 个 print# 语句。这里有两个问题-

1)- 执行时,我预计代码流将与 print# 语句相同,但似乎流程不同。我先看到 print2,3,然后再看到 print1。为什么会这样?

2)- 只有 print1 和 4 具有变量 u_input (或 e1.get )的值。为什么 print2,3 不显示相同的值?..它可能与代码流相同的原因。

from tkinter  import *

w = Tk()
w.title(" Main Window")
w.geometry('800x800')      

def test ():
    ux = u_input.get()
    print("print1 : " , ux )

u_input = StringVar()

e1 = Entry(w , textvariable = u_input )
e1.grid(row=0,column=1, padx = 300 , pady= 20 )
b1 = Button(w, text ="button1", width = 12 , justify = "center", command = test )
b1.grid(row=10,column=1 , padx= 300 , pady= 40)


print("print 2 : ", str(u_input.get()))
print("print 3 : ", str(e1.get()))

w.mainloop()

User_Entry = str(u_input.get())
print("print 4 ", User_Entry)

================================

将上面的代码与下面的代码进行比较 - 这个代码按调用函数的顺序打印。

a= 1
b= 2
def func2 ():
    a=100
    b=200
    print("print3 :", a+b)
def func1 ():
    a=10
    b=20
    print("print1 :",a+b)

func1()
print("print2 :", a+b)
func2()

标签: pythontkintermainloop

解决方案


所有 GUI 的工作方式与命令不同input()

Button()不等待您的点击 - 它只创建 mainloop()它必须在窗口中显示的小部件的信息 - 稍后mainloop()启动程序并在此窗口中显示窗口和所有小部件。它运行循环,从系统获取键盘/鼠标事件,将它们发送到小部件,单击某个按钮时运行功能,(重新)绘制小部件等。

因此"print 2",在显示窗口之前"print 3"执行mainloop()- 在您可以单击运行代码的按钮之前"print 1"

第二个问题也是如此。在"print 2"中,它会在显示窗口之前以及在您可以将任何文本放入之前"print 3"打印值。mainloop()Entry


正如我所说,其他 GUI 也以同样的方式工作 - 不仅是,等。tkinter而且不仅是在其他语言中,而且在其他语言中也是如此,等等。PyQtPyGTKPythonCC++Java

同样的方法也适用于游戏——他们也可能有一些event loop. PyGame你甚至必须自己编写这个循环。


推荐阅读