wxpython demo3.7.6

阅读: 评论:0

wxpython demo3.7.6

wxpython demo3.7.6

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的存在~ .8-win32-docs-demos-2.8.

之前那个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 看来是只提供简单的表达形式;

刚看到的一个提供基础应用代码的网站 /

6.StaticText的bug

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

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

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

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

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

如果 staticstr = ’0.11t2008-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–.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 DemoswxPythonsampleswxPIA_book)

12. listctrl的InsertStringItem()

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

只寻到这么个说法。

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

for item ws:

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中的,而文件关联图标则是靠注册表来进行关联。同事给的链接非常有用: .html/cmtid/afd233fa490c7717a9d3111c , 这个大概知道windows下的文件图标工作方式。

另外 .html?page=3 这个链接给出了一些windows文件中所包容的icon文件个数:

Filename Number of icons

compstui.dll 99

comres.dll 38

cryptui.dll 20

csc.dll 22

dsuiext.dll 35

< 18

< 23

inetcpl.cpl 34

inetcpl.dll 14

mmcndmgr.dll 129

mmsys.cpl 40

moricons.dll 140

netshell.dll 157

< 26

pfmgr.dll 38

< 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:windowssystem32shell32.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:windowssystem32shell32.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 %sn” % 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生成可执行时:

import setup

import py2exe

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

里面采用windows= 而不是console=

(参见.html)

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

本文发布于:2024-02-05 02:34:50,感谢您对本站的认可!

本文链接:https://www.4u4v.net/it/170722044362233.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:wxpython
留言与评论(共有 0 条评论)
   
验证码:

Copyright ©2019-2022 Comsenz Inc.Powered by ©

网站地图1 网站地图2 网站地图3 网站地图4 网站地图5 网站地图6 网站地图7 网站地图8 网站地图9 网站地图10 网站地图11 网站地图12 网站地图13 网站地图14 网站地图15 网站地图16 网站地图17 网站地图18 网站地图19 网站地图20 网站地图21 网站地图22/a> 网站地图23