在GTK+, QT 和 wxWidgets 之间犹豫了挺长时间, 最后还是选择了wxWidgets(其实我只是看中了”native”控件)
现在我的软件环境是:
Windows 7 x86_64
Python 2.6.5
wxPython 2.8.10.1
Boa Constructor 0.6.1
一开始见到这IDE, 我仿佛又看到了Delphi…
点击上面板上 New => wx.App 就可以创建新的wxPython 应用程序了
(一开始我直接点了wx.Frame, 结果还花了点力气才让窗口能显示出来…)
然后新建 wxFrame, 在wx.Frame界面的时候, Editor 窗口的工具栏上会出现传说中的 Frame Designer. 就是他了!
关于Sizer:
对于以前从未用过Sizer及其类似物(VB6用数行代码实现类似功能), 起初使用Sizer我是相当的不适应.
大致摸索几次之后, 慢慢找到了规律 比如从上而下是如下结构的窗体:
工具栏
结果文本框
状态栏
这是窗口的底层结构,所以用wx.BoxSizer实现上下排列(其中工具栏需要用子Sizer)
然后把wx.FlexGridSizer填到刚建立的boxSizer1里, 主体构架就完了:)
接下来就和我熟悉的VB6一样, 一个个拖需要的控件到窗体上…
选中特定控件后,可以在左侧Inspector里打开Evts, 在左侧列表里选择事件类别, 然后双击右侧具体需要的事件. 在退出Designer的时候, 相应的Bind和函数会自动建好.
!!注意:不要在Sizer里留不存在的控件或者None控件, 否则退出Designer时会收到一条警告,并且在无更改的情况下, 程序是不能运行的.
Sizer窗口里点击相应控件, 和在窗体上直接点击, 出现在左侧Inspector里的属性是不一样的. 初次使用Sizer看到控件密密麻麻挤在一起很不爽, 可以给相应控件加上一定的Border, 并且在Flags里把wx.ALL设为True.
Flag -> wx.EXPAND设为True的时候, 会根据Sizer类型”占领”相应方向的全部空间. 比如使用BoxSizer的时候给文本框勾上wx.EXPAND, 则文本框左右范围会覆盖整个窗体. 如果希望上下也覆盖整个窗体, 可以加大Proportion属性的设置.
代码存档
一些有用的代码, 留此备忘:
简单显示一个MessageBox (类似VB6的 MsgBox)
1 |
wx.MessageBox('内容','标题') |
使用简单的提示用户输入的对话框 (类似VB6的 InputBox, 不过好看一些)
1 2 3 4 |
dlg = wx.TextEntryDialog(None, '提示语','标题栏', '默认值') if dlg.ShowModal() == wx.ID_OK: response = dlg.GetValue() dlg.Destroy() |
Windows剪贴板操作(利用CF_UNICODETEXT解决了修改剪贴板内容时的乱码问题.与之对应的,传入字符串一定要decode到unicode)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
import win32clipboard as w import win32con def setText(aString): w.OpenClipboard() w.EmptyClipboard() w.SetClipboardData(win32con.CF_UNICODETEXT, aString) w.CloseClipboard() def getText(): w.OpenClipboard() d = w.GetClipboardData(win32con.CF_TEXT) w.CloseClipboard() return d |
DragDrop文件到控件里
1 2 3 4 5 6 7 8 9 10 11 12 |
#定义类 class MyFileDropTarget(wx.FileDropTarget): def __init__(self, window): wx.FileDropTarget.__init__(self) self.window = window def OnDropFiles(self, x, y, filenames): for file in filenames: pass #干点什么 #增加以下代码到frame的__init__()函数尾部 dt = MyFileDropTarget(self.<接受拖放的控件>) self.<接受拖放的控件>.SetDropTarget(dt) |
计算MD5/SHA1/ed2k hash的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
import hashlib m1 = hashlib.md5() m2 = hashlib.sha1() md4 = hashlib.new('md4').copy ed2k = [] f = open(filename,'rb') bytes = f.read(9728000) while(bytes != ''): m1.update(bytes) m2.update(bytes) m3 = md4() m3.update(bytes) ed2k.append(m3.digest()) bytes = f.read(9728000) f.close() if len(ed2k)==1: ed2kvalue = ed2k[0].encode("hex") else: m3 = md4() m3.update(reduce(lambda a,d: a + d, ed2k, "")) ed2kvalue = m3.hexdigest() md5value = m1.hexdigest() sha1value = m2.hexdigest() |
MediaInfo使用方法
1 2 3 4 5 6 |
from MediaInfoDLL import * MI = MediaInfo() MI.Open(file) a=MI.Get(Stream.General/Video/Audio/Text, ID, u"<项目>") #ID 的取值范围在 0 - MI.Count_Get(Stream.<相应类型>)-1 之间 |
获取文件大小
1 2 |
f = os.stat(file) size = f.st_size |
获取网页源代码
1 2 |
import urllib HTML = urllib.urlopen(URL).read() |
URLEncode(可以通过修改text编码来得到针对不同环境的结果)
1 2 |
import urllib url=urllib.quote(text) |
正则表达式使用语法
1 2 3 4 |
import re r = re.compile('<正则表达式>') data = r.sub('<替换内容>', data[, <最大替换个数,不指定为全部替换>]) #替换 data = r.findall(data) #返回匹配项组成的列表 |
普通字符串替换(比正则快)
1 |
s.replace('key', 'new value') |
设置默认按钮(类似VB6里的Default属性)
1 2 |
#加入以下代码在Frame的__init__()函数尾 self.button1.SetDefault() |
发现Python download 被墙了…..无处下载python。。。
惨剧… 可以锻炼一下身体了 XD
……………..囧。。。。。
你好,我的环境与你的大多一样,就是win7是个32位的,在运行boa时,最上边那栏里都是空的,在Xp下运行时里面就有东西,可以快速的建窗口文件等,请问你碰上过这种问题没有?
请回复邮件,谢谢。
你好..我没在Win7下测试过boa..现在系统是Ubuntu,也没有遇到过类似问题,抱歉不能帮到你.
在boa根目录,找到 Palette.py,
在大概 410行附近
把
newButton = btnType(self, mID, None, wx.Point(self.posX, self.posY),
改成
newButton = btnType(self, mID, None, wx.Point(self.posX, 0),
就行了
你好,我想问一下,你那个MediaInfoDll是怎么导入的,需要其它什么文件吗?
需要的,MediaInfo网站上有相关的DLL和Sample下载:)
哈哈,沙发,你终于更新了
前来支持我的火星猫猫
??!!我怎么跑 Australia 去了??!!
人品问题…
再试试……你的 IP 库绝对有问题
由汝青蛙负责给我个没问题的=.=
您人肉制造一个- –
上不去 Twitter,证明我还是在 CN 的……
没准是您遇上twitter抽风了…
您已经三线程了……
额 不懂 什么意思0.0?
您已经开了 3 个连载了……目前都是 “一”
哈哈, 有两个长期, 一个短期.
另外我的 Fedora Icon!!!!!!
忘记了…
https://fedoraproject.net/favicon.ico
囧,错了。。。
https://fedoraproject.org/favicon.ico
好的 立此存照 本猫现在睡觉去…
抓醒。。。
我睡觉去。。。
还没换……
告诉小青蛙一个好消息 我终于换了fedora图标了
刚刚还在想这件事,一进邮箱就发现了……
您牛真是效率高哇……
哈哈,可惜您现在Ubuntu了