python - 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 无关,但任何建议都会有所帮助。
解决方案
好的,您缺少两件事。首先,在您的第一个示例中,您需要确保 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
。
当然,你可以对垂直对齐做同样的事情
推荐阅读
- python - 有没有办法从单元格中创建新列并让它们的值来自另一列
- packer - Hashicorp Packer:将变量/本地字符串值输出到文件的方法
- php - 如何隐藏 .php 模板和配置文件?
- swift - -[SKEmitterNode scaleMode]:无法识别的选择器发送到实例 0x6000007b9a40
- flutter - 过滤搜索中的 Flutter App 显示列表
- python - 使用 Python SQLAlchemy ORM 限制对某些字段的急切加载
- sql - SQL 迭代 // 带有条件的递归 cte(从前几行中减去)
- c# - iTextSharp 用另一个 PDF 替换图像
- ios - 如何在同一订阅组中使用 Apple In-App Purchase 对订阅计划进行排名?
- java - 如何使用 Apache Jena 的查询构建器向 SelectBuilder 添加 SERVICE 子句?