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

Python3.10 Tkinter程序:背景图、全屏及窗口切换问题求助

Python Tkinter 程序问题修复指南

问题描述

我用Python 3.10 + Tkinter写了一个多窗口交互程序,点击按钮能弹出新窗口,Toplevel窗口的按钮也能打开新窗口,但遇到三个问题:

  • 所有窗口都加不上背景图
  • 无法设置窗口全屏
  • 点击按钮触发AttributeError: 'function' object has no attribute 'withdraw'错误,且主窗口文本消失

原程序代码

from tkinter import * #导入窗口库
from tkinter.ttk import * #导入扩展窗口库

master = Tk()#创建主窗口对象
master.geometry("1920x1080")#设置窗口尺寸
master.title("窗口")#设置窗口标题\

bg=PhotoImage("C:/Users/User/AppData/Local/Programs/Python/Python310/draw.jpg") 


def openNewWindow():#定义打开新窗口的函数
        newWindow = Toplevel(master)##创建新窗口对象
        newWindow.title("第二个窗口")#设置新窗口标题
        newWindow.geometry('1920x1080')#设置新窗口尺寸
        Label(newWindow, #开始创建新窗口标题问题
            text ="问题 №2").pack()# 结束创建新窗口标题问题

        btn = Button(newWindow,#开始创建新窗口按钮
                         text ="是",#按钮文本
                         command = openNewWindow)#按钮触发函数
        btn.pack(pady = 10)#设置按钮边距
        btn = Button(newWindow,##开始创建新窗口第二个按钮
                         text ="否",#按钮文本
                         command = openNewWindow1)#按钮触发函数
        btn.pack(pady = 10)#设置按钮边距
        master.withdraw()
        openNewWindow1.withdraw()

def openNewWindow1():##定义打开第二个新窗口的函数
        newWindow1 = Toplevel(master)###创建新窗口对象
        newWindow1.title("第三个窗口")##设置新窗口标题
        newWindow1.geometry('1920x1080')##设置新窗口尺寸
        Label(newWindow1, ##开始创建新窗口标题问题
            text ="问题 №3").pack()## 结束创建新窗口标题问题

        btn = Button(newWindow1,##开始创建新窗口按钮
                         text ="是",##按钮文本
                         command = openNewWindow)##按钮触发函数
        btn.pack(pady = 10)##设置按钮边距
        btn = Button(newWindow1,###开始创建新窗口第二个按钮
                         text ="否",##按钮文本
                         command = openNewWindow2)##按钮触发函数
        btn.pack(pady = 10)##设置按钮边距
        master.withdraw()
        openNewWindow.withdraw()

def openNewWindow2():##定义打开第三个新窗口的函数
        newWindow2 = Toplevel(master)###创建第三个新窗口对象
        newWindow2.title("第三个窗口")##设置新窗口标题
        newWindow2.geometry('1920x1080')##设置新窗口尺寸
        Label(newWindow2, ##开始创建新窗口标题问题
            text ="问题 №4").pack()## 结束创建新窗口标题问题

        btn = Button(newWindow2,##开始创建新窗口按钮
                         text ="是",##按钮文本
                         command = openNewWindow)##按钮触发函数
        btn.pack(pady = 10)##设置按钮边距
        btn = Button(newWindow2,###开始创建新窗口第二个按钮
                         text ="否",##按钮文本
                         command = openNewWindow1)##按钮触发函数
        btn.pack(pady = 10)##设置按钮边距
        master.withdraw()
        openNewWindow.withdraw()




background = PhotoImage()
label = Label(master, image=bg, #开始创建主窗口问题
              text ="问题 №1")##主窗口问题文本
label.place(x=0, y=0)
label.pack(pady = 10)##设置主窗口元素边距


btn = Button(master, ##开始创建主窗口按钮
                text ="是", ##按钮文本
                command = openNewWindow)##按钮触发函数
btn.pack(pady = 10)##设置按钮边距

btn = Button(master, ##开始创建主窗口按钮
                text ="否", ##按钮文本
                command = openNewWindow1)##按钮触发函数
