Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
除非从循环外部调用,否则不会显示Main循环内部的Python Tkinter变量_Python_Tkinter_Mainloop - Fatal编程技术网

除非从循环外部调用,否则不会显示Main循环内部的Python Tkinter变量

除非从循环外部调用,否则不会显示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')

第一次尝试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')      

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()
获取此事件,它将其发送到所有小部件,每个小部件检查鼠标是否在其区域内,当按钮识别出它在其区域内,并单击鼠标左键<代码>且按钮已定义<代码>命令=时,它将运行分配的函数<代码>测试()。