Setting
I'm writing a program, using Python's Tkinter, which gives the user a visual representation of a warehouse full of agricultural produce.
The warehouse consists of stacks of boxes, arranged in a grid pattern. In order to avoid confusion with the data structure, I refer to a stack, in this context, as a spot, as in a spot on the warehouse floor.
I've arranged my GUI so that the grid of spots is displayed, and when the user clicks on each spot, a representation of the boxes therein is displayed.
The Problem
The GUI tends to freeze - about one time in twenty - when a spot on the grid is clicked. As far as I can tell, the line in the code causing the freezing is when .grid() is called.
Havint looked at a few similar questions on this site, I have tried using threading, but this hasn't helped.
The Code
This is one of the higher-level classes from the full code, which runs to a few hundred lines.
I'm happy to post more code if that's helpful.
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
