我有一个spinbox,其值范围为0-366,这意味着它只允许数字数据类型和退格。每当用户键入字符时,如果它不是数字类型,则会自动删除。我来自C#背景,这是我第一次尝试Python语言。这是我的密码
def validate(event):
charPress=event.keysym
val=sbDays.get() #previous values
if not charPress.isdigit():
sbDays.config(textvariable=StringVar(windows).set(val))
sbDays=tk.Spinbox(frame,from_=0,to=366,borderwidth=sbBorderWidth)
sbDays.place(relx=initialX,rely=yDistance,relwidth=sbWidth)
sbDays.config(validate='all',validatecommand=(windows.register(validate),'% P'))
sbDays.update()
sbDays.bind('<Key>',validate)
根据上面的代码,当我运行它时,它不会返回任何内容。因为我是C#出身。这就是我真正需要的。这是C#keypress事件
public static void TextBox_KeyPress_NumberBackspace(object sender, KeyPressEventArgs e)
{
char keyChar = e.KeyChar;
if (char.IsNumber(keyChar) || char.IsControl(keyChar))
e.Handled = false;
else
e.Handled = true;
}
tbDays.KeyPress += TextBox_KeyPress_NumberBackspace;
您没有正确使用
validatecommand
属性。函数不应直接更改值。validatecommand
函数的任务是返回True
或False
。如果返回True
,则允许输入,否则将拒绝输入如果它返回除
True
或False
(包括None
)之外的任何其他值,或者如果函数尝试更改该值,则验证函数将被禁用您可以配置tkinter以发送确定数据是否有效所需的信息。您不应该依赖于
get()
返回的值,因为这只会返回上一个值,而不是用户输入的值由于您只希望允许整数,并且希望将该值限制为最大366,因此最好的解决方案是在允许编辑的情况下(使用
%P
),让tkinter传入该值,然后您可以使用该值确定该值是否有效您也不应该绑定到
<Key>
事件,它不需要验证功能,事实上会妨碍它的工作该函数将如下所示:
您应该像下面那样配置
validatecommand
(注意%
和P
之间没有空格):您可能需要在其他地方添加一些额外的代码来处理边缘情况,即用户删除小部件中的所有内容,而不输入任何其他内容。例如,您可以使用类似
value=sbDays.get() or 0
的内容相关问题 更多 >
编程相关推荐