Python Tkinter Spinbox验证失败

时间:2017-03-10 23:18:38

标签: python tkinter

我在验证spinbox输入时遇到问题。我有一个解决方法,似乎工作;然而,这很尴尬。假设这不是一个错误,有没有正确的方法来做到这一点?我在Windows 10上使用Anaconda Python 3.6(tk 8.6)。

问题是,如果在spinbox条目中的值介于validate和{{1之间“时从验证函数返回NoneFalse将设置为to }}。这仅在单击向上或向下按钮时发生,而不是在直接编辑文本时发生。

from

要重现,请高亮显示0并输入149999.然后单击几次。请注意,验证命令停止被调用。输出是:

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()

现在,根据docs,使用01 014 0149 01499 014999 0149999 15000 15001 textVariable是危险的;事实上,我有crashed Python / Tkinter的方式多于一个。但是,在这种情况下,您是否使用validateCommand并不重要;问题是一样的。

一种可能的解决方案可能是编辑验证功能中的textVariableto选项。即使这样可行,对我来说也有些问题,因为我正在将spinbox值同步到嵌入的Matplotlib图中。我需要计算fromto并为每个Matplotlib Artist和spinbox转换单位。

由于您无法在验证功能中编辑from,因此我想出的是以下内容。也许有人可以改进这一点。

textVariable

2 个答案:

答案 0 :(得分:1)

在与spinbox中的验证机制挣扎之后,我放弃了它。也许它按照预期的方式工作,但我认为这只是反直觉,它只被调用一次。我的应用程序使用spinbox来更新matplotlib图,我需要数据是指定范围内的整数。我需要代码来捕获非整数条目以及超出范围的整数。我想出的解决方案是使用键绑定而不是验证机制来实现所需的结果。以下是代码的相关部分:

var dataobj = [
{id:1,name:"Jessica"},
{id:2,name:"Tom"},
{id:3,name:"Will"}
];

let getNameFromObjId = obj => id  => obj.find(x=> x.id===id).name; 
console.log(getNameFromObjId(dataobj)(2))

答案 1 :(得分:0)

我可能聚会晚了,但是如果有人需要,我会把它留在这里。在类似情况下,我要做的事情是在回调函数中做我需要写的所有链接到Spinbox的变量。像这样:

import Tkinter as tk

root = tk.Tk()
my_var = tk.IntVar() # or whatever you need
spin = tk.Spinbox(root, from_=0, to=100, textvariable=my_var)
spin.pack()

def do_whatever_I_need(*args):
    # here I can access the Spinbox value using spin.get()
    # I can do whatever check I 

my_var.trace('w', whatever) #'w' for "after writing"

trace方法创建的回调调用给定函数,并带有两个参数:回调模式(在这种情况下为'w')和变量名称(这是我从未使用过的一些内部tkinter标识符用过的)。这就是do_wahtever_I_need的签名为*args的原因。