Tkinter window not filling screen in zoom state in secondary display(辅助显示器上的放大状态下的窗口未填充屏幕)

2024-10-03 06:29:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在windows(10)上构建一个小python3tkinter程序。从主窗口(根)创建一个辅助窗口(wdowViewer)。我希望它是全屏(缩放)在我的辅助显示器。下面的代码适用于我的主设置,有两个相同的屏幕。但是,如果我把我的笔记本电脑从基座上拿出来连接到(任何)外部显示器上,新窗口只占辅助显示器的2/3。在

有两点需要注意: -笔记本电脑和外部显示器的分辨率相同。 -当OverrideDirect设置为0时,将适当缩放窗口。在

mon_primary_width = str(app.root.winfo_screenwidth()) # width of primary screen

self.wdowViewer = Toplevel(app.root) # create new window
self.wdowViewer.geometry('10x10+' + mon_primary_width + '+0') # move it to the secondary screen
self.wdowViewer.wm_state('zoomed') # full screen
self.wdowViewer.overrideredirect(1) # remove tool bar
app.root.update_idletasks()  # Apply changes

Tags: 代码self程序appwindowsrootwidthscreen
1条回答
网友
1楼 · 发布于 2024-10-03 06:29:17

经过两天的试验,我终于找到了解决办法。在

考虑以下示例:使用以下代码时,使顶层缩放在任何辅助显示上都可以正常工作:

from tkinter import *    

# Make tkinter window
root = Tk()
sw = str(root.winfo_screenwidth())
Label(root, text="Hello Main Display").pack()

# Make a new toplevel
w = Toplevel(root)
w.geometry("0x0+" + sw + "+0")
w.state('zoomed')
w.overrideredirect(1)
Label(w, text='Hello Secondary Display').pack()

root.mainloop()

但是,在我的代码中,我在运行mainloop命令后创建了一个新的顶层。然后,问题就出现了。有问题的代码示例:

^{pr2}$

问题:只有当Windows中的DPI缩放比例未设置为100%时,才会出现错误。因此,在运行mainloop之后,tkinter如何处理DPI缩放似乎有一个bug。它不能正确缩放窗口,但Windows正在将其视为确实缩放。在

修复:告诉Windows应用程序自行处理DPI缩放,并且不要调整窗口大小。使用ctypes可以实现这一点。在python脚本的早期,将以下代码放入:

import ctypes
ctypes.windll.shcore.SetProcessDpiAwareness(2)

希望其他人会发现这个解决方案有帮助。希望有人能解释更多这里发生的事情!在

相关问题 更多 >