我在验证数字调整框输入时遇到问题。下面我有一个解决方法,似乎可以工作;但是,这很尴尬。假设这不是一个bug,有正确的方法吗?我在Windows10上使用AnacondaPython3.6(Tk8.6)。
问题是,当spinbox项中的值介于to
和{None
。仅当单击“向上”或“向下”按钮时才会发生这种情况,而不是直接编辑文本时。
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。然后点击几下。请注意,validation命令将停止被调用。输出为:
^{pr2}$现在,根据docs,同时使用textVariable
和{textVariable
并不重要;问题是相同的。
一种可能的解决方案是编辑验证函数中的to
和from
选项。即使这样做也有点问题,因为我要将数字调整框值同步到嵌入式Matplotlib绘图。{cd4}和plot{cd4}都需要转换。
由于您不能在validation函数中编辑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
在与spinbox中的验证机制进行了斗争之后,我放弃了它。也许它的工作方式与预期的一样,但我认为它只被调用一次是违反直觉的。我的应用程序使用spinbox更新matplotlib图形,我需要数据是指定范围内的整数。我需要代码来捕捉非整数项以及超出范围的整数。我想出的解决方案是使用密钥绑定而不是验证机制来获得所需的结果。以下是代码的相关部分:
我可能要迟到了,但我会把它留在这里,以防有人需要。在类似的情况下,我所做的就是在回调中做我需要的所有事情,以写入链接到spinbox的变量。比如:
由
trace
方法创建的回调调用给定函数,其中有两个参数:回调模式(在本例中是'w'
)和变量名(这是我从未使用过的某个内部tkinter标识符)。这就是do_wahtever_I_need
的签名是*args
的原因。在相关问题 更多 >
编程相关推荐