Windows10下Python实现Tkinter全屏Canvas图片自动置顶
解决Tkinter全屏图片窗口持续置顶问题
你的核心问题是Tkinter的mainloop()会阻塞后续代码执行,所以没法在循环里调用lift()维持窗口置顶。解决这个问题得用Tkinter内置的after()方法,在事件循环里定期执行置顶操作,不用跳出循环。
修改后的完整代码如下:
import pyautogui as pa import datetime import tkinter from PIL import Image, ImageTk def keep_topmost(window): # 持续将窗口置顶 window.lift() # 每隔1000毫秒(1秒)重复调用自身 window.after(1000, keep_topmost, window) def showPIL(pilImage): popup = tkinter.Tk() w, h = popup.winfo_screenwidth(), popup.winfo_screenheight() popup.attributes('-fullscreen', True) popup.geometry("%dx%d+0+0" % (w, h)) # 设置初始置顶属性 popup.attributes('-topmost', True) popup.focus_set() # 支持按Esc退出,修正退出逻辑 popup.bind("<Escape>", lambda e: popup.destroy()) canvas = tkinter.Canvas(popup, width=w, height=h, highlightthickness=0) canvas.pack() canvas.configure(background='black') imgWidth, imgHeight = pilImage.size if imgWidth != w or imgHeight != h: ratio = min(w/imgWidth, h/imgHeight) imgWidth = int(imgWidth*ratio) imgHeight = int(imgHeight*ratio) pilImage = pilImage.resize((imgWidth, imgHeight)) image = ImageTk.PhotoImage(pilImage) canvas.create_image(w/2, h/2, image=image) # 启动持续置顶任务 keep_topmost(popup) popup.mainloop() if __name__ == '__main__': # 鼠标移至角落不终止程序 pa.FAILSAFE = False pilImage = Image.open(r"C:\directory\to\your\image.png") pa.moveTo(pa.size().width, 1000) # 将鼠标移至屏幕侧边 # five_pm = datetime.time(hour=17, minute=0) # while datetime.datetime.now().time() < five_pm: showPIL(pilImage)
关键修改点说明:
- 新增
keep_topmost函数:负责调用window.lift()将窗口置顶,然后用after()安排1秒后再次调用自己,形成循环 - 初始设置
popup.attributes('-topmost', True):让窗口一开始就处于置顶状态 - 修正Esc退出逻辑:把原来的
exit()换成destroy(),确保窗口正常关闭 - 把置顶逻辑嵌入Tkinter事件循环:不用额外开线程或阻塞循环,完全适配Tkinter的运行机制
这样就能保证窗口每隔1秒自动置顶一次,不会被系统弹窗、更新提示等遮挡,适合无人值守的大厅展示场景。
内容的提问来源于stack exchange,提问作者javery
相关产品推荐
相关产品推荐

