【问题标题】:Interrupting Loops in a tkinter GUI via a button.通过按钮中断 tkinter GUI 中的循环。
【发布时间】:2015-12-18 02:00:55
【问题描述】:

我正在编写一个计时器应用程序,它遇到了很多困难,但最先遇到的困难之一是制作一个可以通过按下按钮来打破的循环。我已经研究过了,我的研究表明我应该使用线程,但我无法弄清楚它是如何工作的。

然后,我决定尝试在调用键盘中断时创建一个异常,然后创建一个调用相同中断的按钮。但是,当我 ctrl-c 时,我当前的代码拒绝中断。

我的示例代码如下所示

from Tkinter import *
from sys import exit

class Timer:
    def __init__(self, master):
         buttonstart = Button(master, text = "Start", fg = "blue", command = self.start)
         buttonstart.grid(row = 1, column = 0)

         buttonquit = Button(master, text = "Quit", fg = "blue", command= quit)
         buttonquit.grid(row = 1, column = 2)

        global timertext
        timertext = DoubleVar()
        timertext.set(0)
        display = Label(master, textvariable = timertext)
        display.grid(row = 0, column = 0)
        timertext.set(timertext)

    def timerlogic(self):
        pass

    def pause(self):
        pass

    def start(self):
        global timertext
        try:
            while True:
                #do things
       except KeyboardInterrupt:
            print "Interrupted"

def lap(self):
    pass

root = Tk()
app = Timer(root)
root.mainloop()
root.destroy()

基本上,我不认为我的代码是可行的,但我不知道如何编辑它以创建一个循环,我可以根据需要中断。

【问题讨论】:

    标签: python python-2.7 loops tkinter


    【解决方案1】:

    您将某个变量设置为 True 或 False。此外,while 循环会中断 Tkinter 循环,因此 Tkinter 在 while 循环退出之前不会执行任何操作。改用 Tkinter 的 after 函数。

    from Tkinter import *
    ##from sys import exit
    
    class Timer:
        def __init__(self, master):
            self.master=master
            buttonstart = Button(master, text = "Start", fg = "blue", command = self.start)
            buttonstart.grid(row = 1, column = 0)
    
            buttonquit = Button(master, text = "Quit", fg = "blue", command=self.quitit)
            buttonquit.grid(row = 1, column = 2)
    
            self.timertext = DoubleVar()
            self.timertext.set(0)
            display = Label(master, textvariable = self.timertext)
            display.grid(row = 0, column = 0)
    ##        timertext.set(timertext)  ## Huh!!
            self.timeit=False
    
        def increment_timer(self):
            ctr=int(self.timertext.get())
            self.timertext.set(ctr+1)
            if self.timeit:
                self.master.after(500, self.increment_timer)
    
        def start(self):
            self.timeit=True
            self.increment_timer()
    
        def quitit(self):
            self.timeit=False
    
    root = Tk()
    app = Timer(root)
    root.mainloop()
    

    【讨论】:

    • 哦,哇,这解释了为什么我不能让事情正常工作,我不知道 Tkinter 会等到循环结束。我真的很感激帮助!非常感谢。
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 2021-11-11
    • 2012-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    相关资源
    最近更新 更多