Tkinter中类内创建Toplevel窗口时内容混入父窗口的解决方法
问题修复方案
你的问题出在CreatePostForm类中创建子组件时未指定父容器:当你创建self.title_container = tk.Frame()时,没有传入master参数,Tkinter会默认将根窗口作为它的父组件,导致输入框等内容显示在主窗口而非新创建的Toplevel窗口中。
修复步骤
只需要给CreatePostForm里的title_container指定父组件为self(也就是当前的CreatePostForm实例,它的父组件是你创建的newW Toplevel窗口):
修改CreatePostForm类中的这一行:
self.title_container = tk.Frame()
改为:
self.title_container = tk.Frame(self)
完整修复后的代码
from tkinter import * from tkinter import font import tkinter as tk NORMAL_PADDING = 3 class AllPages(tk.Frame): def __init__(self, master): super().__init__(master) self.pack() self.font = font.Font(family='JetBrains Mono', name='jbm', size=12, weight='normal') self.posts = [ { "title": "huhu" } ] self.posts_container = tk.Frame(self) # 补充指定父组件,避免同类问题 for post in self.posts: postf = tk.Frame(self.posts_container, bg="#ffffff", borderwidth=1, relief="solid") post_t = tk.Label(postf, text=post["title"], bg="#ffffff", borderwidth=0, font=self.font) post_edit = tk.Button(postf, text="Edit", bg="#ffffff", borderwidth=0, relief="solid", highlightbackground="#ffffff", highlightcolor="#ffffff", highlightthickness=1, font=self.font, command= lambda: self.modify_post_form(post)) post_t.pack(side="left") post_edit.pack(side="right") postf.pack(anchor=W, fill='x', pady=NORMAL_PADDING) self.posts_container.pack(fill='both', ipadx=NORMAL_PADDING, padx=NORMAL_PADDING) def modify_post_form(self, post): newW = Toplevel() app = CreatePostForm(newW, post) # 传入post参数,支持编辑时填充原标题 class CreatePostForm(tk.Frame): def __init__(self, master, post=None): super().__init__(master) self.pack() if not ("jbm" in font.names()): self.font = font.Font(family='JetBrains Mono', name='jbm', size=12, weight='normal') else: self.font = font.nametofont("jbm") self.label_width = 20 self.input_width = 40 # 修复核心:指定父组件为当前CreatePostForm实例 self.title_container = tk.Frame(self) self.title_label = tk.Label(self.title_container, text="Title:", font=self.font, width=self.label_width, anchor=W) self.title_input = tk.Entry(self.title_container, width=self.input_width, borderwidth=1, relief="solid", font=self.font) self.title_label.pack(side="left") self.title_input.pack(side="right") self.title_container.pack(anchor=W, pady=NORMAL_PADDING) self.title = tk.StringVar() # 若传入post,自动填充原标题 if post: self.title.set(post["title"]) self.title_input["textvariable"] = self.title root = tk.Tk() myapp = AllPages(root) myapp.pack() myapp.mainloop()
额外优化说明:
- 给
AllPages中的posts_container补充指定父组件self,避免潜在的组件归属问题 - 创建
CreatePostForm时传入post参数,实现编辑窗口自动填充原标题的功能,符合编辑场景的预期
内容的提问来源于stack exchange,提问作者resun
相关产品推荐
相关产品推荐

