【问题标题】:Tkinter window not filling screen in zoomed state on secondary displayTkinter 窗口未在辅助显示器上以缩放状态填充屏幕
【发布时间】:2017-11-13 01:02:45
【问题描述】:

我正在 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

【问题讨论】:

    标签: python tkinter


    【解决方案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)
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-04
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 2013-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多