窗口居中。

#!/usr/bin/python3
# -*- coding: utf-8 -*-

"""
ZetCode PyQt5 tutorial 

This program centers a window 
on the screen. 

Author: Jan Bodnar
Website: zetcode.com 
Last edited: August 2017
"""

import sys
from PyQt5.QtWidgets import QWidget, QDesktopWidget, QApplication


class Example(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):               

        self.resize(250, 150)
        self.center()

        self.setWindowTitle('Center')    
        self.show()


    def center(self):

        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())


if __name__ == '__main__':

    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

QtGui.QDesktopWidget 提供了用户的桌面信息,包括屏幕的大小。

text

self.center()

这个方法是调用我们下面写的,实现对话框居中的方法。

text

qr = self.frameGeometry()

获得主窗口所在的框架。

text

cp = QDesktopWidget().availableGeometry().center()

获取显示器的分辨率,然后得到屏幕中间点的位置。

text

qr.moveCenter(cp)

然后把主窗口框架的中心点放置到屏幕的中心位置。

text

self.move(qr.topLeft())

然后通过 move 函数把主窗口的左上角移动到其框架的左上角,这样就把窗口居中了。

程序预览:

center

 

 内容来自Miacss'website

<think>好的,用户想实现Tkinter窗口在屏幕上居中显示。我之前有相关的引用内容,特别是引用3提到了center_window函数,应该可以用上。首先,我需要回忆一下Tkinter的基本用法,比如如何创建窗口、设置大小等。用户可能需要具体的代码示例,所以得一步步来。 首先,Tkinter的窗口创建是通过Tk()来实例化的。然后,窗口居中需要计算屏幕的尺寸和窗口的尺寸。根据引用3,winfo_screenwidth和winfo_screenheight可以获取屏幕的宽高,而winfo_reqwidth和winfo_reqheight可以获取窗口的宽高。不过,这里需要注意的是,在窗口显示之前,winfo_reqwidth可能无法正确获取,可能需要先调用update()方法,或者使用geometry来设置窗口的大小。或者用户可能已经设置了窗口的大小,比如使用geometry("400x300"),这样可以直接计算。 然后,居中位置的公式是(screen_width - window_width)/2和(screen_height - window_height)/2。然后将这些值应用到geometry方法中,格式为"{width}x{height}+{x}+{y}"。比如geometry(f"{window_width}x{window_height}+{x}+{y}")。 另外,引用1提到,在设置窗口位置之前,可以先隐藏窗口,设置好位置后再显示,这样可以避免窗口在左上角闪现。所以代码中可能需要在初始化窗口后调用withdraw(),计算完位置并设置geometry后,再调用deiconify()显示窗口。 综合这些步骤,应该可以写出一个让窗口居中的函数。现在需要将这些步骤整合到代码中,给出一个完整的示例。比如: 1. 导入tkinter模块。 2. 创建主窗口。 3. 定义居中函数,调用screen和window的尺寸计算。 4. 在显示窗口前隐藏它,设置位置后再显示。 5. 最后启动主循环。 同时,要考虑到用户可能没有设置窗口大小,是否需要先设定窗口的尺寸?比如在创建窗口后使用geometry设置初始大小,或者在窗口内容布局后再更新。可能需要建议用户先确定窗口的大小,或者使用update_idletasks来强制更新窗口尺寸信息。 另外,是否需要处理窗口内容变化后的重新居中?比如窗口大小调整后是否自动居中,但用户的问题可能只是初始居中,所以不需要处理后续变化。 现在根据这些思考,编写示例代码: 首先,导入tkinter,创建主窗口,然后定义center_window函数,里面获取屏幕尺寸和窗口尺寸,计算位置,设置geometry。然后调用withdraw和deiconify避免闪烁。或者,是否需要先让窗口更新自己的尺寸信息?比如在调用center_window之前,可能需要先布局组件,或者调用update_idletasks(),这样窗口才能正确计算所需的尺寸。否则,在窗口未布局任何组件的情况下,winfo_reqwidth可能返回1,导致计算错误。 例如,用户可能在创建窗口后直接调用center_window,此时窗口还没有内容,所以尺寸可能不对。因此,建议在窗口布局完组件后,再调用center_window。或者在调用center_window之前,先让窗口更新其尺寸信息,比如使用window.update_idletasks()。 所以,在示例代码中,可能需要先添加一些组件,或者设置窗口的geometry,或者在调用center_window之前先更新。比如: root = tk.Tk() root.title("居中窗口") root.geometry("400x300") # 设置初始大小 center_window(root) 然后在center_window函数中,使用geometry设置位置。或者在center_window中先获取窗口的请求宽度和高度,这可能需要窗口已经布局了组件,或者已经设置了初始大小。 综上,正确的步骤应该是: 1. 创建窗口。 2. 设置窗口的初始大小(可选,但建议)。 3. 调用update_idletasks()让窗口计算尺寸。 4. 获取窗口的reqwidth和reqheight。 5. 计算位置。 6. 设置geometry。 7. 隐藏窗口,设置位置,再显示,避免闪烁。 所以,代码示例可能如下: import tkinter as tk def center_window(window): window.update_idletasks() # 确保窗口尺寸正确计算 width = window.winfo_reqwidth() height = window.winfo_reqheight() screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() x = (screen_width - width) // 2 y = (screen_height - height) // 2 window.geometry(f"{width}x{height}+{x}+{y}") root = tk.Tk() root.title("居中窗口") root.geometry("400x300") # 设置初始大小 root.withdraw() # 先隐藏窗口 center_window(root) root.deiconify() # 显示窗口 # 添加其他组件... root.mainloop() 但需要注意,如果用户没有设置窗口的初始大小,可能需要先让窗口布局一些组件,否则reqwidth和reqheight可能很小,导致窗口显示很小。所以,建议用户在调用居中函数之前设置窗口的大小,或者布局组件后调用update_idletasks()。 或者,在center_window中使用winfo_width和winfo_height,但可能在没有update的情况下,这些值可能为0,所以最好先调用update_idletasks()。 此外,如果用户不需要设置窗口的初始大小,而是让窗口根据内容自动调整,那么应该让窗口先布局组件,然后调用update_idletasks(),再计算尺寸。 比如: root = tk.Tk() root.title("居中窗口") # 添加一些组件,比如标签、按钮等 label = tk.Label(root, text="居中窗口示例") label.pack(padx=20, pady=20) root.withdraw() root.update_idletasks() # 更新布局,确保窗口尺寸正确 center_window(root) root.deiconify() 这样,窗口会根据内容调整大小,然后居中显示。 综上,示例代码可能需要包括这些步骤,并且提醒用户注意先布局组件或设置窗口大小,以确保正确计算尺寸。 现在,根据引用3中的函数,可以编写类似的代码,并结合隐藏和显示窗口的步骤避免闪烁。然后,在回答中给出完整的示例,并解释每一步的作用。此外,还要根据用户提供的引用,正确添加引用标识,比如引用1和引用3的相关内容。 最后,生成相关问题,比如如何动态调整窗口位置、如何处理多显示器情况、如何让窗口始终居中等等。这些问题需要与窗口居中和Tkinter相关,以帮助用户进一步学习。</think>要让 Tkinter 窗口在屏幕上居中显示,可以通过计算屏幕尺寸和窗口尺寸来实现。以下是具体实现步骤和示例代码: --- ### 实现步骤 1. **隐藏窗口**:通过 `withdraw()` 方法暂时隐藏窗口,避免窗口在左上角闪现[^1]。 2. **计算居中坐标**: - 获取屏幕的宽度和高度:`winfo_screenwidth()` 和 `winfo_screenheight()` - 获取窗口的请求宽度和高度:`winfo_reqwidth()` 和 `winfo_reqheight()` - 计算窗口左上角的坐标: $$x = \frac{\text{屏幕宽度} - \text{窗口宽度}}{2}, \quad y = \frac{\text{屏幕高度} - \text{窗口高度}}{2}$$ 3. **设置窗口位置**:通过 `geometry()` 方法设置窗口的尺寸和位置。 4. **显示窗口**:调用 `deiconify()` 显示窗口[^3]。 --- ### 示例代码 ```python import tkinter as tk def center_window(window): # 更新窗口布局以确保尺寸正确 window.update_idletasks() # 获取窗口尺寸和屏幕尺寸 window_width = window.winfo_reqwidth() window_height = window.winfo_reqheight() screen_width = window.winfo_screenwidth() screen_height = window.winfo_screenheight() # 计算居中坐标 x = (screen_width - window_width) // 2 y = (screen_height - window_height) // 2 # 设置窗口位置 window.geometry(f"{window_width}x{window_height}+{x}+{y}") # 创建主窗口 root = tk.Tk() root.title("居中窗口示例") root.geometry("400x300") # 初始尺寸(可选) # 添加组件(例如标签) label = tk.Label(root, text="窗口居中显示") label.pack(padx=20, pady=20) # 隐藏窗口 -> 计算位置 -> 显示窗口 root.withdraw() # 隐藏窗口避免闪现[^1] center_window(root) # 居中计算 root.deiconify() # 显示窗口 root.mainloop() ``` --- ### 关键说明 - **`update_idletasks()`**:确保窗口尺寸正确计算,尤其是在动态添加组件后。 - **`geometry()` 格式**:`宽度x高度+X坐标+Y坐标`,例如 `400x300+500+200`。 - **初始尺寸设置**:若未设置 `geometry()`,窗口会根据组件自动调整大小,但建议显式定义初始尺寸。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

vsropy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值