Нитка не замерзает Ткинтер - PullRequest
0 голосов
/ 10 февраля 2020

Настройка

Я пишу программу, используя 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
...