Linux wxPyhton指南(1)

来源:互联网 发布:modernizr.custom.js 编辑:程序博客网 时间:2024/05/10 19:55

暑假的时候,学python,学GUI,选择了wxPython,所以到官方网找了个指南来看。发现不难,就学着翻译了一下。第一次翻译东西,错漏好多,希望多多指出(诚恳地希望)。

 

这里是原文的链接

http://wiki.wxpython.org/index.cgi/AnotherTutorial#head-cb7576fdf0a9d8e613caba19179894148309d443

Linux wxPyhton指南

2006-08-24 09:21:46由jan bodnar编辑

翻译:youyouzhou

Contents

  1. wxPython Linux 指南The wxPython Linux Tutorial
    1. wxPython API
    2. 第一阶First Steps
      1. wx.Window
      2. wx.Frame
      3. wx.MenuBar
      4. wx.ToolBar
    3. 规划控制Layout Management
      1. wx.BoxSizer
      2. wx.GridSizer
      3. wx.GridBagSizer
    4. 字体和颜色Fonts and Colours
      1. Fonts
      2. Colours
    5. 事件Events
      1. Examples
    6. 对话Dialogs
      1. 定制对话Custom dialogs
      2. 共有的预定义对话Common Predefined Dialogs
    7. 核心窗口部件Core Widgets
      1. wx.Button
      2. wx.StaticLine
      3. wx.StaticText
      4. wx.CheckBox
      5. wx.Gauge
      6. wx.Slider
      7. wx.ListBox
      8. wx.SpinCtrl
      9. wx.ListCtrl
      10. wx.SplitterWindow
      11. wx.ScrolledWindow
      12. wx.TreeCtrl
      13. wx.Notebook
    8. wx.lib wx.lib Classes
      1. Mouse Gestures
      2. AnalogClockWindow
    9. 高级窗口部件Advanced Widgets
      1. CalendarCtrl
      2. LEDNumberCtrl
    10. 创建一个任务栏应用应用程序Creating a taskbar application
    11. wx.TheClipboard
    12. 拖和放Drag and Drop
    13. 测绘Plotting
    14. wxPython函数wxPython functions
      1. System functions
      2. Dialog functions
      3. Other functions
    15. 使用xml资源文件Using xml resource files
    16. 提示和诀窍Tips And Tricks
      1. 弹出菜单PopupMenu
      2. 细小的wxPython应用程序The tiniest wxPython application
      3. 交互式按键Interactive Button
      4. 没有对话的错误处理Error handling without dialogs
      5. 取消/重做结构UndoRedoFramework
    17. 掌握Gripts
      1. Tom
      2. 编辑器Editor
    18. 附录Appendix
      1. wx.Frame styles
      2. Standard Colour Database
      3. wx.Pen styles
      4. wx.Brush styles
      5. CalendarCtrl styles
      6. Keycodes

 

一、wxPython API

 

wxPython API是一组函数以及窗口部件(widgets)。窗口部件是GUI应用程序的重要构造部件。在Windows下窗口部件叫控件(controls).我们可以粗劣地把程序员分成写代码的或者

