辅助显示器上的Tkinter窗口未在缩放状态下填充屏幕

时间:2017-06-11 13:32:50

标签: python tkinter

我正在windows(10)上构建一个小的python 3 tkinter程序。从主窗口(根)我创建一个辅助窗口(wdowViewer)。我希望它在我的辅助显示器上全屏(缩放)。以下代码适用于我的主要设置,有两个相同的屏幕。但是,如果我将笔记本电脑从扩展坞中取出并将其连接到(任何)外接显示器,则新窗口仅填充大约2/3的辅助显示器。

有两点需要注意: - 笔记本电脑和外接显示器的分辨率相同。 - 当overrideredirect设置为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

1 个答案:

答案 0 :(得分:1)

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

请考虑以下示例:使用以下代码进行顶层放大,在任何辅助显示器上正常工作:

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命令后创建了一个新的Toplevel。然后,出现了问题。问题的代码示例:

from tkinter import *

# New Tkinter
root = Tk()
sw = str(root.winfo_screenwidth())

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

# Make button in main window
Button(root, text="Hello", command=new_wdow).pack()

root.mainloop()

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

修复:告诉Windows应用程序自行处理DPI扩展,并且不调整窗口大小。这可以使用ctypes实现。在python脚本中提前输入以下代码:

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

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