_tkinter.TclError: недопустимое имя команды ".! treeview" - PullRequest
3 голосов
/ 04 августа 2020

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

Exception in thread Thread-2:
    Traceback (most recent call last):
      File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\threading.py", line 926, in _bootstrap_inner
        self.run()
      File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\threading.py", line 1177, in run
        self.function(*self.args, **self.kwargs)
      File "C:/Users/Desktop/Tool/t.py", line 47, in ae
        self.treeview.insert('', 'end',image=self._img, value=(a))
      File "C:\Program Files (x86)\Microsoft Visual Studio\Shared\Python37_64\lib\tkinter\ttk.py", line 1370, in insert
        res = self.tk.call(self._w, "insert", parent, index, *opts)
    _tkinter.TclError: invalid command name ".!treeview"

пример кода:

import time
import threading
import tkinter.messagebox
from tkinter import ttk
import queue
from tkinter import *

class Demo1:
    data=[]
    def __init__(self, master):#Python scrollbar on text widget
        self.master = master
        self.t=tkinter.Text(self.master,height=20,width=50)
        self.t.grid(row=1, column=1)
        self.button = tkinter.Button(self.master,height=3,width=10, text="OK", command = self.new_window)
        self.button.grid(row=2,column=1)
    def new_window(self):
        self.inputValue=self.t.get("1.0",'end-1c')
        Demo1.data1=self.inputValue.split("\n")
        self.master.destroy() # close the current window
        self.master = tkinter.Tk() # create another Tk instance
        self.app = Demo2(self.master) # create Demo2 window
        self.master.mainloop()
class Demo2:
    t1 = []
    s1 = True
    display = []
    display1 = []
    i=0
    kas = True
    num=0
    j1=0
    def __init__(self, master):
        self.master = master
        self.button = tkinter.Button(self.master,height=2,width=11, text="new",command=self.new).place(x=0,y=0)
        self.label = tkinter.Label(self.master, text="monitor", font=("Arial",20)).grid(row=0, columnspan=3)
        cols = ('aa','bb')
        self.treeview = ttk.Treeview(self.master, columns=cols)
        for col in cols:
            self.treeview.heading(col, text=col)
            self.treeview.column(col,minwidth=0,width=170)
        self.treeview.grid(row=1, column=0)
        self._img=tkinter.PhotoImage(file="green1.gif")
        self.ae()
    def ae(self):
        a=Demo1.data1
        for i,(a) in enumerate(a):
            self.treeview.insert('', 'end',image=self._img, value=(a))
        threading.Timer(1.0, self.ae).start()
    def new(self):
        self.master.destroy() # close the current window
        self.master = tkinter.Tk() # create another Tk instance
        self.app = Demo1(self.master) # create Demo2 window
        self.master.mainloop()

def main():
    root = tkinter.Tk()
    app = Demo1(root)
    root.mainloop()


if __name__ == '__main__':
    main()

1 Ответ

3 голосов
/ 04 августа 2020

Проблема заключается в модуле threading и в основном в строке threading.Timer(1.0, self.ae).start(), многопоточность с помощью Tkinter не является хорошей идеей, особенно с Timer потоковой передачи.

Timer можно заменить на in -встроенный метод Tkinter after метод.

Итак, замените

threading.Timer(1.0, self.ae).start()

на

self.treeview.after(1000, self.ae)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...