是使用库的两类。wxPython是一个被应用软件程序员用来编应用程序的库。从技术上,wxPython是一个叫wxWidgetsC++GUI API的打包,所以它本质上是一个API.e.g.不是直接用Python写的。我知道的唯一的完全用于直译语言(interpreted)GUI库是Java`s Swing Library .

wxPython里我们有好多的窗口部件。他们可以分成几个逻辑组。

基础窗口部件:

这些窗口部件为建造窗口部件提供了基本功能性。它们通常不直接使用。

·         wx.Window

·         wx.Control

·         wx.ControlWithItem

顶层窗口部件:

这些部件是各自独立存在的。

·         wx.Frame

·         wx.MDIParentFrame

·         wx.MDIChildFrame

·         wx.Dialog

·         wx.PopupWindow

容器:

容器装着其他窗口部件,被装着的窗口部件叫孩子。

·         wx.Panel

·         wx.Notebook

·         wx.ScrolledWindow

·         wx.SplitterWindow

动态窗口部件:

这些部件可以被用户应用。

·         wx.Button

·         wx.BitmapButton

·         wx.Choice

·         wx.ComboBox

·         wx.CheckBox

·         wx.Grid

·         wx.ListBox

·         wx.RadioBox

·         wx.RadioButton

·         wx.ScrollBar

·         wx.SpinButton

·         wx.SpinCtrl

·         wx.Slider

·         wx.TextCtrl

·         wx.ToggleButton

静态窗口部件:

这些窗口部件用来显示信息,他们不可以被用户应用。

·         wx.Gauge

·         wx.StaticText

·         wx.StaticBitmap

·         wx.StaticLine

·         wx.StaticBox

其他窗口部件:

这些窗口部件在应用软件里实现状态栏、工具栏、菜单栏。

·         wx.MenuBar

·         wx.ToolBar

·         wx.StatusBar

 

二、第一阶:

 

我们用一个简单的例子开始。

1 #!/usr/bin/python

   2

   3 # simple.py

   4

   5 import wx

   6

   7 app = wx.App()

   8 frame = wx.Frame(None, -1, 'simple.py')

   9 frame.Show()

  10 app.MainLoop()

在所以的wxPython应用里,我们都要引入(import)wx库。

import wx

初始化一个类wx..app用于创建一个应用对象。

app=wx.App()

我们创建一个框架。这窗口的显现只有对一个窗口部件调用Show() 方法。

frame = wx.Frame(None, -1, "simple.py")
frame.Show()

最后一行输入一个Mainloop.一个Mainloop是一个无限循环,用来捕捉所有发生在你应用软件上的事件。这是一个窗口GUI应用软件的完整部分。

app.MainLoop()

虽然代码好简单,但我们可以对它做好多的事情。我们可以对它最大化,最小化,移动,调整大小。所以这些都是可以实现的。

图:simple.py

 

 

wx.Window

wx.Window是一个基类而脱离于好多窗口部件的继承。就象wx.Frame窗口部件。技术上这意味着,我们可以在所有继承上使用wx.Window方法。我们将在这介绍几种它方法。

·         SetTitle(string title)设置窗口的标题。只可以在framsdialogs

·         SetToolTip(wx.ToolTip tip)在窗口上放上tooltip

·         SetSize(wx.Size size)设置窗口的大小。

·         SetPosition(wx.Point pos)用坐标用来定位窗口。

·         Show(show=True)显示或者隐藏窗口。Show的参数可以是True或者False

·         Move(wx.Point pos)移动出口到给定的位置。

·         SetCursor(wx.StockCursor id)设置窗口的指针(cursor)。

   1 #!/usr/bin/python

   2

   3 # simple2.py

   4

   5 import wx

   6

   7 app = wx.App()

   8

   9 frame = wx.Frame(None, -1, '')

  10 frame.SetToolTip(wx.ToolTip('This is a frame'))

  11 frame.SetCursor(wx.StockCursor(wx.CURSOR_MAGNIFIER))

  12 frame.SetPosition(wx.Point(0,0))

  13 frame.SetSize(wx.Size(300,250))

  14 frame.SetTitle('simple2.py')

  15 frame.Show()

  16

  17 app.MainLoop()

 

wx.Frame:

wx.Frame 是一个容器窗口部件。就是说它可以装着其他窗口部件。它有一个紧随的构造器(constructor)。

wx.Frame(wx.Window parent, id, string title,
         wx.Point pos = wx.DefaultPosition, wx.Size size = wx.DefaultSize,
         style = wx.DEFAULT_FRAME_STYLE, string name = 'frame')

一个构造器是一个特别类型的函数。当一个对象被创建的时候它被调用。它唯一重要的时候是当我们想创建一个新的窗口部件时,我们简单地叫它构造器。Python允许程序员使用默认参数。所以在wx.Fram里程序的唯一必要的参数是parent,id以及title。如果你列出了所有使用的参数值,你就不需要列出参数的名字。比如,你想创建一个wx.Frame窗口部件,它没有parent,它的标识符是100,标题是’Title’,位置是(100,50),大小是(100,1000.

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))

在下面的例子里,我们使用其他有用的特色。

  1 #!/usr/bin/python

   2

   3 # icon.py

   4

   5 import wx

   6

   7 def main():

   8

   9     app = wx.App()

  10     frame = wx.Frame(None, title='Icon', pos=(350,300))

  11     frame.SetIcon(wx.Icon('tipi.ico', wx.BITMAP_TYPE_ICO))

  12     frame.Center()

  13     frame.Show()

  14     app.MainLoop()

  15

  16 if __name__ == '__main__':

  17     main()

图标的名字是Tip.ico。这图标定位在当前目录。图标构造器第一个参数是文件名,第二个参数就镇定文件类型。

你一定注意到,我们的应用例子的结构改变了。这是Python程序的一个标准。在Python程序里name是一个特别值。更复杂的程序是由好多文件构成的。通常是只有一个用来开始应用程序的文件。Pythonname设置成’main’ 。这会发生在当你从一个命令行开始一个应用程序或者你点击一个文件的时候。所以,当你点击icon.py文件或者你从一个命令行开始的时候, name等于main.然后函数main()运行。

图:icon.py

 

wx.MenuBar

在你的wxPython应用程序里创建一个菜单栏是相当简单的。我们将讨论把菜单加入菜单栏,将子菜单放到现有的菜单上。每个菜单由菜单项(menuitem)组成,菜单项可以是常规项, 复选项或者单选项。

首先考虑的是创建一个菜单栏。

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()

如果你想在菜单里加入图标,你通常需要创建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文件覆盖到位图处。

将菜单添加到菜单栏。

menubar.Append(file, '&File')
menubar.Append(edit, '&Edit')
menubar.Append(help, '&Help')

最后我们将菜单栏放到我们的应用类里。

self.SetMenuBar(menubar)

让我们将代码组合成一个小脚本。

   1 #!/usr/bin/python

   2

   3 # menu1.py

   4

   5 import wx

   6

   7 class MyMenu(wx.Frame):

   8     def __init__(self, parent, id, title):

   9         wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(200, 150))

  10

  11         menubar = wx.MenuBar()

  12

  13         file = wx.Menu()

  14         edit = wx.Menu()

  15         help = wx.Menu()

  16

  17         file.Append(101, '&Open', 'Open a new document')

  18         file.Append(102, '&Save', 'Save the document')

  19         file.AppendSeparator()

  20         quit = wx.MenuItem(file, 105, '&Quit/tCtrl+Q', 'Quit the Application')

  21         quit.SetBitmap(wx.Image('stock_exit-16.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap())

  22         file.AppendItem(quit)

  23

  24         menubar.Append(file, '&File')

  25         menubar.Append(edit, '&Edit')

  26         menubar.Append(help, '&Help')

  27

  28         self.SetMenuBar(menubar)

  29         self.CreateStatusBar()

  30

  31 class MyApp(wx.App):

  32     def OnInit(self):

  33         frame = MyMenu(None, -1, 'menu1.py')

  34         frame.Show(True)

  35         return True

  36

  37 app = MyApp(0)

  38 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)

参数被称作性质(kind)。

可能的wx.ItemKind-S

  • wx.ITEM_NORMAL - default item
  • wx.ITEM_CHECK - check item
  • wx.ITEM_RADIO - radio item

如果你想创建子菜单。你可以先创建一个菜单。

submenu = wx.Menu()

然后在子菜单里加入一些菜单项。

submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)
submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)
submenu.Append(302, 'radio item3', kind=wx.ITEM_RADIO)

把子菜单加到一个菜单对象上。

edit.AppendMenu(203, 'submenu', submenu)

在最后,我们将会看到怎样响应用户的操作。我们只是简单地涉及。我们将在后面详细地叙述。

现在,我们应用程序的一个用户选择一个菜单项,就产生一个事件。我们必须提供一个事件处理。我们目前看到的,事件处理在wxPython里是非常的优雅和简单。当我们查阅参考书的时候,我们发现wx.EVT_MENU在事件处理区下。

假设我们想为退出菜单项添加一个事件处理。

wx.EVT_MENU(self, 105, self.OnQuit )

我们需要提供三个信息。对象(我们绑定事件处理的地方)。在我们的例子里是self(应用程序的主对象)。菜单项相对的标式符(id)。以及那个处理我们工作的方法的名字。

我们将要创建的用户操作有两个参数。第一个是对象,是那个方法定义的地方。第二个是产生事件。这时,我们不需要它。我们简单地关闭我们的应用程序。

def OnQuit(self, event):
    self.Close()

下面的脚本示范不同的菜单项,子菜单和简单的事件处理。我好讨厌我的应用窗口被有势的窗口管理器管理而出现在某个地方。所以我加上了

self.Centre()

现在窗口就出现在屏幕的中央。

图:menu1.py

1 #!/usr/bin/python

   2

   3 # menu2.py

   4

   5 import wx

   6

   7 class MyMenu(wx.Frame):

   8     def __init__(self, parent, id, title):

   9         wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(380, 250))

  10

  11         menubar = wx.MenuBar()

  12

  13         file = wx.Menu()

  14         edit = wx.Menu()

  15         help = wx.Menu()

  16

  17         file.Append(101, '&Open', 'Open a new document')

  18         file.Append(102, '&Save', 'Save the document')

  19         file.AppendSeparator()

  20         quit = wx.MenuItem(file, 105, '&Quit/tCtrl+Q', 'Quit the Application')

  21         quit.SetBitmap(wx.Image('stock_exit-16.png',wx.BITMAP_TYPE_PNG).ConvertToBitmap())

  22         file.AppendItem(quit)

  23         edit.Append(201, 'check item1', '', wx.ITEM_CHECK)

  24         edit.Append(202, 'check item2', kind=wx.ITEM_CHECK)

  25

  26         submenu = wx.Menu()

  27         submenu.Append(301, 'radio item1', kind=wx.ITEM_RADIO)

  28         submenu.Append(302, 'radio item2', kind=wx.ITEM_RADIO)

  29         submenu.Append(303, 'radio item3', kind=wx.ITEM_RADIO)

  30         edit.AppendMenu(203, 'submenu', submenu)

  31

  32         menubar.Append(file, '&File')

  33         menubar.Append(edit, '&Edit')

  34         menubar.Append(help, '&Help')

  35

  36         self.SetMenuBar(menubar)

  37         self.Centre()

  38         self.Bind(wx.EVT_MENU, self.OnQuit, id=105)

  39

  40     def OnQuit(self, event):

  41         self.Close()

  42

  43 class MyApp(wx.App):

  44     def OnInit(self):

  45         frame = MyMenu(None, -1, 'menu2.py')

  46         frame.Show(True)

  47         return True

  48

  49 app = MyApp(0)

  50 app.MainLoop()

图:menu2.py

wx.ToolBar

工具栏是一个窗口部件组,包括你应用程序的大多数的通常命令或者动作。典型的保存、打开、剪切、复制、粘贴、取消、重做等等。它的目的的节省时间。你只需要从工具栏点击一下来做一个动作或者点从菜单点击两下鼠标。

#!/usr/bin/python

   2

   3 # toolbar.py

   4

   5 import wx

   6

   7 class MyToolBar(wx.Frame):

   8     def __init__(self, parent, id, title):

   9         wx.Frame.__init__(self, parent, id, title, wx.DefaultPosition, wx.Size(350, 250))

  10

  11         vbox = wx.BoxSizer(wx.VERTICAL)

  12         toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)

  13         toolbar.AddSimpleTool(1, wx.Image('stock_new.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')

  14         toolbar.AddSimpleTool(2, wx.Image('stock_open.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Open', '')

  15         toolbar.AddSimpleTool(3, wx.Image('stock_save.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Save', '')

  16         toolbar.AddSeparator()

  17         toolbar.AddSimpleTool(4, wx.Image('stock_exit.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'Exit', '')

  18         toolbar.Realize()

  19         vbox.Add(toolbar, 0, border=5)

  20

  21         self.SetSizer(vbox)

  22         self.statusbar = self.CreateStatusBar()

  23         self.Centre()

  24

  25         self.Bind(wx.EVT_TOOL, self.OnNew, id=1)

  26         self.Bind(wx.EVT_TOOL, self.OnOpen, id=2)

  27         self.Bind(wx.EVT_TOOL, self.OnSave, id=3)

  28         self.Bind(wx.EVT_TOOL, self.OnExit, id=4)

  29

  30     def OnNew(self, event):

  31         self.statusbar.SetStatusText('New Command')

  32

  33     def OnOpen(self, event):

  34         self.statusbar.SetStatusText('Open Command')

  35

  36     def OnSave(self, event):

  37         self.statusbar.SetStatusText('Save Command')

  38

  39     def OnExit(self, event):

  40         self.Close()

  41

  42 class MyApp(wx.App):

  43     def OnInit(self):

  44         frame = MyToolBar(None, -1, 'toolbar.py')

  45         frame.Show(True)

  46         return True

  47

  48 app = MyApp(0)

  49 app.MainLoop()

wx.BoxSizer将在后面的版面部分解释。工具栏窗口用三步来创建。

首先,我们创建工具栏对象。

toolbar = wx.ToolBar(self, -1, style=wx.TB_HORIZONTAL | wx.NO_BORDER)

跟着我们利用AddSimpleTool()方法添加一些工具到工具栏。你不可以在参考书上找到这方法,这是wxPython 扩展。这是祸也是福。它使python编程变得简单些。不过在另外一方面,这些扩展是非正式的。你需要查看包文件,样本例子或者在邮件列表上发问。

toolbar.AddSimpleTool(1, wx.Image('stock_new.png',  wx.BITMAP_TYPE_PNG).ConvertToBitmap(), 'New', '')

最后,我们调用Realize()方法。这方法显示或者实施工具栏窗口部件。

toolbar.Realize()

工具栏窗口部件有好多事件处理器。当你点击一个工具栏图标一个wx.EVT_COMMAND_TOOL_CLICKEDS事件被创建。我们利用wx.EVT_TOOL事件处理器将事件绑定到一个指定的方法上。

为了显示一些有用的信息给事件,我们创建了一个状态栏。

self.statusbar = self.CreateStatusBar()

这又是另外一个wxPython的扩展。当我们点击一个工具栏按键的时候,一个信息就显示在状态栏上。这是由 SetStatusText()方法实现的。

图:toolbar.py

 

原创粉丝点击