Tkinter小部件验证问题 - 再次

时间:2015-08-24 18:00:54

标签: python validation tkinter

与已经回答的问题here相关,我仍然无法弄清楚如何解决验证问题,以便在任何情况下都不会中断。目前,在大多数情况下它工作得很好,除非您选择值然后输入一些输入。

示例:加载程序,选择旋转框中的数字(8),然后键入任意数字。即使数字仍在控制范围内(1-128),它也会使用ValueError中断验证:int()的基数为10的无效文字:''。

请问任何想法?

try:
    from Tkinter import *
except ImportError:
    from tkinter import *

class GUI:
    def __init__(self):
        # root window of the whole program
        self.root = Tk()
        self.root.title('ImageSound')

        # registering validation command
        vldt_ifnum_cmd = (self.root.register(self.ValidateIfNum),'%P', '%S', '%W')

        # creating a spinbox
        harm_count = Spinbox(self.root, from_=1, to=128, width=5, justify='right', validate='all', validatecommand=vldt_ifnum_cmd)
        harm_count.insert(0,8)
        harm_count.delete(1,'end')
        harm_count.pack(padx=10, pady=10)

    def ValidateIfNum(self, user_input, new_value, widget_name):
        # disallow anything but numbers in the input
        valid = new_value == '' or new_value.isdigit()
        # now that we've ensured the input is only integers, range checking!
        if valid:
            # get minimum and maximum values of the widget to be validated
            minval = int(self.root.nametowidget(widget_name).config('from')[4])
            maxval = int(self.root.nametowidget(widget_name).config('to')[4])
            # check if it's in range
            if int(user_input) not in range (minval, maxval):
                valid = False
        if not valid:
            self.root.bell()
        return valid

if __name__ == '__main__':
    mainwindow = GUI()
    mainloop()

1 个答案:

答案 0 :(得分:1)

错误说您正在尝试将空字符串转换为整数。您只需要执行一行代码,因此错误的位置非常清晰。在尝试将user_input转换为整数之前,您只需要检查空字符串。那,或者捕获这个特定的错误并返回False,假设一个空字符串无效。

部分原因是由于你的参数倒退了。您按顺序传递%P(新值)和%S(正在插入或删除的文本),但您的函数具有名为user_inputnew_value的参数。因此,%P映射到user_input%S映射到new_value