Advertisement
Xonoa

Odd behavior with tkinter frames

Jun 1st, 2023 (edited)
1,095
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.80 KB | None | 0 0
  1. import tkinter as tk
  2.  
  3. class GridButtonsBase(tk.Frame):
  4.     def __init__(self, parent=None, **kwargs):
  5.         super().__init__(parent)
  6.         self.reset_containers()
  7.         self.draw()
  8.         tk.Button(self, command=self.mutate_borders).grid(row=1, column=1, padx=10, pady=10, sticky='news')
  9.    
  10.     def reset_containers(self):
  11.         self.borders = []
  12.         for _ in range(3 * 3):
  13.             self.borders.append(tk.Frame(self))
  14.         self.border_map:list[list[int, int, int, int]] = [] #row, col, columnspan, rowspan
  15.    
  16.     def draw(self):
  17.         self.border_map = [[0, 0, 3, 1], [1, 0, 3, 1], [2, 0, 3, 1], [0, 0, 1, 3], [0, 1, 1, 3], [0, 2, 1, 3]]
  18.         for row in range(3):
  19.             self.rowconfigure(row, minsize=100)
  20.         for col in range(3):
  21.             self.columnconfigure(col, minsize=100)
  22.         self.draw_borders()
  23.    
  24.     def draw_borders(self):
  25.         for index, entry in enumerate(self.border_map):
  26.             if entry is None: continue
  27.             row, col, colspan, rowspan = entry
  28.             self.borders[index] = tk.Frame(self, bg='green')
  29.             self.borders[index].grid(row=row, column=col, rowspan=rowspan, columnspan=colspan, padx=3, pady=3, sticky='news')
  30.    
  31.     def mutate_borders(self):
  32.         self.mutate_border_map()
  33.         for border in self.borders:
  34.             border.grid_forget()
  35.         for index, entry in enumerate(self.border_map):
  36.             row, col, colspan, rowspan = entry
  37.             self.borders[index].config(bg='red')
  38.             self.borders[index].grid(row=row, column=col, rowspan=rowspan, columnspan=colspan, padx=3, pady=3, sticky='news')
  39.             print(f'frame info: pos: ({self.borders[index].grid_info()["row"]}, {self.borders[index].grid_info()["column"]}); rowspan: {self.borders[index].grid_info()["rowspan"]}, columnspan: {self.borders[index].grid_info()["columnspan"]}')
  40.            
  41.     def mutate_border_map(self):
  42.         cluttered_border_map = [[0, 0, 3, 1], [1, 0, 3, 1], [2, 0, 1, 1], [2, 1, 2, 1],[0, 0, 1, 2], [2, 0, 1, 1], [0, 1, 1, 3], [0, 2, 1, 3]]
  43.         if True: # change to false to change behavior
  44.             self.border_map = []
  45.             for elem in cluttered_border_map:
  46.                 if elem not in self.border_map:
  47.                     self.border_map.append(elem)
  48.         else:
  49.             self.border_map = cluttered_border_map
  50.         print(self.border_map)
  51.    
  52.     def clear_view(self):
  53.         for border in self.borders:
  54.             if border is None: continue
  55.             border.grid_forget()
  56.  
  57. class Temp(tk.Frame):
  58.     def __init__(self, parent=None):
  59.         super().__init__(parent)
  60.         self.parent = parent
  61.         self.gb_config: GridButtonsBase = GridButtonsBase(self)
  62.         self.gb_config.pack()
  63.  
  64.  
  65. root = tk.Tk()
  66. Temp(parent=root).pack()
  67. root.mainloop()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement