wxpython demo3.7.6_wxpython 二三事

1. 在绘图时,必须定义EVT_PAINT事件的触发处理,

self.Bind(wx.EVT_PAINT, self.OnPaint)

对触发处理,只需要建立一个PaintDC(BufferedPaintDC)请求;

def OnPaint(self, event):

dc = wx.BufferedPaintDC(self, self.buffer)

而真正的绘图通过其他事件激发,或者初始化中定义。

(如果在触发EVT_PAINT中绘图,则将不停调用绘图程序,不能独立控制绘图程序的需求)

2. 如何绘制1个可scroll的图像?

wx.Frame — wx.ScrolledWindow –事件处理—- EVT_SCROLLWIN_THUMBRELEASE

|– EVT_SCROLLWIN_THUMBTRACK

|– EVT_SCROLLWIN_PAGEDOWN

|– EVT_SCROLLWIN_PAGEUP

可满足scroll拖曳,点击等鼠标动作;

a. 而只对EVT_SCROLLWIN 事件响应,不可取(原因不明);

b. 注意,在这里是处理scroll的窗口,而不是scroll bar,所以对于EVT_SCROLL相关事件无响应;

c. 而EVT_SCROLLWIN_THUMBRELEASE事件中必须对EVT_SCROLLWIN_THUMBTRACK事件中改变的position做出回应:取得拖曳scrollbar的x,y=evt.GetPosition(),然后在释放鼠标事件中SetScrollPos(evt.GetOrientation(),x|y);

d. 对于PAGEDOWN,PAGEUP事件,要设置Scroll(x,y);

3. 神~ 竟然才发现有demo的存在~ http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-docs-demos-2.8.7.1.exe

之前那个scroll页面费劲周折,又发现修改ScrolledWindow的Sizer为FlexGridSizer,直接add 背景图像,无需任何EVT_SCROLLWIN的处理,scrollbar拖拉正常,只是一个问题,想在上面实现鼠标之类其他event无从下手。非常郁闷,东看西凑,还是好好研究demo

4. demo示例出错

看了image相关的,结果发现1个ico文件不认,wx.Image死活出错,google半响,甚至怀疑windows处理ico和linux不一样,俺在linux下面看的例子好好的,咋换windows就不行了呢。

默了之后,换个例子,又给报

‘Image’ object has no attribute ‘AdjustChannels’

这个google倒出来1个,长眼了,这个特性是2.8.7才有的,才想起俺只安装了这个版本的demo,wxpython尚是2.6的!

郁闷之后,还是自己的问题,折腾了几天啊,竟然是版本~ 升级之后之前遇到的demo里面的问题,没了~

5. StaticLine的绘制限制

之前是这样的结构:Frame->Panel->Window, 在wx.Window上设置sizer,加入StaticLine,但是,最终显示的窗口连线的影子都没有;

改成Frame->Panel 上直接显示,可以看到了,一条非常像影子的线出来了;

企图修改SetBackgroundColour或者SetForegroundColour,没法看出有啥变化;

StaticLine 看来是只提供简单的表达形式;

刚看到的一个提供基础应用代码的网站 http://zetcode.com/wxpython/widgets/

6.StaticText的bug

还未到官网证实,奇怪的一个现象,折腾n长时间。

如果需要显示的字符里出现\t 制表符号的话,最终窗口上看到的结果是奇形怪状,比如:

wx.StaticText(self,-1,staticstr,style=wx.ALIGN_RIGHT)

staticstr = ’0.11\t2008-02-01 18:48:32′

最终显示出来 0.11 2008-02-01,后面的时间不翼而飞;

如果 staticstr = ’0.11\t2008-02-01 ‘

最终只能看到1个 0.11

7.StaticText显示的格式问题

因为\t无法运用,只能期望通过格式化输出的方式,但是又是折腾,ms默认字体处理空字符以及小数点,和普通字符待遇不一样(默认字体:wx.DEFAULT,MS Shell Dlg 2),最终通过设置字体为wx.MODERN(Courier New),才使输出和终端一致–

