能否将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
相关产品推荐
相关产品推荐

