首页 > 解决方案 > Python Tkinter 如何调整 x,y 默认 0,0 坐标

问题描述

我一直在学习一些基本的 tkinter,并且遇到了简单的代码,可以将窗口居中放在显示器的中间,除非我运行它,它是水平关闭的。这很迂腐,但它让我很困扰。我使用的代码

# Imports
from tkinter import *

# tkinter Application
root = Tk()

#Root Geometry
root_Width = 600
root_Length = 600

# Coordinates of top left pixel of application for centred
x_left = int(root.winfo_screenwidth()/2-root_Width/2)
y_top = int(root.winfo_screenheight()/2-root_Length/2)
root_Pos = "+" + str(x_left) + "+" + str(y_top)

# Window size and position
root.geometry(str(root_Width) + "x" + str(root_Length) + root_Pos)

root.mainloop()

即使我是基本的,只是尝试在 0,0 处打开一个大小为我的显示器 (1920x1080) 的窗口,它水平错位了 8 像素。

from tkinter import *

root = Tk()
root.geometry("1920x1080+0+0")
root.mainloop()

我对结果进行了截图:
截屏
我设置了双显示器,所以我在右侧显示器开始的地方添加了一条红线。我不知道问题是什么或如何解决它。如果我将其更改为,

root.geometry("1920x1080+-8+0")

它会在它应该打开的地方打开,但我想通常最好解决这个问题。我希望 0,0 成为显示器的左上角像素。我承认问题可能与 python 无关,但任何建议都会有所帮助。

标签: pythontkinterpixelmultiple-monitors

解决方案


好的,您缺少两件事。首先,在您的第一个示例中,您需要确保 tkinter 获得正确的值,为此您必须update_idletasks()在 any 之前使用 method winfo

第二件事,它解释了为什么你必须使用-8将全屏窗口居中,是 tkinter 寡妇有外框。winfo_rootx()您可以通过检查窗口 ( ) 和外框 ( )的左上角坐标来确定此框架的大小winfo_x()。现在框架宽度是两者之间的差异:frame_width = root.winfo_rootx() - root.winfo_x()而实际窗口宽度是real_width = root.winfo_width() + (2*frame_width),因为您必须考虑两侧的框架。

总之,要使窗口水平居中,您可以:

width = root.winfo_width()
frame_width = root.winfo_rootx() - root.winfo_x()
real_width = root.winfo_width() + (2*frame_width)
x = root.winfo_screenwidth() // 2 - real_width // 2

(在这里你可以打印框架宽度,你会看到它是8

然后使用geometry方法将窗口放置在位置x

当然,你可以对垂直对齐做同样的事情


推荐阅读