最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Tkinter Python error after application is closed with .pack_forget - Stack Overflow

programmeradmin2浏览0评论

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.

发布评论

评论列表(0)

  1. 暂无评论