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
相关产品推荐
相关产品推荐

