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

使用类在Tkinter中创建子窗口时出现重复窗口的问题

Tkinter创建子窗口时出现双窗口问题的解决方法

问题原因

你的代码中ChildWindow继承了Window类,而Window的__init__方法会创建一个新的Tk()主窗口实例。在ChildWindow的初始化过程中,你先创建了Toplevel子窗口,随后又调用Window.__init__(self, title, geometry, icon),这就额外触发了一个Tk()实例的创建,最终导致两个窗口出现。

解决方案

ChildWindow不需要继承Window,因为它是依附于主窗口的子窗口,无需创建新的主窗口实例。重构代码如下:

from tkinter import Tk, Toplevel

class Window:
    def __init__(self, title, geometry, icon='default.ico'):
        self.root = Tk()
        self.root.title(title)
        self.root.geometry(geometry)
        self.root.iconbitmap(icon)

    def run(self):
        self.root.mainloop()

    def child_window(self, title, geometry, icon='default.ico'):
        ChildWindow(self.root, title, geometry, icon)


class ChildWindow:
    def __init__(self, parent, title, geometry, icon):
        self.child = Toplevel(parent)
        self.child.title(title)
        self.child.geometry(geometry)
        self.child.iconbitmap(icon)


x = Window('Window', '600x800')
x.child_window('Child window', '200x300')
x.run()

关键修正点

  • 移除ChildWindow对Window的继承,避免重复创建Tk()主窗口
  • 直接在ChildWindow的初始化方法中配置Toplevel对象的属性,无需依赖父类的初始化逻辑
  • 子窗口不需要单独的run方法,主窗口的mainloop会统一管理所有窗口的事件循环

内容的提问来源于stack exchange,提问作者Uvelka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 22:25:34