sw=wx.StaticText(self,-1,staticstr,style=wx.ALIGN_RIGHT)

font=wx.Font(10,wx.MODERN,wx.NORMAL,wx.BOLD)

sw.SetFont(font)

8.Panel 刷新

这个Panel的sizer已经是n多元素累计在一起,为了重新获得新的sizer(再调用相关函数),应该对Panel使用self.DestroyChildren()(而不能将自身Destroy掉),重新生成新的Sizer,然后必须使用self.Layout()刷新,而不是其他(Refresh之类)。原因是如果没有Layout让Panel自动布局,将只在Resize的事件促发下才能显示正确内容。参考maillist–http://lists.wxwidgets.org/archive/wxPython-users/msg13737.html

9. wx.media

好生看了那个demo,始终不明白为啥不能对wx.media.MediaCtrl进行Load之后,立即Play呢,

今天下到src才看到wx的docs里有讲—

For general operation, all you need to do is call wxMediaCtrl::Load to load the file you want to render, catch the EVT_MEDIA_LOADED event, and then call wxMediaCtrl::Play to show the video/audio of the media in that event.

原来这个Play的操作一直在等待wx.media.EVT_MEDIA_LOADED 这个事件;

而关于那个SetPlaybackRate的问题还是悬念中;

10. 拖拉文件到窗口

class FileDropTarget(wxFileDropTarget):

def __init__(self, window):

wxFileDropTarget.__init__(self)

self.window = window

def OnDropFiles(self, x, y, filenames):

self.window.SetValue(str(filenames))

对 testwindow 作操作:

dropTarget = FileDropTarget(testwindow)

testwindow.SetDropTarget(dragTarget)

11. wxpython in action 书中的示例

1弱到底,那么久才知道demo的安装目录是有全部示例的(wxPython2.8 Docs and Demos\wxPython\samples\wxPIA_book)

12. listctrl的InsertStringItem()

InsertStringItem(self, long index, String label, int imageIndex=-1) -> long

只寻到这么个说法。

在那个list_report.py的例子里作了测试

for item in data.rows:

index = self.list.InsertStringItem(sys.maxint, item[0])

for col, text in enumerate(item[1:]):

self.list.SetStringItem(index, col+1, text)

sys.maxint 改成5,

那么显示的结果,前5行是顺序, 后面开始,就是倒序;

InsertStringItem(indexnum,string)

如果执行条目>indexnum,则返回indexnum(所谓max index num?)

但依然可以继续执行条目下去,新进条目永远是index+1,前1个条目变成index+n

__________> maxindex

|___n__|

|___2__|

|___1__|

|___0__|

________

|__+1__|

|__+2__|

|__+3__|

|__+m__|__> maxindex

|___n__|

|___2__|

|___1__|

|___0__|

________

|___q__|

|___2__|

|___1__|

|___0__|__> maxindex+m

|__+1__|

|__+2__|

|__+3__|

|__+m__|

|___n__|

|___2__|

|___1__|

|___0__|

13. windows取得文件的icon

有些系统图标是存储在shell32.dll中的,而文件关联图标则是靠注册表来进行关联。同事给的链接非常有用: http://hi.baidu.com/tanry/blog/item/31c9b93833eb87c1d46225c2.html/cmtid/afd233fa490c7717a9d3111c , 这个大概知道windows下的文件图标工作方式。

另外 http://www.windowsdevcenter.com/pub/a/windows/2004/08/17/VB_icons.html?page=3 这个链接给出了一些windows文件中所包容的icon文件个数:

Filename Number of icons

compstui.dll 99

comres.dll 38

cryptui.dll 20

csc.dll 22

dsuiext.dll 35

explorer.exe 18

iexplore.exe 23

inetcpl.cpl 34

inetcpl.dll 14

