与已经回答的问题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()
答案 0 :(得分:1)
错误说您正在尝试将空字符串转换为整数。您只需要执行一行代码,因此错误的位置非常清晰。在尝试将user_input
转换为整数之前,您只需要检查空字符串。那,或者捕获这个特定的错误并返回False
,假设一个空字符串无效。
部分原因是由于你的参数倒退了。您按顺序传递%P
(新值)和%S
(正在插入或删除的文本),但您的函数具有名为user_input
和new_value
的参数。因此,%P
映射到user_input
,%S
映射到new_value
。