Chinaunix首页 | 论坛 | 博客
  • 博客访问: 115436
  • 博文数量: 15
  • 博客积分: 152
  • 博客等级: 入伍新兵
  • 技术积分: 255
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-29 17:10
文章分类

全部博文(15)

文章存档

2017年(1)

2015年(1)

2013年(8)

2012年(5)

分类: Python/Ruby

2013-01-08 16:45:41

学了这么长时间的python,第一次尝试写gui程序,看到别人写的‘硬盘整数分区计算器’比较简单好用,
于是就拿这个练习,自己动手用tkinter写一个,费尽周折写好之后发现entry框里即可以输入数字又可以输入
其它字符,不仅导致后面的计算程序会出现异常,同时使程序也不够人性化,所以决定查找一下限制用户只能
输入数字的方法,在下边这个页面找到一个。

点击(此处)折叠或打开

  1. from Tkinter import *
  2. def keyPress(a):
  3.     l = list(entry.get())
  4.     for i in range(len(l) - 1, -1, -1):
  5.         if not(48 <= ord(l[i]) <= 57 or ord(l[i]) == 46):
  6.             entry.delete(i, i+1)
  7. root = Tk()
  8. entry = Entry(root)
  9. entry.bind('', keyPress)
  10. entry.pack() root.mainloop()
程序的原理非常简单,每次按键的时候都执行函数keypress,如果输入的字符的unicode code不在48到57之间,或者46,就删除该字符,但是这样操作未免太过麻烦,只需要检查输入的每一个字符在不在字符串‘0123456789.'中不就完了吗,为什么非要用ord函数找出unicode code,然后再比较大小?
直接用 i in '01234567890.'不就完了吗?于是我对它改进如下:

点击(此处)折叠或打开

  1. textcheck = str(self.inentry.get())
  2. textcheck = ''.join(i for i in textin if i in '0123456789')
  3. try:
  4.     self.inputGB.set(int(textcheck))
  5. except:
  6.     pass

因为我需要限制用户只能输入整数,所以'0123456789'中并没有‘.'
本来以为这样就已经好了,因为这段代码确实能够将非数字字符都过滤掉。
但是因为我想限制用户在字符串头部输入数字‘0’,于是我加了int(textcheck,这一加就出现问题了,
当entry中输入的字符中没有一个数字是,用户可以输入所有字符,只要用户输入了一个数字,所有的已经输入的非数字字符都会消失,仔细分析原因如下:
当用户输入非数字字符时,通过该语句,
textin = ''.join(i for i in textcheck if i in '0123456789'),
textcheck已经变成空字符串'',在执行int(textcheck)时,出现的异常被pass掉了,所以用户可以自由输入所有字符。
去掉try,except之后,发现抛出的错误是ValueError,再改代码如下:

点击(此处)折叠或打开

  1. try:
  2.     textcheck = ''.join(i for i in self.inputGB.get() if i in '0123456789')
  3.     self.inputGB.set(int(textcheck))
  4. except ValueError:
  5.     self.inputGB.set('')
总结,测试阶段,不能随便的加except: pass这样的代码,这会导致自己不能及时看到程序抛出的错误,等发现出了问题,再修改的时候却花了更多的时间去查找这个简单的错误,浪费了大量的时间。
阅读(14573) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~