`
hereson
  • 浏览: 1450959 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

wxpython学习笔记

阅读更多

出处: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 

wxPython frame的布局详细解释(一) 

wxPython frame的布局详细解释(二) 

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(380280))
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 
=<
分享到:
评论

相关推荐

    wxPython 学习笔记

    ### wxPython 学习笔记 #### 一、wxPython 概述 wxPython 是 Python 的一个 GUI 库,它允许开发者使用 Python 编写跨平台的桌面应用程序。它基于 C++ 开发的 wxWidgets 库,并提供了丰富的组件库,使得开发者能够...

    wxPython学习笔记

    您可以在几分钟内编写一段...这篇文章是关于 wxPython,但 wxPython 实际是两件事物的组合体:Python 脚本语言和 GUI 功能的 wxWindows 库(关于 wxWindows 的介绍,请参阅 developerWorks上的 “细述 wxWindows” )。

    wxpython 学习笔记 第一天

    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学习笔记(推荐查看)

    wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序。它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。和...

    Python与wxPython学习资源打包下载

    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中文教程

    本中文教程主要翻译自《wxPython in Action》,不仅包含了完整的教程内容,还加入了目录、阅读笔记以及对官方文档的翻译内容,适合初学者学习wxPython编程。 首先,课程介绍了wxPython的基础知识。学习wxPython的第...

    wxpython tutorial 教程

    wxPython教程是由TutorialsPoint(I)Pvt.Ltd出版的一套完整的教学内容,用于帮助新手学习如何使用wxPython进行桌面GUI应用程序的开发。wxPython是wxWidgets和Python编程库的结合体,提供了GUI编程的基础,并涵盖了从...

    wxpython中文版

    根据提供的文件信息,我们可以提炼出以下知识点: ### wxPython基础入门 ...这些内容是学习wxPython及进行Python GUI开发的基石,熟练掌握它们将有助于开发出更加高效和规范的图形用户界面应用程序。

    Python学习笔记4.docx

    在Python学习笔记4中,我们进入了编程实践的领域,特别是关注如何使用Python创建一个窗口程序。这涉及到Python的图形用户界面(GUI)编程,通常通过使用特定的库或模块来实现。在这个例子中,我们将使用wxPython库,...

    Python学习笔记:多场景编程实践与项目应用

    本文档是关于Python编程的学习笔记,涵盖多种应用场景的编程案例,如文件管理和归档、图像捕捉与社交网络整合等功能实现,适用于所有希望深入学习Python技术细节的专业人士。详细地讨论了日志记录、自动化图像处理...

    Python中使用wxPython开发的一个简易笔记本程序实例

    通过以上的知识点介绍,我们不仅能够理解如何使用wxPython库开发GUI应用程序,还能够学习到如何组织代码、处理文件输入输出以及理解GUI组件的使用。这对于初学者来说,是一个很好的入门实例,能够为开发更复杂的GUI...

    Python学习笔记(20210930170516).pdf

    根据提供的文件信息,这份文档是一份Python学习笔记,包含了大量的关于Python编程语言的技术知识点。以下是从标题、描述、标签以及部分内容中提取的相关知识点。 标题和描述中指出这份笔记是关于Python的,且具体...

    Python学习笔记 (1).doc

    【Python学习笔记(1)】 Python是一种高级编程语言,以其简洁、易读的语法和强大的功能而受到广大程序员的喜爱。这篇学习笔记将涵盖Python的基础知识,包括安装、基本概念、运算符与表达式、控制流、函数、模块、...

    关于Python的个人学习笔记

    GUI编程方面,Python库如Tkinter、wxPython等可以帮助开发者创建图形用户界面。Python甚至可以被嵌入到其他C/C++程序中,提供脚本化的功能,增加程序的灵活性。 Python的解释型特性意味着它不需要预先编译即可运行...

    python学习笔记

    ### Python学习笔记知识点梳理 #### 一、Python基础学习概览 - **Python的基本语法**: - 变量和数据类型(数字、字符串、布尔值等)。 - 运算符(算术运算符、比较运算符、逻辑运算符等)。 - 控制结构(条件...

    PyQt学习笔记

    PyQt 是 python 和 Qt 的绑定。我们知道,在 python 中有很多 GUI 的库,...的 Tkinter,还有些更加强大的外部库,比如 wxpython,PyGTK,PyQt 等等,其中 PyQt 是基于 Qt 的一个 python GUI 库,可以用于快速开发。

    基于 Python 实现的文献阅读笔记管理软件

    【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:一个文献阅读笔记管理软件,通过此软件可直接打开pdf,在pdf上做记号,...

    wxpyhton中文

    - **版权说明**:虽然文档为翻译性质的学习笔记,但仍需尊重译者的劳动成果,未经允许不得用于商业用途。 ### 五、项目历史与发展 - **项目启动**:2007年10月03日,Cliff Peng开始从pythontik.com下载翻译稿并...

    笔记生成源码+所需资源.rar

    总之,《笔记生成源码+所需资源.rar》是一个全面的学习和实践资源,涵盖了软件开发的多个重要方面,从编程到设计,再到数据管理和用户体验。无论是初学者还是经验丰富的开发者,都能从中获得宝贵的实践经验。

Global site tag (gtag.js) - Google Analytics