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

如何通过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()

问题原因

  1. 错误获取分辨率:刚创建Tk()窗口时,窗口还未完成渲染,调用winfo_width()和winfo_height()得到的是初始极小尺寸(通常为1x1),用这个值设置窗口几何属性后,窗口小到无法察觉。
  2. 重复调用overrideredirect(True):该语句重复执行无意义,且可能干扰窗口初始化流程。
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 07:05:09