You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否将tkinter.simpledialog窗口居中,有简便方法设置其弹出位置吗

解决方案

无需重写整个simpledialog类,也不需要自行实现完整的mainloop逻辑,仅需继承官方内置的查询对话框类修改位置配置即可,最简实现如下:

自定义定位弹出框代码

import tkinter as tk
import tkinter.simpledialog

class PositionedAskString(tkinter.simpledialog._QueryString):
    def __init__(self, parent, title, prompt, **kwargs):
        # 可直接指定固定坐标,比如x=2000, y=800适配3840x1600分辨率屏幕
        # 也可以留空自动计算居中坐标
        self.pos_x = kwargs.pop('pos_x', None)
        self.pos_y = kwargs.pop('pos_y', None)
        super().__init__(parent, title, prompt, **kwargs)

    def geometry(self, *args):
        if not args:
            return super().geometry()
        # 首次设置窗口大小时替换弹出坐标
        w, h = args[0].split('+')[0].split('x')
        if self.pos_x is None or self.pos_y is None:
            # 自动计算居中坐标
            screen_w = self.master.winfo_screenwidth()
            screen_h = self.master.winfo_screenheight()
            x = (screen_w - int(w)) // 2
            y = (screen_h - int(h)) // 2
        else:
            x = self.pos_x
            y = self.pos_y
        super().geometry(f"{w}x{h}+{x}+{y}")

# 封装为和原askstring兼容的调用方法
def positioned_askstring(title, prompt, **kwargs):
    root = tk.Tk()
    root.withdraw()
    dlg = PositionedAskString(root, title, prompt, **kwargs)
    root.destroy()
    return dlg.result

替换原有业务代码

将原来else块中的密码采集逻辑替换为以下调用即可:

else:  # no token, get password in popup
    try:
        # 调用自定义的定位弹出框,默认居中显示
        passwd = positioned_askstring("Password", "Enter password:", show="*")
        # 如果需要指定固定坐标,调用方式如下:
        # passwd = positioned_askstring("Password", "Enter password:", show="*", pos_x=1800, pos_y=700)
        return passwd
    except ImportError:
        # 原有异常处理逻辑保留
        pass

实现说明

  • 官方simpledialog的所有原有功能(密码隐藏、输入校验、按钮逻辑、自带事件循环)完全保留,不需要额外维护mainloop
  • 既可以自动计算居中坐标避免用户忽略,也可以手动传入固定坐标适配不同分辨率的屏幕
  • 代码侵入性极低,仅需要替换原有askstring调用即可,不需要修改其他业务逻辑

内容的提问来源于stack exchange,提问作者auslander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 13:36:03