Python点滴

0 评论  

最近在用wxPython做一个小工具,给公司内部用,Python的确很简洁,Java Swing比wxPython可是要麻烦多了,不过还是碰到一些问题,都是一说就明白的问题,只是我写这个工具也是东拼西凑的找的别人的代码,好写代码而不求胜解,才会碰到这些问题了。如下:

  • wxPython关于RadioBox事件处理的Bug
wxPython里面的UI控件很丰富,刚开始画UI的时候我就加了一个RadioBox在wxFrame上,按照Swing里面的理解,Frame才是 正牌的窗口,我也就跟着用Frame了,wxPython里面的事件处理机制也是比较简单的,只需要定义好一个组件的事件ID,再把这个事件ID关联到一 个事件处理函数即可,但是,RadioBox却始终没有触发事件,一开始我以为是我代码的问题,就仔细和原有的例子代码做比较,没找到什么地方有问题,后 来我把页面上的其它控件全部注释掉,只剩下光杆的RadioBox,还是没有事件产生,,,只好Google一把,发现有人说wxRadioBox有 bug,在Frame里面不会产生事件的Bug,真晕啊,后来把Frame页面的控件移到一个Panel里面,事件的问题就OK了。
  • python格式化当前时间
import time print time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())) 做参数的格式化字符串可以用Unicode,可以写中文, 像这样:u'%Y年-%m月-%d日 %H:%M:%S'
  • Example 8.12. locals 是只读的,globals 不是
DiveIntoPython里的原话: Example :. def foo(arg): x = 1 print locals() (1) locals()["x"] = 2 (2) print "x=",x (3) z = 7 print "z=",z foo(3) globals()["z"] = 8 (4) print "z=",z (5) (1) 因为使用 因为使用 因为使用 3 来调用 来调用 foo,会打印出 ,会打印出 ,会打印出 {'arg': 3, 'x': 1}。这个应该没什么奇怪的。这个应该没什么奇怪的。这个应该没什么奇怪的。这个应该没什么奇怪的。这个应该没什么奇怪的。这个应该没什么奇怪的。 这个应该没什么奇怪的(2) locals 是一个返回 是一个返回 是一个返回 是一个返回 dictionary 的函数,这里您在 的函数,这里您在 的函数,这里您在 的函数,这里您在 dictionary 中设置了一个值中设置了一个值中设置了一个值中设置了一个值。您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 您可能认为这样会改变局部量 x 的值为 的值为 的值为 2,但并不会。,但并不会。,但并不会。,但并不会。locals 实际上没有实际上没有实际上没有实际上没有返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变返回局部名字空间,它的是一个拷贝。所以对进行改变空间中的变量值并无影响。空间中的变量值并无影响。空间中的变量值并无影响。空间中的变量值并无影响。空间中的变量值并无影响。 (3) 这样会打印出 这样会打印出 这样会打印出 这样会打印出 这样会打印出 x= 1,而不是 ,而不是 ,而不是 x= 2。 (4) 在有了对 locals 的经验之后,您可能认为这样的经验之后,您可能认为这样的经验之后,您可能认为这样的经验之后,您可能认为这样的经验之后,您可能认为这样的经验之后,您可能认为这样的经验之后,您可能认为这样的经验之后,您可能认为这样不会 改变 改变 z 的值,但是可以的值,但是可以的值,但是可以的值,但是可以。由于 由于 由于 Python 在实现过程中内部有所区别 在实现过程中内部有所区别 在实现过程中内部有所区别 在实现过程中内部有所区别 在实现过程中内部有所区别 在实现过程中内部有所区别 在实现过程中内部有所区别 (关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,关于这些区别我宁可不去研究,因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解因为我自已还没有完全理解) ,globals 返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是返回实际的全局名字空间,而不是一个拷贝:与 一个拷贝:与 一个拷贝:与 locals 的行为完全相反。所以对 的行为完全相反。所以对 的行为完全相反。所以对 的行为完全相反。所以对 的行为完全相反。所以对 的行为完全相反。所以对 的行为完全相反。所以对 的行为完全相反。所以对 globals 所返回的 所返回的 所返回的 所返回的 dictionary - 155 - Dive Into Python http://diveintopython.org/ 的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。的任何改动都会直接影响到全局变量。 (5) 这样会打印出 这样会打印出 这样会打印出 这样会打印出 这样会打印出 z= 8,而不是 ,而不是 ,而不是 z= 7。 之所以注意到这个是因为我在python里面定义的全局变量A=7,直接在代码里改成A=8,后面用到A的时候还是7,后来换成globals()['A'] = 8才OK。
  • repr函数
repr函数用来取得对象的规范字符串表示。反引号(也称转换符)可以完成相同的功能。注意,在大多数时候有eval(repr(object)) == object。 >>> i = [] >>> i.append('item') >>> `i` "['item']" >>> repr(i) "['item']" 基本上,repr函数和反引号用来获取对象的可打印的表示形式。你可以通过定义类的__repr__方法来控制你的对象在被repr函数调用的时候返回的内容。 这个是在自定义异常里面发现的,我要抛出一个自定义的异常,按照不知道什么地方来的代码,在异常的__str__方法也就是tostring方法里面用到了这个函数,导致我抛出的异常内容本是Unicode,显示出来确是类似"\\u6578"的东西。
  • wx.Sizer怎样才有Padding效果
wxSizer还是比较好定位的,我只用了BoxSizer和FlexGridSizer,不过我发现这两个里面都没有一个明确的地方可以设置padding,FlexGridSizer倒是可以设置gab,不过这时在Sizer里面的,后来才发现sizer的Add方法里面可以指定Border的宽度,和Border的上下左右组合,这样就可以实现padding效果了