I've tried to simplify and scale down this as much as I can to only include my problem and this was the best I could do.
When executing wins.py
, I create a instance of the Window
class which then calls Window
's create_pages
method which creates pages acorrding to how many Segment
's are present. In create_pages
there is a for loop which hides all of the Segment
's. When that is ran Hide
prints to the output from the hide
method in the Segment
even though the frame is still visible on screen. I get no error only until I close the application is when I get the error:
Traceback (most recent call last):
File "d:\vsc\test\wins.py", line 7, in <module>
windows["main"] = Window(
^^^^^^^
File "d:\vsc\test\elems\window.py", line 12, in __init__
self.set(segments)
File "d:\vsc\test\elems\window.py", line 17, in set
self.pages: list[Page] = self.create_pages(segments)
^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "d:\vsc\test\elems\window.py", line 31, in create_pages
seg.hide()
File "d:\vsc\test\elems\segment.py", line 14, in hide
self.frm.pack_forget()
File "C:\Users\nmgru\AppData\Local\Programs\Python\Python312\Lib\tkinter\__init__.py", line 2491, in pack_forget
self.tk.call('pack', 'forget', self._w)
_tkinter.TclError: can't invoke "pack" command: application has been destroyed
File structure:
.
└── test/
├── gui.py
├── wins.py
└── elems/
├── page.py
├── segment.py
└── window.py
Code:
#gui.py
from tkinter import *
root: Tk = Tk()
root.geometry("640x480")
#wins.py
from elems.window import Window
from elems.segment import Segment
from gui import root
windows: dict[str, Window] = {}
windows["main"] = Window(
(Segment(root),
)
)
root.mainloop()
#window.py
from tkinter import *
from elems.page import Page
from elems.segment import Segment
MAX_SEGMENTS_PAGE: int = 8
class Window:
def __init__(self, segments: list[Segment] | None = None) -> None:
self.enabled: bool = False
self.page_index: int = 0
if segments != None:
self.set(segments)
def set(self, segments: list[Segment], back=False) -> None:
self.pages: list[Page] = self.create_pages(segments)
def disable(self) -> None:
print("Disable win")
try:
for page in self.pages:
page.hide()
except AttributeError:
return
self.enabled = False
def create_pages(self, segments: list[Segment]) -> None:
pages: list[Page] = [Page(segments[i:i + MAX_SEGMENTS_PAGE], self) for i in range(0, len(segments), MAX_SEGMENTS_PAGE)]
for seg in segments:
seg.hide()
return pages
#page.py
from tkinter import *
from elems.segment import Segment
import elems.window
class Page:
def __init__(self, segments: list[Segment], window):
self.segments: list[Segment] = segments
self.window: elems.window.Window = window
def hide(self) -> None:
print("disable Page")
for seg in self.segments:
seg.hide()
#segment.py
from tkinter import *
from collections.abc import Callable
class Segment:
def __init__(self, root: Tk):
self.frm: Frame = Frame(root, bg="red", height=60)
self.frm.pack(fill=X)
self.frm.pack_propagate(False)
self.root = root
def hide(self) -> None:
print("Hide")
self.frm.pack_forget()
def show(self) -> None:
self.frm.pack(fill=X)
Sorry if this post is cluttered I tried to strip down my problem as much as possible.