Python Tkinter GUI没有响应
我只有一个while循环,Tkonter说:GUI没有响应。 我做错了什么?我想与按钮暂停和中断 再次使用“开始”按钮继续程序Python Tkinter GUI没有响应,python,tkinter,Python,Tkinter,我只有一个while循环,Tkonter说:GUI没有响应。 我做错了什么?我想与按钮暂停和中断 再次使用“开始”按钮继续程序 import Tkinter, time root = Tkinter.Tk class InterfaceApp(root): def __init__ (self, parent): root.__init__(self,parent) self.parent = parent self.initialize
import Tkinter, time
root = Tkinter.Tk
class InterfaceApp(root):
def __init__ (self, parent):
root.__init__(self,parent)
self.parent = parent
self.initialize()
def initialize(self):
self.but_state = 0
self.but_start = Tkinter.Button(self, text='Start', command=lambda: self.Start(), width=10)
self.but_pause = Tkinter.Button(self, text="Pause", command=lambda: self.Pause(), width=10)
self.but_stop = Tkinter.Button(self, text='Stop', command=lambda: self.Stop(), width=10)
self.but_start.grid(row=1, column=1, sticky='W')
self.but_pause.grid(row=1, column=2, sticky='W')
self.but_stop.grid(row=1, column=3, sticky='W')
def Start(self):
while True:
print "X"
time.sleep(2)
if self.but_state == 1:
break
else:
continue
def Stop(self):
self.but_state = 1
def Pause(self):
pass
if __name__ == "__main__":
app = InterfaceApp(None)
app.title("MPW4 microHP - Long Term Test")
app.mainloop()
你的代码是胡说八道。首先,您必须弄清楚如何定义函数并正确使用它们。我给你写了一个小例子:
from tkinter import *
class App:
def __init__(self, master):
self.master = master
self.startb = Button(master, text="Start", command=self.startf)
self.startb.pack()
self.pauseb = Button(master, text="Pause", command=self.pausef)
self.pauseb.pack()
self.stopb = Button(master, text="Stop", command=self.stopf)
self.stopb.pack()
def startf(self):
print("Started")
self.after_id = self.master.after(1000, self.startf)
def pausef(self):
if self.startf is not None: # to handle any exception
self.master.after_cancel(self.after_id) # this will pause startf function -- you can start again
print("Paused")
def stopf(self):
if self.startf is not None:
self.master.after_cancel(self.after_id)
self.startf = None # this will stop startf function -- you cannot start again
print("Stopped")
root = Tk()
myapp = App(root)
root.mainloop()
然后,您可以修改此代码-更改函数的行为等。如果您有一段代码,它将作为执行程序核心思想的运动函数,那么也可以将该函数包含在中,并在startf函数中返回它,在pausef函数中暂停它,最后在stopf函数中停止它。
注:我的代码是用Python 3编写的。
编辑:我完成了代码,上面是一个工作程序,根据您单击的按钮启动、暂停和停止。第一期:
使用while循环。函数使用完毕后再次调用函数的步骤
赛尔夫之后
在def Startself的末尾
看起来是这样的:
# ...
def Start(self):
print("X")
if self.but_state == 0:
self.after(2000, self.Start)
# ...
第二期:
不要将lambdas用于简单调用。使用绑定的名称,就像@Parviz_Karimli指出的那样
def initialize(self):
self.but_state = 0
self.but_start = Tkinter.Button(self, text='Start', command=self.Start, width=10)
self.but_pause = Tkinter.Button(self, text="Pause", command=self.Pause, width=10)
self.but_stop = Tkinter.Button(self, text='Stop', command=self.Stop, width=10)
self.but_start.grid(row=1, column=1, sticky='W')
self.but_pause.grid(row=1, column=2, sticky='W')
self.but_stop.grid(row=1, column=3, sticky='W')
我猜while循环会阻止来自其他按钮的任何传入事件,因此您永远没有机会将self.but_state设置为1。你可以试着使用这个模块。好吧,如果是真的,使用无限循环不是一个好主意:在Tkinter内部。当然,它会停止响应。但在无限循环之前,问题是@MirzaGrbic将程序体按钮放在initialize中的错误位置-它必须放在构造函数init中。另一个问题是lamdba函数没有正确定义。@ParvizKarimli没问题,因为initialize是从_init__@Frodon调用的。没错,我刚刚注意到self.initialize在_init_;内。但是我想要这个程序,按下开始按钮时,必须在while循环中连续运行,直到按下暂停/停止按钮。@MirzaGrbic在此之后使用