如何完整卸载wxpython_wxpython学习笔记

一、简介

wxPython是Python编程语言的一个GUI工具箱。他使得Python程序员能够轻松的创建具有健壮、功能强大的图形用户界面的程序。它是Python语言对流行的wxWidgets跨平台GUI工具库的绑定。而wxWidgets是用C++语言写成的。和Python语言与wxWidgets GUI工具库一样,wxPython是开源软件。这意味着任何人都可以免费地使用它并且可以查看和修改它的源代码,或者贡献补丁,增加功能。wxPython是跨平台的。这意味着同一个程序可以不经修改地在多种平台上运行。现今支持的平台有:32位微软Windows操作系统、大多数Unix或类Unix系统、苹果Mac OS X。由于使用Python作为编程语言,wxPython编写简单、易于理解。

二、基本使用

基本使用的话到这个地址看已经很详细了,我没有必要重复一遍啦:

三、常用控件

1. 菜单(menu)

2. 页面布局(Sizer)

这个东东使用起来比较麻烦,参考以下页面吧:

3. Tab页面(notebook)

4. 列表控件(ListCtrl)

这个控件比较强大,是我比较喜欢使用的控件之一。在《wxPythonInAction》一书中第13章有介绍(想要该书电子版及附带源码的朋友可以问我要)

下面是list_report.py中提供的简单用法:

Code:ListCtrlimportwximportsys, glob, randomimportdataclassDemoFrame(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)fornameinglob.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 columnsforcol, textinenumerate(data.columns):

self.list.InsertColumn(col, text)#add the rowsforitemindata.rows:

index=self.list.InsertStringItem(sys.maxint, item[0])forcol, textinenumerate(item[1:]):

self.list.SetStringItem(index, col+1, text)#give each item a random imageimg=random.randint(0, il_max)

self.list.SetItemImage(index, img, img)#set the width of the columns in various waysself.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。

通过这两个方法,我们就可以遍历所有选中的项了:

Code : GetNextSelecteditemid=self.list.GetFirstSelected()whileitemid<>-1:#Do somethingitemid=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方法:

OnContextMenudefOnContextMenu(self, event):ifnothasattr(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)#默认让属性按钮变成无效状态ifitemid==-1:#如果没有选中任何项itemStop.Enable(False)else:

itemStop.Enable(False)

itemProperty.Enable(True)#到这里才弹出菜单self.PopupMenu(menu)#最后注意销毁前面创建的菜单menu.Destroy()

5. 选择文件对话框(FileDialog)

使用起来非常简单:

FileDialogdlg=wx.FileDialog(self, 

message="Yes, select a place

",

wildcard="PNG(*.png)|*.png",

style=wx.SAVE

)

savefile=''ifdlg.ShowModal()==wx.ID_OK:

savefile=dlg.GetPath()try:

os.remove(self.filename)except:passself.img.SaveFile(savefile, wx.BITMAP_TYPE_PNG)

self.filename=savefile

dlg.Destroy()

6. 选择文件夹对话框(DirDialog)

DirDialogdialog=wx.DirDialog(None,'Choose a directory:',

style=wx.DD_DEFAULT_STYLE|wx.DD_NEW_DIR_BUTTON)ifdialog.ShowModal()==wx.ID_OK:foritemidinrange(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章有个例子,如下:

wx.TimerimportwximporttimeclassClockWindow(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)defDraw(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)defOnTimer(self, evt):

dc=wx.BufferedDC(wx.ClientDC(self))

self.Draw(dc)defOnPaint(self, evt):

dc=wx.BufferedPaintDC(self)

self.Draw(dc)classMyFrame(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章的例子:

wx.CallAfterimportwximportthreadingimportrandomclassWorkerThread(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=threading.Event()

self.timeToQuit.clear()

self.messageCount=random.randint(10,20)

self.messageDelay=0.1+2.0*random.random()defstop(self):

self.timeToQuit.set()defrun(self):

msg="Thread %d iterating %d times with a delay of %1.4f\n"\%(self.threadNum, self.messageCount, self.messageDelay)

wx.CallAfter(self.window.LogMessage, msg)foriinrange(1, self.messageCount+1):

self.timeToQuit.wait(self.messageDelay)ifself.timeToQuit.isSet():breakmsg="Message %d from thread %d\n"%(i, self.threadNum)

wx.CallAfter(self.window.LogMessage, msg)else:

wx.CallAfter(self.window.ThreadFinished, self)classMyFrame(wx.Frame):def__init__(self):

wx.Frame.__init__(self, None, title="Multi-threaded GUI")

self.threads=[]

self.count=0

panel=wx.Panel(self)

startBtn=wx.Button(panel,-1,"Start a thread")

stopBtn=wx.Button(panel,-1,"Stop all threads")

self.tc=wx.StaticText(panel,-1,"Worker Threads: 00")

self.log=wx.TextCtrl(panel,-1,"",

style=wx.TE_RICH|wx.TE_MULTILINE)

inner=wx.BoxSizer(wx.HORIZONTAL)

inner.Add(startBtn, 0, wx.RIGHT,15)

inner.Add(stopBtn, 0, wx.RIGHT,15)

inner.Add(self.tc, 0, wx.ALIGN_CENTER_VERTICAL)

main=wx.BoxSizer(wx.VERTICAL)

main.Add(inner, 0, wx.ALL,5)

main.Add(self.log,1, wx.EXPAND|wx.ALL,5)

panel.SetSizer(main)

self.Bind(wx.EVT_BUTTON, self.OnStartButton, startBtn)

self.Bind(wx.EVT_BUTTON, self.OnStopButton, stopBtn)

self.Bind(wx.EVT_CLOSE,  self.OnCloseWindow)

self.UpdateCount()defOnStartButton(self, evt):

self.count+=1thread=WorkerThread(self.count, self)

self.threads.append(thread)

self.UpdateCount()

thread.start()defOnStopButton(self, evt):

self.StopThreads()

self.UpdateCount()defOnCloseWindow(self, evt):

self.StopThreads()

self.Destroy()defStopThreads(self):whileself.threads:

thread=self.threads[0]

thread.stop()

self.threads.remove(thread)defUpdateCount(self):

self.tc.SetLabel("Worker Threads: %d"%len(self.threads))defLogMessage(self, msg):

self.log.AppendText(msg)defThreadFinished(self, thread):

self.threads.remove(thread)

self.UpdateCount()

app=wx.PySimpleApp()

frm=MyFrame()

frm.Show()

app.MainLoop()

4. 需要在程序中启动另外一个GUI程序,而有不失去主窗口的焦点?

通常,我们调用os.popen运行其他外部程序是没有问题的。但是在wxpython中,将会让wx失去当前的焦点,即使得打开的程序成为了一个模式对话框。要解决这个问题可以使用wx自带的方法,wx.Execute。

wx.Execute('notepad')

五、学习资源

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值