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

Tkinter点击GUI窗口按钮打开Information窗口的实现方法咨询

实现Tkinter主窗口点击按钮打开Information子窗口的方案

核心修正逻辑

Tkinter程序全局仅允许存在1个Tk()主实例和1个mainloop()事件循环,你的错误原因是在Information窗口中又实例化了新的Tk()对象,子窗口必须使用Toplevel组件创建。

具体实现步骤

1. 封装Information窗口为可调用函数

你可以直接将以下函数添加到你的GUI窗口代码文件中,替换原来单独的Information窗口文件逻辑:

def open_information_window(parent):
    # 用Toplevel创建子窗口,不要用Tk()
    info_win = Toplevel(parent)
    info_win.title("Information")
    info_win.geometry("700x400")
    info_win.configure(bg = "#ffffff")
    # 禁止修改窗口大小
    info_win.resizable(False, False)
    
    canvas = Canvas(
        info_win,
        bg = "#ffffff",
        height = 400,
        width = 700,
        bd = 0,
        highlightthickness = 0,
        relief = "ridge")
    canvas.place(x = 0, y = 0)
    
    background_img = PhotoImage(file = "background_1.png")
    # 把图片对象绑定到子窗口实例上,避免被垃圾回收导致图片不显示
    info_win.background_img = background_img
    background = canvas.create_image(
        350.0, 188.0,
        image=background_img
    )

2. 在GUI窗口中添加触发按钮

在你的GUI代码末尾(window.mainloop()之前)添加打开按钮的定义,绑定点击事件调用上面的函数即可:

# 添加打开Information窗口的按钮
info_btn = Button(
    window,
    text="打开信息窗口",
    # 点击触发函数,传入主窗口作为父参数
    command=lambda: open_information_window(window)
)
# 你可以调整按钮的位置和样式,这里为示例位置
info_btn.place(x=50, y=50, width=120, height=30)

# 原来的GUI代码最后要加上主事件循环,你之前的代码漏了这行
window.mainloop()

可选优化:避免重复打开窗口

如果需要防止用户重复点击按钮打开多个信息窗口,可以加个状态判断:

# 全局变量记录子窗口状态
info_win_opened = False
def open_information_window(parent):
    global info_win_opened
    if info_win_opened:
        return
    info_win_opened = True
    info_win = Toplevel(parent)
    # 绑定窗口关闭事件,重置状态
    def on_close():
        global info_win_opened
        info_win_opened = False
        info_win.destroy()
    info_win.protocol("WM_DELETE_WINDOW", on_close)
    # 剩下的窗口渲染逻辑和上文一致

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 13:45:03