Tkinter 多重操作

Aas*_*daq 1 python user-interface tkinter button frame

我的问题与此类似:Python TKinter multiple actions。但是,提供的答案对我没有帮助,因为它指向一篇包含可能使用的函数列表的文章。我想看看该解决方案的实际实施。

我的问题:我的框架上有两个按钮。只要切换变量设置为 true,一键即可调用“执行”函数。第二个按钮将切换值设置为 False。我希望“执行”功能在按下执行按钮后继续运行,但在按下第二个(切换错误)按钮时停止。然而,一旦我按下“执行”,框架就会卡住。我理解它是因为回调。我怎样才能解决这个问题?这是我的示例代码:

from Tkinter import *
from time import sleep

class App:

    def __init__(self, master):

        self.toggle = False
        frame = Frame(master)
        frame.pack()

        self.exeButton = Button(frame, text="Execute", fg="blue", command=self.execute)
        self.exeButton.pack(side=LEFT)

        self.tOffButton = Button(frame, text="Toggle Off", command=self.toggleOff)
        self.tOffButton.pack(side=LEFT)

    def execute(self):
        self.toggle = True
        while(self.toggle):
            print "hi there, everyone!"
            sleep(2)

    def toggleOff(self):
    self.toggle = False

root = Tk()
app = App(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)

Bry*_*ley 5

简短的回答,你不能完全做你想做的事。Tkinter 是单线程的——当您调用sleep(2)它时,它会完全按照您的要求执行:它会休眠。

如果您的目标是只要布尔标志设置为 True,则每 2 秒执行一次某些操作,则可以使用after来安排将来运行的作业。如果该作业也使用 after 来(重新)调度自身,那么您实际上创建了一个无限循环,其中实际的循环机制是事件循环本身。

我已经获取了您的代码并做了一些细微的修改,以向您展示如何连续执行某些操作,直到标志告诉它停止。我冒昧地将“toggle”重命名为“running”,以使其更容易理解。我还只使用一个方法来打开和关闭执行。

from Tkinter import *
from time import sleep

class App:

    def __init__(self, master):

        self.master = master
        self.running = False
        frame = Frame(master)
        frame.pack()

        self.exeButton = Button(frame, text="Execute", fg="blue", 
            command=lambda: self.execute(True))
        self.exeButton.pack(side=LEFT)

        self.tOffButton = Button(frame, text="Toggle Off", 
            command=lambda: self.execute(False))
        self.tOffButton.pack(side=LEFT)

    def execute(self, running=None):
        if running is not None:
            self.running = running
        if self.running:
            print "hi there, everyone!"
            self.master.after(2000, self.execute)

root = Tk()
app = App(root)
root.mainloop()
Run Code Online (Sandbox Code Playgroud)