Как мне показать, скрыть и показать tkinter canvas через определенный промежуток времени?

#python #tkinter

#python #tkinter

Вопрос:

Я пытаюсь показать, скрыть и показать холст. Холст даже не появляется при запуске программы и, похоже, застревает в цикле.

 import tkinter as tk
import time
    

class Test():
    def __init__(self):
       self.root = tk.Tk()
       self.canvas = tk.Canvas(self.root, bg="black", width=550, height=820)

    def main(self):
        time.sleep(2)
        self.canvas.pack()
        time.sleep(2)
        self.canvas.pack_forget()
        time.sleep(2)
        self.canvas.pack()
        self.root.mainloop()
        

a = Test()
a.main()
 

Комментарии:

1. Простой способ — добавление self.root.update() перед каждым time.sleep(2) . Лучший способ — провести рефакторинг вашего кода с помощью .after() .

2. Спасибо, что все сработало хорошо, что вы подразумеваете под рефакторингом?

3. Аналогично перепроектированию.

Ответ №1:

Я вижу здесь некоторые проблемы

  1. Вы должны использовать метод mainloop внутри __init__ функции
  2. Вы должны обновить свои elements ( .update() ), чтобы заставить его работать
  3. Вы просто не можете создавать подобные события
  4. Не использовать sleep функцию, используя .after метод, немного лучше в tkinter

Я изменил ваш код примерно так:

 import tkinter as tk

class Test():
    def __init__(self):
       self.root = tk.Tk()
       self.canvas = tk.Canvas(self.root, bg='black', width=550, height=820)
       self.btn = tk.Button(self.root,text='main func',command=self.main)
       self.btn.pack()
       self.root.mainloop()

    def main(self):
        self.root.after(2000)
        self.canvas.pack()
        self.canvas.update()
        self.root.after(2000)
        self.canvas.pack_forget()
        self.canvas.update()
        self.root.after(2000)
        self.canvas.pack()
        self.canvas.update()        

a = Test()
 

Как вы можете видеть, я добавил кнопку для запуска события для меня.
Попробуйте найти момент в вашей программе, когда может произойти событие. Например: я нажимаю кнопку, чтобы сгенерировать несколько строк. Он также выполняет основную функцию.

Надеюсь, я вам достаточно помог