如何通过Tkinter创建适配屏幕尺寸的窗口(无需手动输入分辨率)
问题解决:Tkinter透明窗口使用屏幕分辨率变量时不显示
问题说明
尝试制作一个显示在Ren'Py窗口外的透明窗口(理想支持动画图),但遇到以下问题:
- 硬编码分辨率(如
"1536x864")时窗口正常显示 - 使用通过变量获取的玩家屏幕分辨率时,窗口完全不出现
原代码:
import tkinter as tk from tkinter import * window = tk.Tk() scr_width = window.winfo_width() scr_height = window.winfo_height() screen_resolution = str(scr_width)+"x"+str(scr_height) window.overrideredirect(True) # hides the taskbar window.geometry("1536x864") # only this works, but I need it to use the player's screen resolution # window.geometry(screen_resolution) # window just doesn't appear! # window.geometry("{}x{}".format(scr_width, scr_height)) # window doesn't appear as well window.overrideredirect(True) # hides the taskbar window.after(5000, lambda: window.destroy()) # closes the window after 10 seconds transparent_color = '#abcdef' window.wm_attributes('-transparentcolor', transparent_color) img = PhotoImage(file="my_path/my_img.png") canvas = Label(window, image=img, relief="solid", width= 20, height= 8, anchor= CENTER, bg=transparent_color) canvas.pack(fill=BOTH, expand=1) window.mainloop()
问题原因
- 错误获取分辨率:刚创建
Tk()窗口时,窗口还未完成渲染,调用winfo_width()和winfo_height()得到的是初始极小尺寸(通常为1x1),用这个值设置窗口几何属性后,窗口小到无法察觉。 - 重复调用
overrideredirect(True):该语句重复执行无意义,且可能干扰窗口初始化流程。 - Label尺寸限制:手动设置了Label的
width=20和height=8,会限制图片显示范围,即使窗口全屏也无法铺满。
修复后的代码
import tkinter as tk from tkinter import * # 获取屏幕真实分辨率,而非窗口尺寸 window = tk.Tk() scr_width = window.winfo_screenwidth() scr_height = window.winfo_screenheight() # 隐藏窗口边框与任务栏 window.overrideredirect(True) # 设置窗口为屏幕全屏尺寸,+0+0确保从左上角开始显示 window.geometry(f"{scr_width}x{scr_height}+0+0") # 5秒后自动关闭窗口 window.after(5000, window.destroy) # 设置透明色 transparent_color = '#abcdef' window.wm_attributes('-transparentcolor', transparent_color) # 加载图片(若需支持动画GIF,需额外使用PIL库) img = PhotoImage(file="my_path/my_img.png") # 创建Label时不手动限制宽高,让它随窗口铺满 canvas = Label(window, image=img, bg=transparent_color) canvas.pack(fill=BOTH, expand=1) # 保持图片引用,防止被垃圾回收机制销毁 canvas.image = img window.mainloop()
额外说明
- 若要支持动画GIF,需安装
Pillow库,使用ImageTk.PhotoImage和Image.open加载,并通过定时器循环更新帧实现动画效果。 geometry参数中的+0+0确保窗口从屏幕左上角起始,避免出现偏移。- 添加
canvas.image = img是为了防止Tkinter的垃圾回收机制自动销毁图片对象,导致窗口中图片消失。
内容的提问来源于stack exchange,提问作者Ersi
相关产品推荐
相关产品推荐