btn.pack(pady = 10)##设置按钮边距




btn.pack(pady = 10)#
mainloop()#结束主循环并启动程序

报错信息

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 27, in openNewWindow
    openNewWindow1.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 27, in openNewWindow
    openNewWindow1.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 45, in openNewWindow1
    openNewWindow.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 63, in openNewWindow2
    openNewWindow.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'
Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Users\User\AppData\Local\Programs\Python\Python310\lib\tkinter\__init__.py", line 1921, in __call__
    return self.func(*args)
  File "C:/Users/User/AppData/Local/Programs/Python/Python310/sffsfsf.py", line 45, in openNewWindow1
    openNewWindow.withdraw()
AttributeError: 'function' object has no attribute 'withdraw'

问题修复方案

1. 解决AttributeError与文本消失问题

  • 错误原因:withdraw()是Tkinter窗口对象的方法,你错误地调用了函数对象(比如openNewWindow1)的该方法;主窗口同时使用place()和pack()两种布局方法,导致控件布局冲突,文本被覆盖。
  • 修复步骤:
    • 删除所有openNewWindow.withdraw()、openNewWindow1.withdraw()这类错误代码;如果需要隐藏其他窗口,需保存对应窗口对象的引用。
    • 主窗口中仅使用一种布局方法,比如将背景标签的place()和pack()合并,改用place()铺满窗口,其他控件放在背景标签上或者用pack()布局。

2. 为所有窗口添加背景图

  • 注意事项:
    • 加载图片必须指定file参数:PhotoImage(file="图片路径")
    • 必须保留图片对象的引用,防止被Python垃圾回收销毁
    • 每个窗口都需要创建独立的背景标签,将其他控件置于背景标签上方
  • 实现方式:可以写一个通用函数,用于创建带背景的窗口。

3. 设置窗口全屏

  • 两种可选方式:
    • 隐藏任务栏的全屏:window.attributes('-fullscreen', True),按Esc可退出
    • 最大化窗口(保留任务栏):window.state('zoomed')

修正后的完整代码

from tkinter import *
from tkinter.ttk import *

# 全局保存图片引用,防止被回收
bg_image = PhotoImage(file="C:/Users/User/AppData/Local/Programs/Python/Python310/draw.jpg")

def create_window(parent, title, question_text):
    # 创建新窗口并设置全屏
    new_window = Toplevel(parent)
    new_window.title(title)
    # 可选:隐藏任务栏全屏
    # new_window.attributes('-fullscreen', True)
    # 可选:最大化窗口(保留任务栏)
    new_window.state('zoomed')

    # 添加背景图
    bg_label = Label(new_window, image=bg_image)
    bg_label.place(x=0, y=0, relwidth=1, relheight=1)

    # 添加问题文本
    question_label = Label(new_window, text=question_text)
    question_label.pack(pady=20)

    # 添加按钮
    btn_yes = Button(new_window, text="是", command=lambda: create_window(new_window, "新窗口", "问题 №X"))
    btn_yes.pack(pady=10)
    btn_no = Button(new_window, text="否", command=lambda: create_window(new_window, "新窗口", "问题 №Y"))
    btn_no.pack(pady=10)

    # 隐藏父窗口(可选)
    parent.withdraw()

# 初始化主窗口
master = Tk()
master.title("主窗口")
master.state('zoomed')

# 主窗口背景
bg_label_master = Label(master, image=bg_image)
bg_label_master.place(x=0, y=0, relwidth=1, relheight=1)

# 主窗口问题文本
question_master = Label(master, text="问题 №1")
question_master.pack(pady=20)

# 主窗口按钮
btn_yes_master = Button(master, text="是", command=lambda: create_window(master, "第二个窗口", "问题 №2"))
btn_yes_master.pack(pady=10)
btn_no_master = Button(master, text="否", command=lambda: create_window(master, "第三个窗口", "问题 №3"))
btn_no_master.pack(pady=10)

mainloop()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:52:04