gpt4 book ai didi

python - 如何在 Tkinter 的屏幕上将窗口居中?

转载 作者:IT老高 更新时间:2023-10-28 20:35:52 26 4
gpt4 key购买 nike

我正在尝试将 tkinter 窗口居中。我知道我可以通过编程方式获取窗口的大小和屏幕的大小,并使用它来设置几何图形,但我想知道是否有更简单的方法可以让窗口在屏幕上居中。

最佳答案

最简单(但可能不准确)的方法是使用 tk::PlaceWindow ,取 pathname作为参数的顶级窗口。主窗口的路径名是 .

import tkinter

root = tkinter.Tk()
root.eval('tk::PlaceWindow . center')

second_win = tkinter.Toplevel(root)
root.eval(f'tk::PlaceWindow {str(second_win)} center')

root.mainloop()

问题

简单的解决方案会忽略带有标题栏的最外层框架和 menu bar ,这会导致与真正居中的轻微偏移。

解决方案

import tkinter  # Python 3

def center(win):
"""
centers a tkinter window
:param win: the main window or Toplevel window to center
"""
win.update_idletasks()
width = win.winfo_width()
frm_width = win.winfo_rootx() - win.winfo_x()
win_width = width + 2 * frm_width
height = win.winfo_height()
titlebar_height = win.winfo_rooty() - win.winfo_y()
win_height = height + titlebar_height + frm_width
x = win.winfo_screenwidth() // 2 - win_width // 2
y = win.winfo_screenheight() // 2 - win_height // 2
win.geometry('{}x{}+{}+{}'.format(width, height, x, y))
win.deiconify()

if __name__ == '__main__':
root = tkinter.Tk()
root.attributes('-alpha', 0.0)
menubar = tkinter.Menu(root)
filemenu = tkinter.Menu(menubar, tearoff=0)
filemenu.add_command(label="Exit", command=root.destroy)
menubar.add_cascade(label="File", menu=filemenu)
root.config(menu=menubar)
frm = tkinter.Frame(root, bd=4, relief='raised')
frm.pack(fill='x')
lab = tkinter.Label(frm, text='Hello World!', bd=4, relief='sunken')
lab.pack(ipadx=4, padx=4, ipady=4, pady=4, fill='both')
center(root)
root.attributes('-alpha', 1.0)
root.mainloop()

使用 tkinter 你总是想调用 update_idletasks()方法
直接在检索任何几何之前,以确保返回的值是准确的。

有四种方法可以让我们确定外框的尺寸。
winfo_rootx() 将为我们提供窗口左上角的 x 坐标,不包括外框。
winfo_x() 将为我们提供外框左上角的 x 坐标。
它们的区别在于外框的宽度。

frm_width = win.winfo_rootx() - win.winfo_x()
win_width = win.winfo_width() + (2*frm_width)

winfo_rooty()winfo_y() 的区别在于标题栏/菜单栏的高度。

titlebar_height = win.winfo_rooty() - win.winfo_y()
win_height = win.winfo_height() + (titlebar_height + frm_width)

您使用 geometry method 设置窗口的尺寸和位置.上半年geometry string是窗口的宽度和高度不包括外框,
后半部分是外框左上角的x和y坐标。

win.geometry(f'{width}x{height}+{x}+{y}')

你看到窗口移动了

防止看到窗口在屏幕上移动的一种方法是使用 .attributes('-alpha', 0.0)使窗口完全透明,然后在窗口居中后将其设置为 1.0。为此,在 Windows 7 上使用 withdraw()iconify() 后跟 deiconify() 似乎效果不佳. 我使用 deiconify() 作为激活窗口的技巧。


使其可选

您可能需要考虑为用户提供使窗口居中的选项,而不是默认居中;否则,您的代码可能会干扰窗口管理器的功能。例如,xfwm4 具有智能放置功能,可以将窗口并排放置,直到满屏为止。也可以将其设置为所有窗口居中,在这种情况下,您不会遇到看到窗口移动的问题(如上所述)。


多台显示器

如果您关心多显示器方案,那么您可以查看 screeninfo项目,或者看看你能用 Qt (PySide6) 完成什么或 GTK (PyGObject) ,然后使用其中一个工具包而不是 tkinter。组合 GUI 工具包会导致过度依赖。

关于python - 如何在 Tkinter 的屏幕上将窗口居中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3352918/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com