wx.Window 是一个基类,很多构件从它担当。包罗 wx.Frame 构件。手艺上那意味着,我们可以在一切的子类中应用
wx.Window 的行动。我们那边引睹它的几种行动:
* SetTitle( string title ) ——
设置窗口题目。只可用于框架和对话框。
* SetToolTip( wx.ToolTip tip )
—— 为窗口增添提示。
* SetSize( wx.Size size ) ——
设置窗口的尺寸。
* SetPosition( wx.Point pos )
—— 设置窗口出现的位置。
* Show( show = True ) ——
发挥分解或躲躲窗口。其中的参数可觉得 True 或False。
* Move( wx.Point pos ) ——
将窗口移动到指定位置。
* SetCursor( wx.StockCursor id )
—— 设置窗口的鼠标指针样式。import wxapp =
wx.PySimpleApp()frame = wx.Frame( None, -1, '' )
frame.SetToolTip( wx.ToolTip( 'This is a frame' ) )
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()我们建坐了一个"This is a
frame"提示。鼠标指针被设置为放大年夜镜样式。可用的鼠标指针样式有: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.Window parent, id, string title, wx.Point
pos=wx.DefaultPosition, wx.Size size=wx.DefaultSize, style =
wx.DEFAULT_FRAME_STYEL, string name='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))上里的例子,我们将应用其它有效的特性:import
wxdef main():
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',
'Open a new document' )
file.Append( 102, '&Save', 'Save the document'
)我们可以应用横线来分隔逻辑区域:file.AppendSeparator()若是您想在菜单中应用 Icon,您需要手工建坐
MenuItem 对象:quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','Quit the
Application')
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/env python
# FileName: menu1.pyimport wxclass MyMenu( 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','Open a new document')
file.Append(102,'&Save','Save the document')
file.AppendSeparator()
quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','Quit the
Application')
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 )
class MyApp(wx.App):
def OnInit(self):
frame=MyMenu(None,-1,'menu1.py')
frame.Show(True)
return True
app=MyApp(0)
app.MainLoop()到古朝为止我们已知道了怎样界说默许的一般菜单项。接下来让我们看看怎样明确的界说复选菜单项和单选菜单项:edit.Append(
201, 'check item1', '', wx.ITEM_CHECK )
edit.Append( 202, 'check item2', '', kind=wx.ITEM_CHECK
)或quit=wxMenuItem(file,105,'&Quit\tCtrl+Q','Quit the
Application', wx.ITEM_NORMAL)其中阿谁参数被称为种类。可选的种类有:* wx.ITEM_NORMAL
—— 默许
* wx.ITEM_CHECK —— 复选
* wx.ITEM_RADIO ——
单选若是您想建坐子菜单,要先建坐一个菜单:submenu =
wx.Menu()然后为此子菜单增添一些菜单项:submenu.Append( 301, 'radio item1', kind=
wx.ITEM_RADIO )
submenu.Append( 302, 'radio item2', kind=wx.ITEM_RADIO )
submenu.Append( 303, 'radio item3', kind=wx.ITEM_RADIO
)把子菜单增添到某个菜单对象便成了:edit.AppendMenu( 203, 'submenu', submenu
)最后,我们来看一下怎样吸应用户的动做。我们只是简单的感受一下。后里会有更具体的诠释。当用户选择了某个菜单项时,便产生了一个事件。我们必须供给一个事件措置器,用它反映响应的事件。在
wxPython 中措置事件是到古朝为止我已知最高雅最简单的了。若是翻参考手册,您会发现 wx.EVT_MENU
措置在事件措置那章。假设我们想为 quit 菜单项增添一个事件措置器:wx.EVT_MENU( self, 105,
self.OnQuit )我们需要供给三个信息。我们要把事件措置器绑定到的阿谁对象。那边是 self,
挨次的主对象。与之相婚配的菜单项的
id。以及措置事件的行动的称吸。对用户的动做做出反映的行动需要两个参数。第一个是行动界说于其中的阿谁对象。第两个是产生的事件。本例中,我们什么也不做,只是简单的封闭我们的挨次:def
OnQuit( self, event ):
self.Close()
上里的脚本会闪现上里说的各类菜单项、子菜单以及一个简单的事件措置。我厌恶挨次窗口出此刻角落里,所以加上了:self.Centre()那样窗口便会出此刻屏幕的傍边。#!/usr/bin/python
# FileName: menu2.pyimport wx
class MyMenu(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', 'Open a new
document')
file.Append(102, '&Save', 'Save the document')
file.AppendSeparator()quit = wx.MenuItem(file, 105,
'&Quit\tCtrl+Q', 'Quit the Application')
quit.SetBitmap(wx.Image ('gtk-quit.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap())
file.AppendItem(quit)edit.Append(201, 'check item1', '',
wx.ITEM_CHECK)
edit.Append(202, 'check item2', kind= wx.ITEM_CHECK)submenu =
wx.Menu()
submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)
submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)
submenu.Append(303, 'radio item3', 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)def OnQuit(self, event):
self.Close()class MyApp(wx.App):
def OnInit(self):
frame = MyMenu(None, -1, 'menu2.py')
frame.Show(True)
return Trueapp = MyApp(0)
app.MainLoop()
建坐一个菜单栏在wxPython中相当简单。我们将商洽给菜单栏增添菜单、为已存在的菜单增添子菜单。一切菜单皆有菜单项构成。菜单项可所以常规项、复选项以及单选项。先来建坐一个菜单栏:menubar
= wx.MenuBar()接着建坐我们的菜单:file = wx.Menu()
edit = wx.Menu()
help = wx.Menu()然后为菜单增添菜单项。做那件事有两种方法:file.Append( 101, '&Open',
'Open a new document' )
file.Append( 102, '&Save', 'Save the document'
)我们可以应用横线来分隔逻辑区域:file.AppendSeparator()若是您想在菜单中应用 Icon,您需要手工建坐
MenuItem 对象:quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','Quit the
Application')
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/env python
# FileName: menu1.pyimport wxclass MyMenu( 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','Open a new document')
file.Append(102,'&Save','Save the document')
file.AppendSeparator()
quit=wx.MenuItem(file,105,'&Quit\tCtrl+Q','Quit the
Application')
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 )
class MyApp(wx.App):
def OnInit(self):
frame=MyMenu(None,-1,'menu1.py')
frame.Show(True)
return True
app=MyApp(0)
app.MainLoop()到古朝为止我们已知道了怎样界说默许的一般菜单项。接下来让我们看看怎样明确的界说复选菜单项和单选菜单项:edit.Append(
201, 'check item1', '', wx.ITEM_CHECK )
edit.Append( 202, 'check item2', '', kind=wx.ITEM_CHECK
)或quit=wxMenuItem(file,105,'&Quit\tCtrl+Q','Quit the
Application', wx.ITEM_NORMAL)其中阿谁参数被称为种类。可选的种类有:* wx.ITEM_NORMAL
—— 默许
* wx.ITEM_CHECK —— 复选
* wx.ITEM_RADIO ——
单选若是您想建坐子菜单,要先建坐一个菜单:submenu =
wx.Menu()然后为此子菜单增添一些菜单项:submenu.Append( 301, 'radio item1', kind=
wx.ITEM_RADIO )
submenu.Append( 302, 'radio item2', kind=wx.ITEM_RADIO )
submenu.Append( 303, 'radio item3', kind=wx.ITEM_RADIO
)把子菜单增添到某个菜单对象便成了:edit.AppendMenu( 203, 'submenu', submenu
)最后,我们来看一下怎样吸应用户的动做。我们只是简单的感受一下。后里会有更具体的诠释。当用户选择了某个菜单项时,便产生了一个事件。我们必须供给一个事件措置器,用它反映响应的事件。在
wxPython 中措置事件是到古朝为止我已知最高雅最简单的了。若是翻参考手册,您会发现 wx.EVT_MENU
措置在事件措置那章。假设我们想为 quit 菜单项增添一个事件措置器:wx.EVT_MENU( self, 105,
self.OnQuit )我们需要供给三个信息。我们要把事件措置器绑定到的阿谁对象。那边是 self,
挨次的主对象。与之相婚配的菜单项的
id。以及措置事件的行动的称吸。对用户的动做做出反映的行动需要两个参数。第一个是行动界说于其中的阿谁对象。第两个是产生的事件。本例中,我们什么也不做,只是简单的封闭我们的挨次:def
OnQuit( self, event ):
self.Close()
上里的脚本会闪现上里说的各类菜单项、子菜单以及一个简单的事件措置。我厌恶挨次窗口出此刻角落里,所以加上了:self.Centre()那样窗口便会出此刻屏幕的傍边。#!/usr/bin/python
# FileName: menu2.pyimport wx
class MyMenu(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', 'Open a new
document')
file.Append(102, '&Save', 'Save the document')
file.AppendSeparator()quit = wx.MenuItem(file, 105,
'&Quit\tCtrl+Q', 'Quit the Application')
quit.SetBitmap(wx.Image ('gtk-quit.png',
wx.BITMAP_TYPE_PNG).ConvertToBitmap())
file.AppendItem(quit)edit.Append(201, 'check item1', '',
wx.ITEM_CHECK)
edit.Append(202, 'check item2', kind= wx.ITEM_CHECK)submenu =
wx.Menu()
submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)
submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)
submenu.Append(303, 'radio item3', 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)def OnQuit(self, event):
self.Close()class MyApp(wx.App):
def OnInit(self):
frame = MyMenu(None, -1, 'menu2.py')
frame.Show(True)
return Trueapp = MyApp(0)
app.MainLoop()
我们来写一个挨次,它的窗口顶部的一行被三个按纽占据。那些按纽会随窗口的篡改而篡改。#!/usr/bin/env
python
# FileName: wxboxsizer.pyimport wxclass MyFrame(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()
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame( None, -1, 'wxboxsizer.py' )
frame.Show(True)
return True
app = MyApp(0)
app.MainLoop()我既可水平的摆放构件,也可竖直的摆放。box = wx.BoxSizer( integer orient
)其中的偏向(orient)可所以 wx.VERTICAL 或 wx.HORIZONTAL。将构件插手 wx.BoxSizer 要应用
Add() 行动。为了熟悉,我们来看一下它的参数。Add(wx.Window window,integer
proportion=0,integer flag=0,integer border=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.pyimport wxclass MyFrame( 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()
class MyApp( wx.App ):
def OnInit( self ):
frame = MyFrame( None, -1, 'layout3.py' )
frame.Show( True )
return True
app = My App( 0 )
app.MainLoop()阿谁例子中,我们仍然是建坐了三个按纽。第一个的四周有一些鸿沟。它是唯逐个个可以在水平偏向篡改大年夜小的,当主窗口的大年夜小篡改时。第两个按纽占据了分派给它的一切空间。第三个在竖起偏向据中对齐。我们可以随意率性组开
wx.BoxSizer 。例如,我们可以将几个水平的 wx.BoxSizer 放在一个竖起的 wx.BoxSizer
中或相反。那样我们便能产生复纯的筹算。#!/usr/bin/env python
# FileName: borders.pyimport wxclass MyFrame( 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()
class MyApp( wx.App ):
def OnInit( self ):
frame = MyFrame( None, -1, 'borders.py' )
frame.Show( True )
return True
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( integer rows, integer cols, integer vgap, integer
hgap )在机关器中,我们设定行和列的数量以及构件的水和蔼竖直间距。我们应用 AddMany()
行动将我们的构件插进到表中。按照从左到左、从上到下的次第。#!/usr/bin/env python# FileName:
calculator.pyimport wxclass MyFrame( 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', 'Exit Calculator' )
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)
def OnClear(self, event):
self.display.Clear()def OnBackspace(self, event):
formula = self.display.GetValue()
self.display.Clear()
self.display.SetValue(formula[:-1])def OnClose(self, event):
self.Close()def OnDivide(self, event):
if self.formula:
return
self.display.AppendText('/')def OnMultiply(self, event):
if self.formula:
return
self.display.AppendText('*')def OnMinus(self, event):
if self.formula:
return
self.display.AppendText('-')def OnPlus(self, event):
if self.formula:
return
self.display.AppendText('+')def OnDot(self, event):
if self.formula:
return
self.display.AppendText('.')def OnEqual(self, event):
if self.formula:
return
formula = self.display.GetValue()
self.formula = True
try:
self.display.Clear()
output = eval_r(formula)
self.display.AppendText(str(output))
except StandardError:
self.display.AppendText("Error")def OnZero(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('0')def OnOne(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('1')def OnTwo(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('2')def OnThree(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('3')def OnFour(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('4')def OnFive(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('5')def OnSix(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('6')def OnSeven(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('7')def OnEight(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('8')def OnNine(self, event):
if self.formula:
self.display.Clear()
self.formula = False
self.display.AppendText('9')
class MyApp(wx.App):
def OnInit(self):
frame = MyFrame(None, -1, "calculator.py")
frame.Show(True)
self.SetTopWindow(frame)
return Trueapp = MyApp(0)
app.MainLoop()我们输进的公式应用 python 的内置函数 eval 来措置。output = eval_r(
formula )若是公式有错,便会发挥分解一条错误信息。请寄看我们是如安在 Bck 和 Close
按纽之间插进空缺的。我们只是简单的在那放了一个空的 wx.StaticText。那是一个很经常使用的手艺。
天津汇港