Python Tkinter 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

我只有一个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()

    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在此之后使用