Настройка
Я пишу программу, используя Python Tkinter , которая дает пользователю визуальное представление о складе, полном сельскохозяйственной продукции.
Склад состоит из штабелей ящиков, расположенных в виде сетки. Чтобы избежать путаницы со структурой данных, в этом контексте я называю стек спот , как в месте на складе.
Я организовал свой GUI так, чтобы отображалась сетка пятен, и когда пользователь нажимает на каждое пятно, отображается представление полей в нем.
Проблема
GUI имеет тенденцию к заморозить - примерно один раз из двадцати - когда щелкнет место в сетке. Насколько я могу судить, строка в коде, вызывающем зависание, - это когда .grid()
вызывается.
Хавинт рассмотрел несколько похожих вопросов на этом сайте, Я пытался использовать многопоточность , но это не помогло.
Код
Это один из классов более высокого уровня из полного кода, который состоит из нескольких сотен строк.
Я рад опубликовать больше кода, если это будет полезно.
class CS_Viewer:
def __init__(self, parent):
self.parent = parent
self.parent_window = self.parent.get_top()
self.code = self.parent.coldstore.code
self.parent.coldstore.reconstruct()
self.max_max_layers = self.parent.coldstore.get_max_max_layers()
self.layer = 0
self.top = Frame(self.parent_window)
self.top_title = Label(self.top, text="CSEye",
font=(main_font, title_pt, "bold"))
self.subtitle = Label(self.top, text="code="+self.code,
font=(main_font, subtitle_pt, "bold"))
self.main_container = Frame(self.top)
self.spot_grid = Spot_Grid(self, self.main_container)
self.box_details = Text(self.main_container,
height=details_height, width=details_width,
state=DISABLED)
self.spot_stack = Spot_Stack(self.main_container, None,
self.box_details)
self.add_headings()
self.arrange()
# Add headings to the holster widgets.
def add_headings(self):
spot_grid_label = Label(self.main_container, text="Coldstore",
font=(main_font, big_pt, "bold"))
spot_stack_label = Label(self.main_container, text="Spot",
font=(main_font, big_pt, "bold"),
width=spot_stack_width)
box_details_label = Label(self.main_container, text="Box",
font=(main_font, big_pt, "bold"))
spot_grid_label.grid(column=0, row=0)
spot_stack_label.grid(column=1, row=0)
box_details_label.grid(column=2, row=0)
# Ronseal.
def place_spot_stack(self):
self.spot_stack.get_top().grid(column=1, row=1,
padx=standard_pad, pady=standard_pad)
# ^^^ The problem seems to be here. ^^^
# Arrange the object's elements.
def arrange(self):
self.top_title.pack()
self.subtitle.pack()
self.spot_grid.get_top().grid(column=0, row=1, sticky=N,
padx=standard_pad, pady=standard_pad,
ipadx=inner_pad, ipady=inner_pad)
self.place_spot_stack()
self.box_details.grid(column=2, row=1, sticky=N,
padx=standard_pad, pady=standard_pad)
self.main_container.pack()
# Replace the spot stack widget.
def replace_spot_stack(self):
self.spot_stack.get_top().grid_forget()
Thread(target=self.place_spot_stack).start()
# Ronseal.
def get_top(self):
return self.top