簡體   English   中英

使用消息框突破Python循環后

[英]Break out of a Python after loop using a messagebox

我是Python的新手。 我在這里有此代碼,並試圖找到一種使消息框脫離after循環的方法。 有沒有辦法用我的代碼來執行此操作,還是必須以某種方式重寫它?

from tkinter import *
import random
from tkinter import messagebox

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def drawBox(self, canvas):
        color = hex(random.randrange(4095))[2:6]
        l = len(color)
        if l == 1:
            color = '00' + color
        elif l == 2:
            color = '0' + color
        color = '#' + color
        canvas.create_rectangle(100,100,200,200,fill=color)
        canvas.pack()

    def updateTimer(self, canvas, flag, timer):
        timer = self.after(100, lambda: self.drawBox(canvas))
        if flag == True:
            print('OK clicked')
            self.after_cancel(timer)
            return
        else:
            flag = False
            self.after(100, lambda: self.updateTimer(canvas, flag, timer))

    def initUI(self):
        self.parent.title('after_cancel test')
        self.pack(fill=BOTH, expand=1)
        canvas = Canvas(self)
        self.flag = False
        timer = self.after(100, lambda: self.updateTimer(canvas, self.flag, timer))
        if messagebox.askokcancel('Turn that thing off','Click OK to stop'):
            self.updateTimer(canvas, True, timer)

def main():
    root = Tk() 
    root.geometry("300x250+300+300")
    app = Example(root)
    root.mainloop()  

if __name__ == '__main__':
    main()

謝謝!

您正在取消對self.drawBox(...)after調用,但由於仍在運行self.updateTimer ,因此循環將繼續。 您應該使用取消對self.updateTimer的下一次調用

self.after_id = self.after(100, lambda: self.updateTimer(canvas, flag, timer))

self.after_cancel(self.after_id)

實際上,您正在使這種方法變得更困難。 您不需要updateTimer函數,當然也不需要傳遞這么多的變量,只需將它們設置為self屬性即可。 您還將在每個循環中創建一個新的Canvas和一個新的矩形。 不必這樣做,只需更改矩形的顏色即可。

簡化代碼:

from tkinter import *
import random
from tkinter import messagebox

class Example(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)
        self.parent = parent
        self.initUI()

    def drawBox(self):
        color = hex(random.randrange(4095))[2:6]
        color = '#' + color.zfill(3)
        self.canvas.itemconfig(self.rect, fill=color)
        self.after_id = self.after(100, self.drawBox)

    def initUI(self):
        self.parent.title('after_cancel test')
        self.pack(fill=BOTH, expand=1)
        self.canvas = Canvas(self)
        self.rect = self.canvas.create_rectangle(100,100,200,200,fill='red')
        self.canvas.pack()
        self.drawBox()
        if messagebox.askokcancel('Turn that thing off','Click OK to stop'):
            print('OK clicked')
            self.after_cancel(self.after_id)


def main():
    root = Tk() 
    root.geometry("300x250+300+300")
    app = Example(root)
    root.mainloop()  

if __name__ == '__main__':
    main()  

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM