Ошибки трассировки после уничтожения виджета Tkinter Image (Python) - PullRequest
0 голосов
/ 07 января 2019

У меня есть программа, которая очень быстро мигает красным и синим на вашем экране, и она имеет кнопку остановки. Когда нажимается кнопка остановки, мигание прекращается, но я также получаю стену ошибок, которые все одинаковы, они идут так быстро, что я могу их прочитать. Вот ошибка:

 Traceback (most recent call last):
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1702, in __call__
        return self.func(*args)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 746, in callit
        func(*args)
      File "C:\Users\Mihkel\Desktop\epiloop\Assets\example.py", line 27, in re
        label2.configure(image=redi)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1482, in configure
        return self._configure('configure', cnf, kw)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1473, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".!label"
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1702, in __call__
        return self.func(*args)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 746, in callit
        func(*args)
      File "C:\Users\Mihkel\Desktop\epiloop\Assets\example.py", line 31, in blu
        label2.configure(image=bluei)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1482, in configure
        return self._configure('configure', cnf, kw)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1473, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".!label"
    Exception in Tkinter callback
    Traceback (most recent call last):
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1702, in __call__
        return self.func(*args)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 746, in callit
        func(*args)
      File "C:\Users\Mihkel\Desktop\epiloop\Assets\example.py", line 31, in blu
        label2.configure(image=bluei)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1482, in configure
        return self._configure('configure', cnf, kw)
      File "C:\Users\Mihkel\AppData\Local\Programs\Python\Python37-32\lib\tkinter\__init__.py", line 1473, in _configure
        self.tk.call(_flatten((self._w, cmd)) + self._options(cnf))
    _tkinter.TclError: invalid command name ".!label"

Это код:

from tkinter import*

root = Tk()
root.geometry("500x500")
root.title("test")

time_interval = 260

#define images
redi = PhotoImage(file="red.gif")
bluei = PhotoImage(file="blue.gif")

def createimg2():#create the  image that will later be reconfigured to make it flash
    global label2
    label2 = Label(root, image=redi)
    label2.image1 = redi
    label2.image2 = bluei
    label2.pack()
    label2.place(x=0, y=0)

createimg2()


#the 4 following methods are what make the image flash
def re():
    root.after(time_interval, blu)
    label2.configure(image=redi)

def blu():
    root.after(time_interval, re)
    label2.configure(image=bluei)

def rbgo():
    root.after(time_interval, re)

def rb():
    re()
    blu()
    rbgo()

rb()

def kill(): #remove the flashing image
    label2.destroy()

btn = Button(root, text="stop", height=2, width=3, command=kill)
btn.pack(pady=100)


root.mainloop()

Я считаю, что проблема в том, что label1 является глобальной переменной. Есть ли способ, которым я не могу сделать его глобальной переменной, и он все еще работает? Примечание: мне нужно, чтобы создание метки было в методе, потому что это на самом деле фрагмент гораздо большего проекта.

1 Ответ

0 голосов
/ 07 января 2019

Уничтожение метки не останавливает функции, которые пытаются перенастроить эту метку. Это просто заставляет их терпеть неудачу. Функция kill должна делать что-то, что вызывает изменение функции изменения цвета. Например:

flag = True

def re():
    if flag:
        root.after(time_interval, blu)
        label2.configure(image=redi)

def blu():
    if flag:
        root.after(time_interval, re)
        label2.configure(image=bluei)

def kill(): #remove the flashing image
    global flag
    flag = False
    label2.destroy()
...