You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 11:01:01