- 浏览: 1450959 次
- 性别:
- 来自: 苏州
文章分类
- 全部博客 (564)
- 算法 (7)
- 流金岁月 (1)
- Javascript (30)
- actionscript (108)
- as3.0 game (14)
- flex (84)
- fms2 (27)
- 正则表达式 (7)
- 开源组件代码(as3.0) (1)
- Pv3d (13)
- Cairngorm (4)
- vbs (54)
- VB程序设计 (26)
- 计算机应用与维护 (4)
- 职场实用穿衣技巧 (3)
- 历史风云 (15)
- 淡泊明志,宁静致远 (12)
- 情感 (26)
- 杂谈 (41)
- 越南风 (14)
- DirectX (9)
- Dev-cpp (11)
- 回望百年 (2)
- 建站经验 (2)
- Python (24)
- 网络赚钱 (4)
- php (2)
- html (1)
- ob0短址网 (1)
- ob0.cn (1)
- wordpress (1)
- pandas logistic (1)
- haxe (1)
- opencv (1)
- 微信小程序 (3)
- vue (3)
- Flutter (1)
最新评论
-
GGGGeek:
第一个函数滚动监听不起作用,onPageScroll可以
微信小程序--搜索框滚动到顶部时悬浮 -
naomibyron:
解决办法:工具 -> 编译选项 -> 编译器 ...
dev-c++中编译含WINSOCK的代码出现错误的解决方法 -
haichuan11:
这个…… 代码不全真的是让人很憋屈的感觉啊
actionScript 3.0 图片裁剪及旋转 -
chenyw101:
老兄能留个QQ号吗?具体的我有些东西想请教下你
用VB制作网站登陆器 -
yantao1943:
貌似有点问题,只派发一次事件啊
使用ActionScript 2.0或ActionScript 3.0处理音频文件的提示点(cue
出处:http://www.cnblogs.com/coderzh/archive/2008/11/23/1339310.html
一、简介
wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序。它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。和Python语言与wxWidgets GUI工具库一样,wxPython是开源软件。这意味着任何人都可以免费地使用它并且可以查看和修改它的源代码,或者贡献补丁,增加功能。wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS X。由于使用Python作为编程语言,wxPython编写简单、易于理解。
二、基本使用
基本使用的话到这个地址看已经很详细了,我没有必要重复一遍啦:
http://wiki.wxpython.org/Getting%20Started
三、常用控件
1. 菜单(menu)
http://wiki.wxpython.org/Getting%20Started#head-33e6dc36df2a89db146142e9a97b6e36b956875f
2. 页面布局(Sizer)
这个东东使用起来比较麻烦,参考以下页面吧:
http://wiki.wxpython.org/Getting%20Started#head-7455553d71be4fad208480dffd53b7c68da1a982
3. Tab页面(notebook)
http://wiki.wxpython.org/Getting%20Started#head-b20d2fc488722cdb3f6193150293d1e118734db8
4. 列表控件(ListCtrl)
这个控件比较强大,是我比较喜欢使用的控件之一。在《wxPythonInAction》一书中第13章有介绍(想要该书电子版及附带源码的朋友可以问我要)
下面是list_report.py中提供的简单用法:
import wx
import sys, glob, random
import data
class DemoFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1,
"wx.ListCtrl in wx.LC_REPORT mode",
size=(600,400))
il = wx.ImageList(16,16, True)
for name in glob.glob("smicon??.png"):
bmp = wx.Bitmap(name, wx.BITMAP_TYPE_PNG)
il_max = il.Add(bmp)
self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
self.list.AssignImageList(il, wx.IMAGE_LIST_SMALL)
# Add some columns
for col, text in enumerate(data.columns):
self.list.InsertColumn(col, text)
# add the rows
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)
# give each item a random image
img = random.randint(0, il_max)
self.list.SetItemImage(index, img, img)
# set the width of the columns in various ways
self.list.SetColumnWidth(0, 120)
self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE)
self.list.SetColumnWidth(3, wx.LIST_AUTOSIZE_USEHEADER)
app = wx.PySimpleApp()
frame = DemoFrame()
frame.Show()
app.MainLoop()
对于ListCtrl控件,我要补充的几个地方是:
1. 如何获取选中的项目?
最常用的方法就是获取选中的第一项:GetFirstSelected(),这个函数返回一个int,即ListCtrl中的项(Item)的ID。
还有一个方法是:GetNextSelected(itemid),获取指定的itemid之后的第一个被选中的项,同样也是返回itemid。
通过这两个方法,我们就可以遍历所有选中的项了:
itemid = self.list.GetFirstSelected()
while itemid <> -1:
#Do something
itemid = self.list.GetNextSelected(itemid)
如果要获取某一行,某一列的值,则通过下面的方法:
#获取第0行,第1列的值
itemtext = self.list.GetItem(0, 1).Text
2. 如何在选定项后添加右键菜单?
在__init__函数中,添加如下的事件绑定:
self.list.Bind(wx.EVT_CONTEXT_MENU, self.OnContextMenu)
然后,添加OnContextMenu方法:
def OnContextMenu(self, event):
if not hasattr(self, "popupStop"):
self.popupStop = wx.NewId()
self.popupPropery = wx.NewId()
self.Bind(wx.EVT_MENU, self.OnPopupStop, id = self.popupStop)
self.Bind(wx.EVT_MENU, self.OnPopupProperty, id = self.popupPropery)
# 创建菜单
menu = wx.Menu()
itemStop = wx.MenuItem(menu, self.popupStop, "Stop")
itemProperty = wx.MenuItem(menu, self.popupPropery, 'Property')
menu.AppendItem(itemStop)
menu.AppendItem(itemProperty)
itemProperty.Enable(False)#默认让属性按钮变成无效状态
if itemid == -1:#如果没有选中任何项
itemStop.Enable(False)
else:
itemStop.Enable(False)
itemProperty.Enable(True)
#到这里才弹出菜单
self.PopupMenu(menu)
#最后注意销毁前面创建的菜单
menu.Destroy()
5. 选择文件对话框(FileDialog)
使用起来非常简单:
dlg = wx.FileDialog(self,
message="Yes, select a place ",
wildcard="PNG(*.png)|*.png" ,
style=wx.SAVE
)
savefile = ''
if dlg.ShowModal() == wx.ID_OK:
savefile = dlg.GetPath()
try:
os.remove(self.filename)
except:
pass
self.img.SaveFile(savefile, wx.BITMAP_TYPE_PNG)
self.filename = savefile
dlg.Destroy()
6. 选择文件夹对话框(DirDialog)
dialog = wx.DirDialog(None, 'Choose a directory: ',
style = wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
for itemid in range(self.list.GetItemCount()):
self.savechart(itemid, graphpath)
dialog.Destroy()
四、一些技巧
1. 设置快捷键
比如,希望按F5执行某个操作,可以在__init__函数中使用如下方法:
acceltbl = wx.AcceleratorTable([(wx.ACCEL_NORMAL, wx.WXK_F5, self.btnrun.GetId())])
self.SetAcceleratorTable(acceltbl)
还有一种很常用的情况,就是按ESC键关闭窗口。我们知道,有一种非常简单的办法就是使用SetId(wx.ID_CANCEL)方法,如:
self.btncancel = wx.Button(self.panel1, -1, 'Cancel', wx.Point(380, 280))
self.btncancel.SetId(wx.ID_CANCEL)
这样,按ESC键时,将会关闭当前Dialog,注意!这里是说Dialog,即继承自wx.Dialog的窗口对象,对于wx.Frame使用SetId似乎没有效果。
2. 使用定时器timer
在《wxPythonInAction》18章有个例子,如下:
import wx
import time
class ClockWindow(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.timer.Start(1000)
def Draw(self, dc):
t = time.localtime(time.time())
st = time.strftime("%I:%M:%S", t)
w, h = self.GetClientSize()
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
dc.SetFont(wx.Font(30, wx.SWISS, wx.NORMAL, wx.NORMAL))
tw, th = dc.GetTextExtent(st)
dc.DrawText(st, (w-tw)/2, (h)/2 - th/2)
def OnTimer(self, evt):
dc = wx.BufferedDC(wx.ClientDC(self))
self.Draw(dc)
def OnPaint(self, evt):
dc = wx.BufferedPaintDC(self)
self.Draw(dc)
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="wx.Timer")
ClockWindow(self)
app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()
3. 使用多线程时你必须知道的:wx.CallAfter
在wxpython中编写多线程案例时特别需要注意,线程中通知窗口对象更新状态时,必须使用wx.CallAfter。同样是18章的例子:
import wx
import threading
import random
class WorkerThread(threading.Thread):
"""
This just simulates some long-running task that periodically sends
a message to the GUI thread.
"""
def __init__(self, threadNum, window):
threading.Thread.__init__(self)
self.threadNum = threadNum
self.window = window
self.timeToQuit =<
发表评论
import wx
import sys, glob, random
import data
class DemoFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, -1,
"wx.ListCtrl in wx.LC_REPORT mode",
size=(600,400))
il = wx.ImageList(16,16, True)
for name in glob.glob("smicon??.png"):
bmp = wx.Bitmap(name, wx.BITMAP_TYPE_PNG)
il_max = il.Add(bmp)
self.list = wx.ListCtrl(self, -1, style=wx.LC_REPORT)
self.list.AssignImageList(il, wx.IMAGE_LIST_SMALL)
# Add some columns
for col, text in enumerate(data.columns):
self.list.InsertColumn(col, text)
# add the rows
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)
# give each item a random image
img = random.randint(0, il_max)
self.list.SetItemImage(index, img, img)
# set the width of the columns in various ways
self.list.SetColumnWidth(0, 120)
self.list.SetColumnWidth(1, wx.LIST_AUTOSIZE)
self.list.SetColumnWidth(2, wx.LIST_AUTOSIZE)
self.list.SetColumnWidth(3, wx.LIST_AUTOSIZE_USEHEADER)
app = wx.PySimpleApp()
frame = DemoFrame()
frame.Show()
app.MainLoop()
while itemid <> -1:
#Do something
itemid = self.list.GetNextSelected(itemid)
itemtext = self.list.GetItem(0, 1).Text
def OnContextMenu(self, event):
if not hasattr(self, "popupStop"):
self.popupStop = wx.NewId()
self.popupPropery = wx.NewId()
self.Bind(wx.EVT_MENU, self.OnPopupStop, id = self.popupStop)
self.Bind(wx.EVT_MENU, self.OnPopupProperty, id = self.popupPropery)
# 创建菜单
menu = wx.Menu()
itemStop = wx.MenuItem(menu, self.popupStop, "Stop")
itemProperty = wx.MenuItem(menu, self.popupPropery, 'Property')
menu.AppendItem(itemStop)
menu.AppendItem(itemProperty)
itemProperty.Enable(False)#默认让属性按钮变成无效状态
if itemid == -1:#如果没有选中任何项
itemStop.Enable(False)
else:
itemStop.Enable(False)
itemProperty.Enable(True)
#到这里才弹出菜单
self.PopupMenu(menu)
#最后注意销毁前面创建的菜单
menu.Destroy()
dlg = wx.FileDialog(self,
message="Yes, select a place ",
wildcard="PNG(*.png)|*.png" ,
style=wx.SAVE
)
savefile = ''
if dlg.ShowModal() == wx.ID_OK:
savefile = dlg.GetPath()
try:
os.remove(self.filename)
except:
pass
self.img.SaveFile(savefile, wx.BITMAP_TYPE_PNG)
self.filename = savefile
dlg.Destroy()
dialog = wx.DirDialog(None, 'Choose a directory: ',
style = wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON)
if dialog.ShowModal() == wx.ID_OK:
for itemid in range(self.list.GetItemCount()):
self.savechart(itemid, graphpath)
dialog.Destroy()
self.SetAcceleratorTable(acceltbl)
self.btncancel.SetId(wx.ID_CANCEL)
import wx
import time
class ClockWindow(wx.Window):
def __init__(self, parent):
wx.Window.__init__(self, parent)
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.timer = wx.Timer(self)
self.Bind(wx.EVT_TIMER, self.OnTimer, self.timer)
self.timer.Start(1000)
def Draw(self, dc):
t = time.localtime(time.time())
st = time.strftime("%I:%M:%S", t)
w, h = self.GetClientSize()
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
dc.SetFont(wx.Font(30, wx.SWISS, wx.NORMAL, wx.NORMAL))
tw, th = dc.GetTextExtent(st)
dc.DrawText(st, (w-tw)/2, (h)/2 - th/2)
def OnTimer(self, evt):
dc = wx.BufferedDC(wx.ClientDC(self))
self.Draw(dc)
def OnPaint(self, evt):
dc = wx.BufferedPaintDC(self)
self.Draw(dc)
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title="wx.Timer")
ClockWindow(self)
app = wx.PySimpleApp()
frm = MyFrame()
frm.Show()
app.MainLoop()
import wx
import threading
import random
class WorkerThread(threading.Thread):
"""
This just simulates some long-running task that periodically sends
a message to the GUI thread.
"""
def __init__(self, threadNum, window):
threading.Thread.__init__(self)
self.threadNum = threadNum
self.window = window
self.timeToQuit =<
发表评论
-
ADO编程实用宝典
2009-05-08 13:05 1472目录 ADO编程实用宝典 目录 一引入A ... -
创建ACCESS的存储过程
2008-09-11 22:52 4795在Access自身的帮助中看到了Create Procedu ... -
实现服务器端的多线程SOCKET Server
2008-09-11 16:45 3408实现服务器端的多线程SOCKET Server 想要实现 ... -
轻量级xml读写模块 tinyXML
2008-09-11 16:32 2895文档和使用例子: http://www.grinningl ... -
基于TinyXML的XML文档操作(部分测试代码)
2008-09-11 16:31 2431#include <stdio.h> #incl ... -
使用tinyxml类解析XML
2008-09-11 16:26 2444读取和设置xml配置文件是最常用的操作,试用了几个C++的XM ... -
用VB制作网站登陆器
2008-08-25 20:59 4093Private Sub Command1_Click() Wb ... -
vb+Webbrowser控件详解
2008-08-25 20:54 3280方法 说明 GoBack 相当 ... -
VB自动提交表单问题
2008-08-25 14:32 2471需要知道表单名称呢,比如 <Form name=&quo ... -
BBS灌水机脚本(vb scritp, telnet, bbs, sterm)
2008-08-16 11:32 2510'****************************** ... -
c++下载网页的代码,VC6.0编译通过
2008-05-30 19:21 3854#include <winsock2.h> ... -
【译】C/S 多线程Socket类
2008-05-30 19:16 1668Multi-threaded Client/Server So ... -
C++ Socket Class for Windows
2008-05-30 18:59 1630Here, I present the source c ... -
C++ socket程序
2008-05-30 17:58 11510C++ socket程序 下面是一个C++调用windows ... -
字符串提取
2008-05-05 11:24 1298Function bTest(ByVal s As Strin ... -
VB用正则表达式提取网页中的链接
2008-05-05 10:37 2901VBScript code Function getUrl ... -
利用VB提取HTML文件中的EMAIL地址
2008-05-05 09:53 1187电子邮件(EMAIL)是INTERNET上应用最广泛的一种服务 ... -
VB6.0如何使用正则表达式
2008-05-04 20:39 8006最近在用VB6解决一个网页解析的应用,涉及到了正则。如何在VB ... -
VB写一个IE插件
2008-05-04 18:20 3063Q: 就类似于3721的插件一样,当用户浏览我的网站的时候,提 ... -
破解VisualStudio2005(vs2005) 的180天限制
2008-04-19 11:53 4556中文版本的软件本身是正式版,但内置的序列号却是180天试用版的 ...
相关推荐
### wxPython 学习笔记 #### 一、wxPython 概述 wxPython 是 Python 的一个 GUI 库,它允许开发者使用 Python 编写跨平台的桌面应用程序。它基于 C++ 开发的 wxWidgets 库,并提供了丰富的组件库,使得开发者能够...
您可以在几分钟内编写一段...这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。
1,导入 wxpython 库 import wx 2,建立窗体构造类 class 名字(wx.Frame): def __init__(self, parent, id): wx.Frame.__init__(self, parent, id, ‘工具’,size=(300, 200)) 3,建立 面板 panel = wx.Panel(self...
wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序。它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。和...
Python学习资源打包下载,共包含9个文件,7个Python文档+2个wxPython文档: Dive Into Python.chm ...Python学习笔记整理.chm 简明python教程.chm wxpython-2.8.7.1-api.chm wxpython-in-action-zh.pdf
本中文教程主要翻译自《wxPython in Action》,不仅包含了完整的教程内容,还加入了目录、阅读笔记以及对官方文档的翻译内容,适合初学者学习wxPython编程。 首先,课程介绍了wxPython的基础知识。学习wxPython的第...
wxPython教程是由TutorialsPoint(I)Pvt.Ltd出版的一套完整的教学内容,用于帮助新手学习如何使用wxPython进行桌面GUI应用程序的开发。wxPython是wxWidgets和Python编程库的结合体,提供了GUI编程的基础,并涵盖了从...
根据提供的文件信息,我们可以提炼出以下知识点: ### wxPython基础入门 ...这些内容是学习wxPython及进行Python GUI开发的基石,熟练掌握它们将有助于开发出更加高效和规范的图形用户界面应用程序。
在Python学习笔记4中,我们进入了编程实践的领域,特别是关注如何使用Python创建一个窗口程序。这涉及到Python的图形用户界面(GUI)编程,通常通过使用特定的库或模块来实现。在这个例子中,我们将使用wxPython库,...
本文档是关于Python编程的学习笔记,涵盖多种应用场景的编程案例,如文件管理和归档、图像捕捉与社交网络整合等功能实现,适用于所有希望深入学习Python技术细节的专业人士。详细地讨论了日志记录、自动化图像处理...
通过以上的知识点介绍,我们不仅能够理解如何使用wxPython库开发GUI应用程序,还能够学习到如何组织代码、处理文件输入输出以及理解GUI组件的使用。这对于初学者来说,是一个很好的入门实例,能够为开发更复杂的GUI...
根据提供的文件信息,这份文档是一份Python学习笔记,包含了大量的关于Python编程语言的技术知识点。以下是从标题、描述、标签以及部分内容中提取的相关知识点。 标题和描述中指出这份笔记是关于Python的,且具体...
【Python学习笔记(1)】 Python是一种高级编程语言,以其简洁、易读的语法和强大的功能而受到广大程序员的喜爱。这篇学习笔记将涵盖Python的基础知识,包括安装、基本概念、运算符与表达式、控制流、函数、模块、...
GUI编程方面,Python库如Tkinter、wxPython等可以帮助开发者创建图形用户界面。Python甚至可以被嵌入到其他C/C++程序中,提供脚本化的功能,增加程序的灵活性。 Python的解释型特性意味着它不需要预先编译即可运行...
### Python学习笔记知识点梳理 #### 一、Python基础学习概览 - **Python的基本语法**: - 变量和数据类型(数字、字符串、布尔值等)。 - 运算符(算术运算符、比较运算符、逻辑运算符等)。 - 控制结构(条件...
PyQt 是 python 和 Qt 的绑定。我们知道,在 python 中有很多 GUI 的库,...的 Tkinter,还有些更加强大的外部库,比如 wxpython,PyGTK,PyQt 等等,其中 PyQt 是基于 Qt 的一个 python GUI 库,可以用于快速开发。
【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:一个文献阅读笔记管理软件,通过此软件可直接打开pdf,在pdf上做记号,...
- **版权说明**:虽然文档为翻译性质的学习笔记,但仍需尊重译者的劳动成果,未经允许不得用于商业用途。 ### 五、项目历史与发展 - **项目启动**:2007年10月03日,Cliff Peng开始从pythontik.com下载翻译稿并...
总之,《笔记生成源码+所需资源.rar》是一个全面的学习和实践资源,涵盖了软件开发的多个重要方面,从编程到设计,再到数据管理和用户体验。无论是初学者还是经验丰富的开发者,都能从中获得宝贵的实践经验。