除非从循环外部调用,否则不会显示Main循环内部的Python Tkinter变量
第一次尝试tkinter。下面的代码有4条打印语句。这里有两个问题-除非从循环外部调用,否则不会显示Main循环内部的Python Tkinter变量,python,tkinter,mainloop,Python,Tkinter,Mainloop,第一次尝试tkinter。下面的代码有4条打印语句。这里有两个问题- 1) -在执行时,我希望代码流与print#语句相同,但似乎流程不同。我先看到打印2,3,然后看到打印1。为什么会这样 2) -只有print1和4具有变量u_输入(或e1.get)的值。为什么打印的2,3不显示相同的值。。这可能与代码流的原因相同 from tkinter import * w = Tk() w.title(" Main Window") w.geometry('800x800')
1) -在执行时,我希望代码流与print#语句相同,但似乎流程不同。我先看到打印2,3,然后看到打印1。为什么会这样 2) -只有print1和4具有变量u_输入(或e1.get)的值。为什么打印的2,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()
所有GUI的工作方式都不同,然后命令
input()
Button()
不会等待您的单击-它只会为它必须在窗口中显示的小部件创建信息-然后mainloop()
启动程序,并显示窗口和此窗口中的所有小部件。它运行循环,从系统中获取键盘/鼠标事件,将它们发送到小部件,当您单击某个按钮时运行函数,(重新)绘制小部件,等等
因此,“打印2”
,“打印3”
在mainloop()
显示窗口之前执行,在您可以单击按钮运行带有“打印1”
的代码之前执行
第二个问题也是如此。在的“打印2”
中,的“打印3”
在mainloop()
显示窗口之前以及在您可以将任何文本放入条目之前打印值
正如我所说,同样的方法也适用于其他GUI——不仅是tkinter
,而且是PyQt
,PyGTK
,等等,不仅在Python
中,而且在其他语言C
,C++
,Java
,等等
同样的方法也适用于游戏-它们也可能有一些事件循环
。在PyGame
中,你甚至必须自己编写这个循环。我先看到print2,3,然后是print1。为什么会这样呢?用你自己的话说,你为什么不这么想?为什么test
中的代码应该在到达其他打印调用之前发生?另外:您的代码在3.x中没有打印语句print
现在是一个函数。Button()
不会等待您的单击-它只会通知mainloop()
要在窗口中显示的小部件-并且mainloop()
启动程序并显示窗口。因此,在mainloop()
显示窗口之前执行“print 2”
“print 3”
,然后单击按钮运行带有“print 1”
的代码,谢谢furas。。我有点理解你的观点,GUI总是这样工作,mainloop()之前的所有代码都只是信息,在测试中定义的函数实际上没有被调用。但是刚刚发布了另一个常规代码,这就是我比较它的地方。你将tkinter
与正常工作的代码进行比较。它直接运行func1()
,但tkinter
在mainloop()中运行test()
。当您在程序窗口内单击时,系统将向您的程序发送鼠标事件,mainloop()
获取此事件,它将其发送到所有小部件,每个小部件检查鼠标是否在其区域内,当按钮识别出它在其区域内,并单击鼠标左键<代码>且按钮已定义<代码>命令=代码>时,它将运行分配的函数<代码>测试()。