我在更大的腳本中包含了條件密碼捕獲。代碼如下所示:
if thing: # found token, don't need password
do stuff
else: # no token, get password in popup
try:
import tkinter as tk
import tkinter.simpledialog
tk.Tk().withdraw()
passwd = tkinter.simpledialog.askstring("Password", "Enter password:", show="*")
return passwd
功能上很好,但我的大多數用戶都使用 3840x1600 解析度的顯示幕,所以當對話框在左上角彈出時,很容易錯過。
是否有一種簡單的方法來覆寫 simpledialog 類以告訴它出現在監視器上的某個 X/Y 處,或者是我構建完整mainloop().
uj5u.com熱心網友回復:
所以當對話框在左上角彈出時很容易錯過。
如果您指定可選引數parent,對話框將出現在視窗中間并在內部獲得焦點。確保您的視窗映射通過.update_idletasks()以獲取相應的坐標。你也可以考慮讓你的視窗透明而不是撤回。
import tkinter as tk
import tkinter.simpledialog
def ask_pw():
pw = tkinter.simpledialog.askstring("Password",
"Enter password:",
show="*",
parent=root)
root = tk.Tk()
root.geometry('250x250 500 500')
root.update_idletasks()
ask_pw()
#root.withdraw()
root.mainloop()
uj5u.com熱心網友回復:
由于對話框相對于其父級的位置放置,因此您可以將其父級居中,即在您的情況下為根視窗:
import tkinter as tk
from tkinter import simpledialog
root = tk.Tk()
# center root window
root.tk.eval(f'tk::PlaceWindow {root._w} center')
root.withdraw()
# set parent=root
passwd = simpledialog.askstring('Password', 'Enter password:', show='*', parent=root)
uj5u.com熱心網友回復:
我找不到覆寫任何類以直接修改底層_QueryString類的方法(它也是私有的,所以我不想使用它,而且無論如何我可能都找不到簡單的方法)。所以我只是寫了一個自定義askstring函式。該功能是這樣的,您需要提供父級和幾何圖形,它將首先安排一個內部函式(可能是一個適當的外部函式,但應該沒問題)以獲取該父級小部件中的最后一個小部件,并在計劃之后時間它應該是新的對話框,所以它應該得到它。(檢查到位,以檢查是否該控制元件是源自dialog.Dialog這是從什么_QueryString繼承)。然后只需更改幾何形狀(因為在繼承鏈上Toplevel顯然有一個geometry方法):
import tkinter as tk
import tkinter.simpledialog as dialog
def askstring(title, prompt, geometry='', **kwargs):
def change_geometry():
if not geometry:
return
widget = kwargs['parent'].winfo_children()[-1]
if isinstance(widget, dialog.Dialog):
widget.geometry(geometry)
if 'parent' in kwargs:
kwargs['parent'].after(10, change_geometry)
return dialog.askstring(title, prompt, **kwargs)
root = tk.Tk()
root.withdraw()
askstring('Title', 'Prompt', geometry='300x200 200 200', parent=root)
有用:
- 源代碼
tkinter.simpledialog是我用來解決這個問題的(也來自以前的經驗)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/356587.html
上一篇:在螢屏上顯示控制臺
