wxPython中文教程入门实例
wxPython中文教程入门实例
wx.Window是一个基类,许多构件从它继承。包括wx.Frame构件。
可以在所有的子类中使用wx.Window的方法。
wxPython的几种方法:
*SetTitle(stringtitle)——设置窗口标题。只可用于框架和对话框。
*SetToolTip(wx.ToolTiptip)——为窗口添加提示。
*SetSize(wx.Sizesize)——设置窗口的尺寸。
*SetPosition(wx.Pointpos)——设置窗口出现的位置。
*Show(show=True)——显示或隐藏窗口。其中的参数可以为True或False。
*Move(wx.Pointpos)——将窗口移动到指定位置。
*SetCursor(wx.StockCursorid)——设置窗口的鼠标指针样式。
例子:
importwx app=wx.PySimpleApp() frame=wx.Frame(None,-1,'') frame.SetToolTip(wx.ToolTip('Thisisaframe')) frame.SetCursor(wx.StockCursor(wx.CURSOR_MAGNIFIER)) frame.SetPosition(wx.Point(0,0)) frame.SetSize(wx.Size(300,250)) frame.SetTitle('simple2.py') frame.Show() app.MainLoop()
创建了一个"Thisisaframe"提示。鼠标指针被设置为放大镜样式。
可用的鼠标指针样式有:
wx.CURSOR_ARROW wx.CURSOR_RIGHT_ARROW wx.CURSOR_BLANK wx.CURSOR_BULLSEYE wx.CURSOR_CHAR wx.CURSOR_CROSS wx.CURSOR_HAND wx.CURSOR_IBEAM wx.CURSOR_LEFT_BUTTON wx.CURSOR_MAGNIFIER wx.CURSOR_MIDDLE_BUTTON wx.CURSOR_NO_ENTRY wx.CURSOR_PAINT_BRUSH wx.CURSOR_PENCIL wx.CURSOR_POINT_LEFT wx.CURSOR_POINT_RIGHT wx.CURSOR_QUESTION_ARROW wx.CURSOR_RIGHT_BUTTON wx.CURSOR_SIZENESW wx.CURSOR_SIZENS wx.CURSOR_SIZENWSE wx.CURSOR_SIZEWE wx.CURSOR_SIZING wx.CURSOR_SPRAYCAN wx.CURSOR_WAIT wx.CURSOR_WATCH wx.CURSOR_ARROWWAIT
把窗口放在了左上角,大小是300x250像素,标题被设置为"simple2.py"。
wx.Frame是一个容器构件。这意味着它可以容纳其它构件。它有如下的构造器:
wx.Frame(wx.Windowparent,id,stringtitle,wx.Pointpos=wx.DefaultPosition,wx.Sizesize=wx.DefaultSize,style=wx.DEFAULT_FRAME_STYEL,stringname='frame')
构造器是一种特殊的函数。它在对象创建时被调用。对于我们来说重要的是,我们打算创建一个新的构件时,只要简单的调用它的构造器就行了。Python允许参数有默认值。所以在wx.Frame中必须的参数就只剩下了parent、id和title了。如果你按顺序指定参数的值,那么你可以不必带上参数的名称。比如你想创建一个wx.Frame构件,它没有parent,标识符是100,标题是"Title",位置在(100,50)大小是(100,100):
frame=wx.Frame(None,100,'Title',wx.Point(100,50),wx.Size(100,100))
下面我们省略了pos参数。所以必须明确的提供size参数:
frame=wx.Frame(None,100,'Title',size=wx.Size(100,100))
例子,将使用其它有用的特性:
importwx defmain(): app=wx.PySimpleApp() frame=wx.Frame(None,-1,'Icon',wx.DefaultPosition,wx.Size(350,300)) frame.SetIcon(wx.Icon('Tipi.ico',wx.BITMAP_TYPE_ICO)) frame.Center() frame.Show() app.MainLoop() if__name__=='__main__': main()
Icon文件名为Iipi.ico。位于当前目录下。Icon构造器的第一个参数是Icon文件名,第二个参数是Icon文件类型。
就像你注意到的,程序的结构发生了改变。这样才符合Python编程的标准。
在Python中,__name__是一个特殊的变量。更复杂的程序通常由几个文件组成,但仅有一个文件用于开启程序。对于这个文件,当你直接执行它时,Python设置__name__变量的值为'__main__'。所以,如果你双击icon.py或从命令行直接执行它,__name__变量的值就会等于__main__。main()函数也就会被调用。
创建一个菜单栏在wxPython中相当简单。我们将讨论给菜单栏添加菜单、为已经存在的菜单添加子菜单。所有菜单都有菜单项组成。菜单项可以是常规项、复选项以及单选项。
先来创建一个菜单栏:
menubar=wx.MenuBar()
接着创建我们的菜单:
file=wx.Menu() edit=wx.Menu() help=wx.Menu()
然后为菜单添加菜单项。做这件事有两种方式:
file.Append(101,'&Open','Openanewdocument') file.Append(102,'&Save','Savethedocument')
可以使用横线来分隔逻辑区域:
file.AppendSeparator()
如果想在菜单中使用Icon,你需要手工创建MenuItem对象:
quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','QuittheApplication') quit.SetBitmap(wx.Image('stock_exit-16.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap()) file.AppendItem(quit)
wxPython工具包只能把bitmap图片用于菜单,所以我们需要把我们的PNG图片转换为bitmap格式。
然后把菜单加入到菜单栏:
menubar.Append(file,'&File') menubar.Append(edit,'&Edit') menubar.Append(help,'&Help')
最后在我们的程序类中创建菜单栏:
self.SetMenuBar(menubar)
把上述这些组成个小脚本:
#!/usr/bin/envpython #FileName:menu1.py importwx classMyMenu(wx.Frame): def__init__(self,parent,ID,title): wx.Frame.__init__(self,parent,-1,title,wx.DefaultPosition,wx.Size(200,150)) menubar=wx.MenuBar() file=wx.Menu() edit=wx.Menu() help=wx.Menu() file.Append(101,'&Open','Openanewdocument') file.Append(102,'&Save','Savethedocument') file.AppendSeparator() quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','QuittheApplication') quit.SetBitmap(wx.Image('stock_exit-16.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap()) file.AppendItem(quit) menubar.Append(file,'&File') menubar.Append(edit,'&Edit') menubar.Append(help,'&Help') self.SetMenuBar(menubar) classMyApp(wx.App): defOnInit(self): frame=MyMenu(None,-1,'menu1.py') frame.Show(True) returnTrue app=MyApp(0) app.MainLoop()
到目前为止已经知道了如何定义默认的普通菜单项。
接下来看看如何明确的定义复选菜单项和单选菜单项:
edit.Append(201,'checkitem1','',wx.ITEM_CHECK) edit.Append(202,'checkitem2','',kind=wx.ITEM_CHECK) 或者 quit=wxMenuItem(file,105,'&Quit\tCtrl+Q','QuittheApplication',wx.ITEM_NORMAL)
其中那个参数被称为种类。
可选的种类有:
*wx.ITEM_NORMAL——默认
*wx.ITEM_CHECK——复选
*wx.ITEM_RADIO——单选
如果你想创建子菜单,要先创建一个菜单:
submenu=wx.Menu()
然后为此子菜单添加一些菜单项:
submenu.Append(301,'radioitem1',kind=wx.ITEM_RADIO) submenu.Append(302,'radioitem2',kind=wx.ITEM_RADIO) submenu.Append(303,'radioitem3',kind=wx.ITEM_RADIO)
把子菜单添加到某个菜单对象就成了:
edit.AppendMenu(203,'submenu',submenu)
最后,我们来看一下如何响应用户的动作。我们只是简单的感受一下。后面会有更详细的解释。
当用户选择了某个菜单项时,就产生了一个事件。我们必须提供一个事件处理器,用它反应相应的事件。在wxPython中处理事件是到目前为止我已知最优雅最简单的了。如果翻参考手册,你会发现wx.EVT_MENU处理在事件处理那章。
假如我们想为quit菜单项添加一个事件处理器:
wx.EVT_MENU(self,105,self.OnQuit)
需要提供三个信息。我们要把事件处理器绑定到的那个对象。这里是self,程序的主对象。与之相匹配的菜单项的id。以及处理事件的方法的名称。
对用户的动作做出反应的方法需要两个参数。第一个是方法定义于其中的那个对象。第二个是产生的事件。本例中,我们什么也不做,只是简单的关闭我们的程序:
defOnQuit(self,event):
self.Close()
下面的脚本会展示上面说的各种菜单项、子菜单以及一个简单的事件处理。
我讨厌程序窗口出现在角落里,所以加上了:
self.Centre()
这样窗口就会出现在屏幕的当中。
#!/usr/bin/python #FileName:menu2.py importwx classMyMenu(wx.Frame): def__init__(self,parent,ID,title): wx.Frame.__init__(self,parent,-1,title, wx.DefaultPosition,wx.Size(380,250)) menubar=wx.MenuBar() file=wx.Menu() edit=wx.Menu() help=wx.Menu() file.Append(101,'&Open','Openanewdocument') file.Append(102,'&Save','Savethedocument') file.AppendSeparator() quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','QuittheApplication') quit.SetBitmap(wx.Image('gtk-quit.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()) file.AppendItem(quit) edit.Append(201,'checkitem1','',wx.ITEM_CHECK) edit.Append(202,'checkitem2',kind=wx.ITEM_CHECK) submenu=wx.Menu() submenu.Append(301,'radioitem1',kind=wx.ITEM_RADIO) submenu.Append(302,'radioitem2',kind=wx.ITEM_RADIO) submenu.Append(303,'radioitem3',kind=wx.ITEM_RADIO) edit.AppendMenu(203,'submenu',submenu) menubar.Append(file,'&File') menubar.Append(edit,'&Edit') menubar.Append(help,'&Help') self.SetMenuBar(menubar) self.Centre() wx.EVT_MENU(self,105,self.OnQuit) defOnQuit(self,event): self.Close() classMyApp(wx.App): defOnInit(self): frame=MyMenu(None,-1,'menu2.py') frame.Show(True) returnTrue app=MyApp(0) app.MainLoop()
工具栏是一个集合了大多数常用命令和动作的构件。典型的象保存、打开、剪切、复制、粘贴、撤销、重复等。
目的是为了节省时间。从工具栏执行动作只需点击一下,而从菜单需要点击两下。
#!/usr/bin/envpython #FileName:toolbar.py importwx classMyToolBar(wx.Frame): def__init__(self,parent,ID,title): wx.Frame.__init__(self,parent,ID,title,wx.DefaultPosition,wx.Size(350,250)) vbox=wx.BoxSizer(wx.VERTICAL) toolbar=wx.ToolBar(self,-1,style=wx.TB_HORIZONTAL|wx.NO_BORDER) toolbar.AddSimpleTool(1,wx.Image('stock_new.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap(),'New','') toolbar.AddSimpleTool(2,wx.Image('stock_open.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap(),'Opne','') toolbar.AddSimpleTool(3,wx.Image('stock_save.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap(),'Save','') toolbar.AddSeparator() toolbar.AddSimpleTool(4,wx.Image('stock_exit.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap(),'Exit','') toolbar.Realize() vbox.Add(toolbar,0,border=5) self.SetSizer(vbox) self.statusbar=self.CreateStatusBar() self.Centre() wx.EVT_TOOL(self,1,self.OnNew) wx.EVT_TOOL(self,2,self.OnOpen) wx.EVT_TOOL(self,3,self.OnSave) wx.EVT_TOOL(self,4,self.OnExit) defOnNew(self,event): self.statusbar.SetStatusText('NewCommand') defOnOpen(self,event): self.statusbar.SetStatusText('OpenCommand') defOnSave(self,event): self.statusbar.SetStatusText('SaveCommand') defOnExit(self,event): self.Close() classMyApp(wx.App): defOnInit(self): frame=MyToolBar(None,-1,'toolbar.py') frame.Show(True) returnTrue app=MyApp(0) app.MainLoop()
wx.BoxSizer在后面的布局章节会解释到。工具栏构件通过三步创建。
首先,我们创建一个工具栏对象。
tollbar=wx.ToolBar(self,-1,style=wx.TB_HORIZONTAL|wx.NO_BORDER)
然后我们使用AddSimpleTool()方法为工具栏添加了几个工具。你在参考手册中找不到这个方法。它是一个wxPython扩展。这既是个诅语也是个祝福。它合Python编程变得容易。但另一方面,这些扩展没有被写入文档。你不得不通过浏览源代码、demo或者在邮件列表中提问来了解它们。
toolbar.AddSimpleTool(1,wx.Image('stock_new.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap(),'New','')
最后,我们调用Realize()方法。这个方法显示工具栏构件。
toolbar.Realize()
工具栏有好几个事件处理顺。当你点击工具栏上的图标时,就会产生一个wx.EVT_COMMAND_TOOL_CLICKED事件。我们把此事件绑定的某个具体的wx.EVT_TOOL处理器方法上。
为了显示相关的输出,我们创建了一个状态栏。
self.statusbar=self.CreateStatusBar()
这仍然是另外一个wxPython扩展。这样一旦我们点击工具栏按纽,状态栏就会显示相关信息。这是通过使用SetStatusText()方法达成的。
有两种基本的方法可以用来布置我们的构件。第一种是手工布置。我们通过在构造器中指定位置来摆放我们的构件。
#!/usr/bin/evnpython importwx classMyFrame(wx.Frame): def__init__(self,parent,ID,title): wx.Frame.__init__(self,parent,ID,title,wx.DefaultPosition,wx.Size(250,50)) panel=wx.Panel(self,-1) wx.Button(panel,-1,'Button1',(0,0)) wx.Button(panel,-1,'Button2',(80,0)) wx.Button(panel,-1,'Button3',(160,0)) classMyApp(wx.App): defOnInit(self): frame=MyFrame(None,-1,'layout.py') frame.Show(True) frame.Centre() app=MyApp(0) app.MainLoop()
当窗口大小改变时,按纽的大小和位置并不改变。这是手工设置构件位置的一个主要特征。第二种方法是使用布局管理器。这是现实程序中比较流行的方法。基本上你要使用sizer。我们将讨论:
*wx.BoxSizer
*wx.StaticBoxSizer
*wx.GridSizer
*wx.GridBagSizer
来写一个程序,它的窗口顶部的一行被三个按纽占据。这些按纽会随窗口的改变而改变。
#!/usr/bin/envpython #FileName:wxboxsizer.py importwx classMyFrame(wx.Frame): def__init__(self,parent,ID,title): wx.Frame.__init__(self,parent,ID,title,(-1,-1),wx.Size(250,50)) panel=wx.Panel(self,-1) box=wx.BoxSizer(wx.HORIZONTAL) box.Add(wx.Button(panel,-1,'Button1'),1) box.Add(wx.Button(panel,-1,'Button2'),1) box.Add(wx.Button(panel,-1,'Button3'),1) panel.SetSizer(box) self.Centre() classMyApp(wx.App): defOnInit(self): frame=MyFrame(None,-1,'wxboxsizer.py') frame.Show(True) returnTrue app=MyApp(0) app.MainLoop()
我既可水平的摆放构件,也可竖直的摆放。
box=wx.BoxSizer(integerorient)
其中的方向(orient)可以是wx.VERTICAL或wx.HORIZONTAL。将构件加入wx.BoxSizer要使用Add()方法。为了理解,我们来看一下它的参数。
Add(wx.Windowwindow,integerproportion=0,integerflag=0,integerborder=0)
其中的proportion参数定义了在定义的方向上构件改变的比例。假设我们有三个按纽,它们的proportion属性分别为0、1和2。它们被加入一个水平的wx.BoxSizer。proportion参数为0的按纽根本不发生变化。而这个参数值为2的按纽在水平方向改变的程序将是参数值为1的那个按纽的两倍。
flag参数可以更深入的设置构件的属性。我们可以控制构件之间的边框。我们可以在构件之间增加一些空白象素。在要使用边框的地方我们需要定义边界。我们可以使用|符号来连接它们。比如wx.LEFT|wx.BOTTOM。flag参数的值可以是:
*wx.LEFT
*wx.RIGHT
*wx.BOTTOM
*wx.TOP
*wx.ALL
如果我们使用wx.EXPAND标识,我们的构件将占据所有分配给它的空间。最后,我们还可以定义构件的对齐方式。有以下几种:
*wx.ALIGN_LEFT
*wx.ALIGN_RIGHT
*wx.ALIGN_TOP
*wx.ALIGN_BOTTOM
*wx.ALIGN_CENTER_VERTICAL
*wx.ALIGN_CENTER_HORIZONTAL
*wx.ALIGN_CENTER
例子:
#!/usr/bin/python #FileName:layout3.py importwx classMyFrame(wx.Frame): def__init__(self,parent,ID,title): wx.Frame.__init__(self,parent,ID,title,(-1,-1),wx.Size(450,300)) panel=wx.Panel(self,-1) box=wx.BoxSizer(wx.HORIZONTAL) box.Add(wx.Button(panel,-1,'Button1'),1,wx.ALL,5) box.Add(wx.Button(panel,-1,'Button2'),0,wx.EXPAND) box.Add(wx.Button(panel,-1,'Button3'),0,wx.ALIGN_CENTER) panel.SetSizer(box) self.Center() classMyApp(wx.App): defOnInit(self): frame=MyFrame(None,-1,'layout3.py') frame.Show(True) returnTrue app=MyApp(0) app.MainLoop()
这个例子中,我们仍旧是创建了三个按纽。第一个的周围有一些边界。它是唯一一个可以在水平方向改变大小的,当主窗口的大小改变时。第二个按纽占据了分配给它的所有空间。第三个在竖起方向据中对齐。
可以任意组合wx.BoxSizer。
例如,可以将几个水平的wx.BoxSizer放在一个竖起的wx.BoxSizer中或者相反。
这样就能产生复杂的布局。
#!/usr/bin/envpython #FileName:borders.py importwx classMyFrame(wx.Frame): def__init__(self,parent,id,title): wx.Frame.__init__(self,parent,id,title) vbox=wx.BoxSizer(wx.VERTICAL) hbox1=wx.BoxSizer(wx.HORIZONTAL) hbox2=wx.BoxSizer(wx.HORIZONTAL) pnl1=wx.Panel(self,-1,style=wx.SIMPLE_BORDER) pnl2=wx.Panel(self,-1,style=wx.RAISED_BORDER) pnl3=wx.Panel(self,-1,style=wx.SUNKEN_BORDER) pnl4=wx.Panel(self,-1,style=wx.DOUBLE_BORDER) pnl5=wx.Panel(self,-1,style=wx.STATIC_BORDER) pnl6=wx.Panel(self,-1,style=wx.NO_BORDER) hbox1.Add(pnl1,1,wx.EXPAND|wx.ALL,3) hbox1.Add(pnl2,1,wx.EXPAND|wx.ALL,3) hbox1.Add(pnl3,1,wx.EXPAND|wx.ALL,3) hbox2.Add(pnl4,1,wx.EXPAND|wx.ALL,3) hbox2.Add(pnl5,1,wx.EXPAND|wx.ALL,3) hbox2.Add(pnl6,1,wx.EXPAND|wx.ALL,3) vbox.Add(hbox1,1,wx.EXPAND) vbox.Add(hbox2,1,wx.EXPAND) self.SetSizer(vbox) self.Centre() classMyApp(wx.App): defOnInit(self): frame=MyFrame(None,-1,'borders.py') frame.Show(True) returnTrue app=MyApp(0) app.MainLoop()
在这个例子中,我们创建了一个两行三列的表格。我们创建了一个竖直的wx.BoxSizer和两个水平的wx.BoxSizer。我们只是简单的把两个水平的放进了那个竖直的中了。我们展示了六种可用的边框样式。边框是简单的窗口装饰品。注意其中两个边框样式只能在windows上使用。
边框:
*wx.SIMPLE_BORDER
*wx.RAISED_BORDER
*wx.SUNKEN_BORDER
*wx.DOUBLE_BORDER
*wx.STATIC_BORDER
*wx.NO_BORDER
wx.GridSizer使用两维的表格来布局它里面的东西。每个表格的宽度等于它里面最大那个构件的宽度,高度等于它里面高度最大的那个构件的高度。
wx.GridSizer(integerrows,integercols,integervgap,integerhgap)
在构造器中,设定行和列的数目以及构件的水平和竖直间距。
使用AddMany()方法将构件插入到表中。按照从左到右、从上到下的顺序。
#!/usr/bin/envpython #FileName:calculator.py importwx classMyFrame(wx.Frame): def__init__(self,parent,id,title): wx.Frame.__init__(self,parent,id,title,wx.DefaultPosition,wx.Size(300,250)) self.formula=False menubar=wx.MenuBar() file=wx.Menu() file.Append(22,'&Quit','ExitCalculator') menubar.Append(file,'&File') self.SetMenuBar(menubar) wx.EVT_MENU(self,22,self.OnClose) sizer=wx.BoxSizer(wx.VERTICAL) self.display=wx.TextCtrl(self,-1,'',style=wx.TE_RIGHT) sizer.Add(self.display,0,wx.EXPAND|wx.TOP|wx.BOTTOM,4) gs=wx.GridSizer(4,4,3,3) gs.AddMany([(wx.Button(self,20,'Cls'),0,wx.EXPAND), (wx.Button(self,21,'Bck'),0,wx.EXPAND), (wx.StaticText(self,-1,''),0,wx.EXPAND), (wx.Button(self,22,'Close'),0,wx.EXPAND), (wx.Button(self,1,'7'),0,wx.EXPAND), (wx.Button(self,2,'8'),0,wx.EXPAND), (wx.Button(self,3,'9'),0,wx.EXPAND), (wx.Button(self,4,'/'),0,wx.EXPAND), (wx.Button(self,5,'4'),0,wx.EXPAND), (wx.Button(self,6,'5'),0,wx.EXPAND), (wx.Button(self,7,'6'),0,wx.EXPAND), (wx.Button(self,8,'*'),0,wx.EXPAND), (wx.Button(self,9,'1'),0,wx.EXPAND), (wx.Button(self,10,'2'),0,wx.EXPAND), (wx.Button(self,11,'3'),0,wx.EXPAND), (wx.Button(self,12,'-'),0,wx.EXPAND), (wx.Button(self,13,'0'),0,wx.EXPAND), (wx.Button(self,14,'.'),0,wx.EXPAND), (wx.Button(self,15,'='),0,wx.EXPAND), (wx.Button(self,16,'+'),0,wx.EXPAND)]) sizer.Add(gs,1,wx.EXPAND) self.SetSizer(sizer) self.Centre() wx.EVT_BUTTON(self,20,self.OnClear) wx.EVT_BUTTON(self,21,self.OnBackspace) wx.EVT_BUTTON(self,22,self.OnClose) wx.EVT_BUTTON(self,1,self.OnSeven) wx.EVT_BUTTON(self,2,self.OnEight) wx.EVT_BUTTON(self,3,self.OnNine) wx.EVT_BUTTON(self,4,self.OnDivide) wx.EVT_BUTTON(self,5,self.OnFour) wx.EVT_BUTTON(self,6,self.OnFive) wx.EVT_BUTTON(self,7,self.OnSix) wx.EVT_BUTTON(self,8,self.OnMultiply) wx.EVT_BUTTON(self,9,self.OnOne) wx.EVT_BUTTON(self,10,self.OnTwo) wx.EVT_BUTTON(self,11,self.OnThree) wx.EVT_BUTTON(self,12,self.OnMinus) wx.EVT_BUTTON(self,13,self.OnZero) wx.EVT_BUTTON(self,14,self.OnDot) wx.EVT_BUTTON(self,15,self.OnEqual) wx.EVT_BUTTON(self,16,self.OnPlus) defOnClear(self,event): self.display.Clear() defOnBackspace(self,event): formula=self.display.GetValue() self.display.Clear() self.display.SetValue(formula[:-1]) defOnClose(self,event): self.Close() defOnDivide(self,event): ifself.formula: return self.display.AppendText('/') defOnMultiply(self,event): ifself.formula: return self.display.AppendText('*') defOnMinus(self,event): ifself.formula: return self.display.AppendText('-') defOnPlus(self,event): ifself.formula: return self.display.AppendText('+') defOnDot(self,event): ifself.formula: return self.display.AppendText('.') defOnEqual(self,event): ifself.formula: return formula=self.display.GetValue() self.formula=True try: self.display.Clear() output=eval(formula) self.display.AppendText(str(output)) exceptStandardError: self.display.AppendText("Error") defOnZero(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('0') defOnOne(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('1') defOnTwo(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('2') defOnThree(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('3') defOnFour(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('4') defOnFive(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('5') defOnSix(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('6') defOnSeven(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('7') defOnEight(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('8') defOnNine(self,event): ifself.formula: self.display.Clear() self.formula=False self.display.AppendText('9') classMyApp(wx.App): defOnInit(self): frame=MyFrame(None,-1,"calculator.py") frame.Show(True) self.SetTopWindow(frame) returnTrue app=MyApp(0) app.MainLoop()
输入的公式使用python的内置函数eval来处理。
output=eval(formula)
如果公式有错,就会显示一条错误信息。
请注意如何在Bck和Close按纽之间插入空白的。
只是简单的在那放了一个空的wx.StaticText。这是一个很常用的技巧。