mmcndmgr.dll 129

mmsys.cpl 40

moricons.dll 140

netshell.dll 157

ntbackup.exe 26

pfmgr.dll 38

progman.exe 48

setupapi.dll 37

SHDOCVW.DLL 35

shell32.dll 238

stobject.dll 31

wiashext.dll 23

wmploc.dll 60

xpsp2res.dll 19

注意到其中shell32.dll是有238个icon的。

套用官例关于listctl的脚本,下面这2句:

wx.Icon可直接从windows文件中取得icon;

wx.BitmapFromIcon 再把icon文件转换成bmp图像;

tmpicon=wx.Icon(“c:\windows\system32\shell32.dll;%s” %(i), wx.BITMAP_TYPE_ICO)

bmp = wx.BitmapFromIcon(tmpicon)

======================================

class demoFrame(wx.Frame):

def __init__(self):

wx.Frame.__init__(self,None,-1,”test wx.ListCtrl”, size=(600,400))

il = wx.ImageList(32,32,True)

number = 0

for i in range(0,238):

tmpicon = wx.Icon(“c:\windows\system32\shell32.dll;%s” %(i), wx.BITMAP_TYPE_ICO)

bmp = wx.BitmapFromIcon(tmpicon)

il_max = il.Add(bmp)

number = number + 1

self.list = wx.ListCtrl(self,-1, style = wx.LC_ICON | wx.LC_AUTOARRANGE)

self.list.AssignImageList(il,wx.IMAGE_LIST_NORMAL)

for x in range(number):

img = x % (il_max + 1)

try:

self.list.InsertImageStringItem(x,’this is item %2d’ % x,img)

except:

print “error”, x

app =wx.PySimpleApp()

frame = demoFrame()

frame.Show()

app.MainLoop()

==============================================

14. wx.ListCtrl的双击事件

EVT_LIST_ITEM_ACTIVATED

默,找了半天以为没有。

self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated, self.list)

或者

self.list.Bind(wx.EVT_LEFT_DCLICK, self.OnDoubleClick)

在示例中我们还可以看到:

def OnDoubleClick(self, event):

self.log.WriteText(“OnDoubleClick item %s\n” % self.list.GetItemText(self.currentItem))

event.Skip()

在这里使用了event.Skip() 从而使list能够去响应EVT_LIST_ITEM_ACTIVATED所定义的func.

15. listCtrl的item 选中

SetItemState(item, state, stateMask)

示例中:

self.list.SetItemState(5, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)

self.list.SetItemState(10, 0, wx.LIST_STATE_SELECTED)

几个可用的state如下,具体见P405:

wx.LIST_STATE_CUT = 8

wx.LIST_STATE_DONTCARE = 0

wx.LIST_STATE_DROPHILITED = 1

wx.LIST_STATE_FOCUSED = 2

wx.LIST_STATE_SELECTED = 4

测试结果好像只要state和stateMask不一致,出现的就是1个虚线框,如果一致就是大黑框。

16. CallAfter

具体见P540

建立一个新的thread,来执行参数定义的func。

示例中:

wx.CallAfter(self.list.SetItemState, 11, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED)

就是当前thread同时总执行另外1个新的thread(现象为item11项总处于选中大黑框状态)

而对示例中另1使用:

wx.CallAfter(self.PopulateList)

还不清楚,像只执行一次似的

17. 如何去除运行时那个黑乎乎的terminal 界面

1个是学demo,将py改成pyw结尾, 这样写出的程序运行时就不会有terminal跳出来下人;

2个用py2exe生成可执行时:

from distutils.core import setup

import py2exe

setup(windows=['test.py'])

里面采用windows= 而不是console=

(参见http://mail.python.org/pipermail/python-list/2005-November/349022.html)

另: py2exe才用,默,好使啊, 直接 python setup.py py2exe就出1大包,虽然大的出奇,但windows使用是没问题的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值