python tkinter treeview прекратить обновление до экрана - PullRequest
0 голосов
/ 09 апреля 2020

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

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

В некоторых исследованиях говорится, что tkinter обновляется только при срабатывании события, но я использую нить для изменения содержимого Threeview, что также вызывает обновление экрана.

from tkinter.ttk  import *
from tkinter import *

root = Tk()
root.geometry('800x800')
root.bind('<Escape>',  lambda x:root.destroy() )

class Run_item_Tree(Frame):
    def __init__(self, roots):
        Frame.__init__(self, roots)
        t = Treeview(self, selectmode=NONE, height=10)
        self.t = t
        t["columns"] = ("1", "2")
        t['show'] = 'headings'
        t.column("1", width=100, anchor='c')
        t.column("2", width=50, anchor='c')

        t.heading("1", text="Title")
        t.heading("2", text="UL")

        t.pack(fill =BOTH,side =LEFT)

        vsb = Scrollbar(self, orient="vertical", command=t.yview)
        vsb.pack(fill = Y,side = RIGHT)
        self.vsb = vsb
        t.configure(yscrollcommand=vsb.set)
        self.pack()
a = Run_item_Tree(root)
item_num = 4000
for i in range(item_num):
    a.t.insert('',index=END,text = i,values = (i,i+1,i+2,i+4),tags=('pass',))
count = 0
def update_test():
    global  count
    #a.t.yview_moveto(count/item_num)
    a.t.item(a.t.get_children()[0],values = (count,count+1,count+2,count+4) )
    count= (count+1)%item_num
    root.after(100, update_test)

btn = Button(root,text='update/unupdate',command=lambda  : SomeFunction())
btn.pack()

root.after(100,update_test)
root.mainloop()

1 Ответ

0 голосов
/ 09 апреля 2020

Чтобы иметь контроль над вашим Treeview обновлением, вам нужна отдельная функция, которая обрабатывает, вызвана или нет функция update_test.

Вы используете .after, что здорово, это означает, что вы можете использовать .after_cancel, чтобы остановить l oop.

Код должен быть реструктурирован, но я оставлю вас делать реструктуризацию самостоятельно, functions будет лучше как methods в class, который вы уже определили.

from tkinter.ttk  import *
from tkinter import *

root = Tk()
root.geometry('800x800')
root.bind('<Escape>',  lambda x:root.destroy() )

class Run_item_Tree(Frame):
    def __init__(self, roots):
        Frame.__init__(self, roots)
        t = Treeview(self, selectmode=NONE, height=10)
        self.t = t
        t["columns"] = ("1", "2")
        t['show'] = 'headings'
        t.column("1", width=100, anchor='c')
        t.column("2", width=50, anchor='c')

        t.heading("1", text="Title")
        t.heading("2", text="UL")

        t.pack(fill =BOTH,side =LEFT)

        vsb = Scrollbar(self, orient="vertical", command=t.yview)
        vsb.pack(fill = Y,side = RIGHT)
        self.vsb = vsb
        t.configure(yscrollcommand=vsb.set)
        self.pack()

a = Run_item_Tree(root)
item_num = 4000
for i in range(item_num):
    a.t.insert('',index=END,text = i,values = (i,i+1,i+2,i+4),tags=('pass',))
count = 0
update = True

def call_update():
    global update, update_after
    if update:
        update = False
        update_test()
    else:
        update_after_cancel = root.after_cancel(update_after)
        update = True


def update_test():
    global  count, update, update_after
    #a.t.yview_moveto(count/item_num)
    a.t.item(a.t.get_children()[0],values = (count,count+1,count+2,count+4) )
    count= (count+1)%item_num
    update_after = root.after(100, update_test)

btn = Button(root,text='update/unupdate',command=lambda  : call_update())
btn.pack()

#root.after(100,update_test)
root.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...