学了这么长时间的python,第一次尝试写gui程序,看到别人写的‘硬盘整数分区计算器’比较简单好用,
于是就拿这个练习,自己动手用tkinter写一个,费尽周折写好之后发现entry框里即可以输入数字又可以输入
其它字符,不仅导致后面的计算程序会出现异常,同时使程序也不够人性化,所以决定查找一下限制用户只能
输入数字的方法,在下边这个页面找到一个。
- from Tkinter import *
- def keyPress(a):
- l = list(entry.get())
- for i in range(len(l) - 1, -1, -1):
- if not(48 <= ord(l[i]) <= 57 or ord(l[i]) == 46):
- entry.delete(i, i+1)
- root = Tk()
- entry = Entry(root)
- entry.bind('', keyPress)
- entry.pack() root.mainloop()
程序的原理非常简单,每次按键的时候都执行函数keypress,如果输入的字符的unicode code不在48到57之间,或者46,就删除该字符,但是这样操作未免太过麻烦,只需要检查输入的每一个字符在不在字符串‘0123456789.'中不就完了吗,为什么非要用ord函数找出unicode code,然后再比较大小?
直接用 i in '01234567890.'不就完了吗?于是我对它改进如下:
- textcheck = str(self.inentry.get())
- textcheck = ''.join(i for i in textin if i in '0123456789')
- try:
- self.inputGB.set(int(textcheck))
- except:
- pass
因为我需要限制用户只能输入整数,所以
'0123456789'中并没有‘.'
本来以为这样就已经好了,因为这段代码确实能够将非数字字符都过滤掉。
但是因为我想限制用户在字符串头部输入数字‘0’,于是我加了int
(textcheck
),这一加就出现问题了,
当entry中输入的字符中没有一个数字是,用户可以输入所有字符,只要用户输入了一个数字,所有的已经输入的非数字字符都会消失,仔细分析原因如下:
当用户输入非数字字符时,通过该语句,
textin
= ''.join
(i
for i
in textcheck
if i
in '0123456789'),
textcheck已经变成空字符串'',在执行int(textcheck)时,出现的异常被pass掉了,所以用户可以自由输入所有字符。
去掉try,except之后,发现抛出的错误是ValueError,再改代码如下:
- try:
- textcheck = ''.join(i for i in self.inputGB.get() if i in '0123456789')
- self.inputGB.set(int(textcheck))
- except ValueError:
- self.inputGB.set('')
总结,测试阶段,不能随便的加except: pass这样的代码,这会导致自己不能及时看到程序抛出的错误,等发现出了问题,再修改的时候却花了更多的时间去查找这个简单的错误,浪费了大量的时间。
阅读(14573) | 评论(0) | 转发(0) |