我遇到了驗證spinbox輸入的問題。我有一個解決方法似乎工作;然而,這很尷尬。假設這不是一個錯誤,是否有正確的方法來做到這一點?我在Windows 10Python Tkinter Spinbox驗證失敗
使用Python的蟒蛇3.6(TK 8.6)問題是validate
設置爲None
如果從驗證函數返回False
當紡紗器項的值是to
和from
之間。這隻發生在單擊向上或向下按鈕時,而不是直接編輯文本時發生。
import tkinter as tk
class SpinboxGui:
def __init__(self):
self.root = tk.Tk()
vcmd = (self.root.register(self.validate_spin), '%W', '%P')
self.spin = tk.Spinbox(self.root, from_=0, to=50000)
self.spin.config(validate="key", validatecommand=vcmd)
self.spin.pack()
def validate_spin(self, name, nv):
try:
print(nv)
n = int(nv)
except:
return False
if n <= 15000:
return True
return False
if __name__ == "__main__":
SpinboxGui()
tk.mainloop()
重現,突出顯示0和鍵入149999.然後點擊幾次。請注意驗證命令停止被調用。輸出是:
01
014
0149
01499
014999
0149999
15000
15001
現在,根據docs,使用textVariable
和validateCommand
一起是危險的;事實上,我有crashed Python/Tkinter不止一種。但是,在這種情況下,是否使用textVariable
並不重要;問題是一樣的。
一個可能的解決方案可能是編輯驗證功能中的to
和from
選項。即使這樣做,對我來說也有點問題,因爲我正在將spinbox值同步到嵌入的Matplotlib圖中。我需要計算to
和from
併爲每個Matplotlib Artist和spinbox轉換單位。
由於您不能在驗證功能中編輯textVariable
,我想到的是以下內容。也許有人可以改善這一點。
def __init__(self):
# http://stackoverflow.com/a/4140988/675216
vcmd= (self.root.register(self.validate_spin), '%W', '%P')
# Rest of code left out
self.spin.config(validate="key", validatecommand=vcmd)
self.spin.bind("<<ResetValidate>>", self.on_reset_validate)
def on_reset_validate(self, event):
# Turn validate back on and set textVariable
self.spin.config(validate="key")
def validate_spin(self, name, nv):
# Do validation ...
if not valid:
self.spin.event_generate("<<ResetValidate>>", when="tail")
return valid
這種說法是錯誤的:_「問題是,驗證是如果返回從驗證函數假設爲無...」 _ - 驗證功能將不僅僅因爲你返回'False'而被設置爲'None'。實際上,唯一有效的返回值是'True'和'False'。請閱讀並遵循以下建議:[如何創建最小,完整和可驗證示例](http://www.stackoverflow.com/help/mcve) –
重現問題需要相當多的時間和精力。並不是我懶得去做;我認爲這可能是spinbox的預期行爲。我不想投入時間尋找一個不存在的問題。但現在我知道了,在這裏。 – Todd