Привязка событий текстовой панели python Tkinter для огромного количества сбоев при входе в графический интерфейс

Я пытаюсь сделать графический интерфейс в Tkinter, и у меня есть 1 миллион записей в текстовой панели. Поэтому я привязываю функцию к каждой записи, которая должна вызываться при щелчке мыши. Но когда записи вставляются в текстовую панель и привязываются к функции, после 0,6 миллиона записей графический интерфейс начинает зависать (в настоящее время я использую python-SQL для уменьшения использования памяти в ОЗУ).

traces=sql_database.debug_read(id_count)    #reading data from SQL
x1=0     #tag number for binding
for i in range(len(traces)): 
    Id,t_s,tra_id,t_d=traces[i]    #splitting data to be printed
    m,g,s_t=dict2[tra_id]          #checking data with a dictionary 
    filtered_data=t_s+tra_id+t_d
    data_to_print=str(t_s)+'\t '+m+'\t '+g+'\t '+s_t
    textPad.insert('end',data_to_print,x1)
    if i%20000==0: 
          mainWindow.update() 
          textPad.see(END)
    textPad.tag_bind(x1,'<1>'(lambda e,x1=x1:decoder_fun(x1,t_d)))
    x1=x1+1

без привязки событий графический интерфейс работает правильно. Использование процессора и ОЗУ среднее, с привязкой.


person Neo    schedule 31.03.2017    source источник
comment
Ваш графический интерфейс имеет 1 миллион записей ???!!! Я не знаю ни одного экрана, который мог бы их удерживать, или человека, который мог бы с ними взаимодействовать.   -  person Billal Begueradj    schedule 31.03.2017
comment
на текстовой панели есть кнопка прокрутки, чтобы увидеть целые записи ... и мне нужно взаимодействовать с ними.   -  person Neo    schedule 31.03.2017
comment
Почему вы делаете миллион переплетов, а не один переплет? Связанная функция получает достаточно информации, чтобы знать, где вы щелкнули. Вы пробовали только с одной привязкой? И почему вы используете текстовый виджет? Кажется, что список имеет больше смысла.   -  person Bryan Oakley    schedule 31.03.2017
comment
Если я использую одну привязку, функция декодера будет действовать на целые записи, мне нужно декодировать отдельные записи, используя другую функцию при нажатии на каждую из них... я попробую использовать список..спасибо   -  person Neo    schedule 31.03.2017
comment
вы все еще можете иметь одну привязку, а затем выяснить, какой элемент с тегом был нажат. Было бы очень полезно, если бы вы создали минимальный, полный и проверяемый пример, для которого не требовался ваш фактический набор данных. Например, будет полезен простой цикл, генерирующий фальшивые, но репрезентативные данные.   -  person Bryan Oakley    schedule 31.03.2017
comment
у вас все еще может быть одна привязка, а затем выяснить, какой элемент с тегом был нажат. Можете ли вы дать мне какие-либо ссылки на этот метод, я думаю, это поможет мне решить мою проблему.......   -  person Neo    schedule 03.04.2017


Ответы (1)


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

import Tkinter
from Tkinter import *

def callback(event):
    index=w.curselection()
    #print index
    print w.get(index)


root=Tkinter.Tk()
scrollbar = Tkinter.Scrollbar(root)
scrollbar.pack(side=RIGHT, fill=Y)
w=Tkinter.Listbox(root)
w.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=w.yview)
for i in range(20):
    w.insert(i,i)
w.pack()
def ons():
    w.delete(1,END)
w.bind('<<ListboxSelect>>',callback)
b=Tkinter.Button(root,command=ons)
b.pack()
root.mainloop()

curselection() даст индекс, по которому произошел щелчок мышью. И get(index) даст записи в списке этого номера индекса. мы должны использовать привязку «ListboxSelect», чтобы использовать эти методы для события щелчка мыши. дополнительные параметры находятся по этой ссылке: https://www.tutorialspoint.com/python/tk_listbox.htm

person Neo    schedule 04.04.2017