wxPython官方文档翻译第一期初稿

wxPyWiki的目的是为了提供软件文档、示例、使用方法等。是为了帮助人们学习、理解和使用wxPython。


注解:想了解更多关于wxPython的内容,可以点击这里。


这里有多种类型的可用信息。当前的有:
学习wxPython:
o 安装——如何安装wxPython。(不要忘记去安装文档和示例!)
o 如何学习wxPython——知识概要和学习策略
o 入门指南——编写Hello World和基本概念
o Sizer教程——使用不同Sizer的相关教程
o 使用Sizer——使用Sizer的常见误区和陷阱








如何安装wxPython


安装Python
稳定版的wxPython要求安装Python 2.7版本。Python下载可以点击这里


Windows
在Windows环境下进行安装是特别简单的:运行从wxPython得到的安装程序,根据提示进行即可。


Mac OS X
从wxPython可以获取可用的安装包,同时适用于PPC和Intel的Mac电脑
如果你想自定义安装,可以参照这里的指令
如果你得到了“damaged and can't be opened”,你需要更改安全配置设置,将Allow application downloaded from更改为Anywhere


GNU/Linux - Redhat
你可以找到适用于Redhat的RPM(通过Mandrake可以正常的工作),下载地址是wxPython


GNU/Linux - Debian
可以使用apt-get去安装wxPython,调用apt-get install python-wxgtk2.8 或 apt-get install python-wxgtk2.6,这取决于你想得到的版本。
你可能需要使用管理员权限去调用它。wxPython示例都在wx-examples包中。
我们建议去分别安装这些demo,具体描述在Using wxPython Demo Code。
尝试调用:
apt-get install python-wxgtk2.8
请注意,你可能使用本方法已经安装了wx较老的版本,参照InstallingOnUbuntuOrDebian去学习如何使用apt-get得到最新的版本。


GNU/Linux - Gentoo
通过portage去调用emerge wxPython可以安装wxPython(注意大写的P)。在04年11月28日前,正常的使用是emerge wxpython(不是大写的P)。


GNU/Linux - Building from the source
你可能也想利用源码去构建wxPython。那么你需要做以下三个步骤:
Installing wxGTK from source
wxGTK是GTK版的wxWidgets。GTK(Gimp ToolKit)是Gnome所使用的图形类库,所以它可能已经被安装在你的Linux机器中。
你需要去做的就是,从the wxGTK ftp server或wxWidgets website中去下载wxGTK。
通过命令去解压wxGTK:
tar -xvzf wxGTK-2.2.5.tar.gz
进入解压后的文件目录:
cd wxGTK-2.2.5
运行配置脚本:
./configure --with-gtk
如果GTK或GTK的依赖文件没有安装,会提示出错(在Mandrake版中,你应该安装的rpm是gtk+-devel-1.2.8-6mdk.i586.rpm)
运行命令:
make
如果没有安装yacc或lex会提示出错(在Mandrake版中,应该安装 byacc-1.9-7mdk.i586.rpm和flex-2.5.4a-13mdk.i586.rpm)
你现在应该有了编译好的wxGTK。我们现在去安装它,并把它链接到系统中。
进入超级管理员模式:
su
在这里,你需要提供权限密码。
安装wxGTK:
make install
链接库:
ldconfig
退出超级管理员模式:
exit
正常来说,wxGTK已经安装好了,但是可能wxPython可能还会有问题:
当wxPython去寻找库的时候,库并没有安装。(在Mandrake7.2版中,你想将库安装在/usr/lib,但是它会被自动安装在/usr/local/lib中)。
解决方法是,创建一个这个库的符号链接。
进入你想安装的目录中:
cd /usr/lib
创建一个符号链接这个库:
ln -s /usr/local/lib/libwx_gtk.so


利用源码安装wxPython
下载最新发布版的wxPython源码:
wxPython website
解压缩:
cd wxPython-2.2.5
进入目录:
cd wxPython-2.2.5
编辑setup.py,选择你想要安装的部分。建议不要安装OGL和GL_CANVAS。选择如下:
BUILD_GLCANVAS = 0 # If true, build the contrib/glcanvas extension module
BUILD_OGL = 0      # If true, build the contrib/ogl extension module
BUILD_STC = 1      # If true, build the contrib/stc extension module
CORE_ONLY = 0      # if true, don't build any of the above
GL_ONLY = 0        # Only used when making the -gl RPM.  See the "b" script
   # for the ugly details
USE_SWIG = 0       # Should we actually execute SWIG, or just use the
   # files already in the distribution?
IN_CVS_TREE = 0    # Set to true if building in a full wxWidgets CVS
   # tree, otherwise will assume all needed files are
   # available in the wxPython source distribution
构建python模块:
python setup.py build
进入超级管理员模式:
su
在这里,你需要提供权限密码。
安装模块:
python setup.py install
退出超级管理员模式:
exit
检查模式是否可以工作:
[lucas@b007 wxPython-2.2.5]$ python
Python 1.5.2 (#1, Sep 30 2000, 18:08:36)  [GCC 2.95.3 19991030 (prerelease)] on linux-i386
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> import wx
>>>
wxPython已经安装好了!

使用PIP安装wxPython-Phoenix
确保你已经最低安装有pip-6.0.8和setuptools-12.0.5
按照README.rst的要求进行安装:
https://github.com/wxWidgets/Phoenix/blob/master/README.rst
快速浏览snapshots的README.txt:
https://wxpython.org/Phoenix/snapshot-builds/README.txt
安装wxPython-Phoenix(Linux):
sudo pip install --upgrade --pre -f https://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix 
安装wxPython-Phoenix(Windows,在需要安装的目录下使用命令):
C:\python27\scripts\pip.exe install --upgrade --pre -f https://wxpython.org/Phoenix/snapshot-builds/ wxPython_Phoenix 
确认安装:
python2
   >>> import wx
   >>> wx.VERSION_STRING
   '3.0.3.dev1784+18750f4'
   >>> wx.version()
   '3.0.3.dev1784+18750f4 msw (phoenix)'
   
   
   
如何去学习wxPython


学习Python
如何你没有使用过Python,或者你从来没有进行过编程,那么首先去学习Python是最有意义的,不使用任何的GUI。
这个过程可能让人沮丧,但是很有必要。Python是一种非常强大的编程语言,不管是使用或不使用GUI。
最基本的,你应该理解函数、模块和类。没有这些,学习Python是非常困难的事情。在Python官网对于初学者有非常棒的指导,让你一步步的去学习它。http://www.python.org/about/gettingstarted/


选择一个好的编译器
拥有自动编译、代码提示和一个可交互的窗口,能够让编程更加的方便,避免出错。
点击http://wiki.python.org/moin/PythonEditors查看编译器列表。


安装wxPython
如果你还没有安装wxPython,请看如何安装wxPython。


阅读wxPython教程
Wiki教程:最重要是就是入门指南。然后你可以学习Obstacle Course和Fully Functional Demo。
其他教程:最棒的资源就是Zetcode wxPython tutorial。它拥有了大量的内容,包括:入门指南、菜单/工具栏、sizers、事件、drawing API、widgets、创建自定义的widgets和示例应用”skeleton“
视频教程:ShowMeDo.com中的wxPython tutorial videos特别适合初学者。YouTube中也有大量的视频。


阅读wxPython风格指南
它会告诉你,如何让你的wxPython代码更漂亮,更具有现在化的风格。由于多年来API的变化,和大量的经验,使得wxPython多年来变得更加Python化。
不幸的是,你会发现有很多示例并没有被更新成这种风格。当你刚开始的时候就学习wxPython Style Guide,能够让你使用好看,现代化的风格,这会是一种好的习惯。


阅读示例文件
wxPython自带有很全面的大量示例。进入the download page并找到wxPython-demo-x.x.x文件。示例会展示wxPython基本所有的工作。你可以查看不同功能是如何工作的,并学习源码。
注意:如果示例不能工作,请确保你已经安装了最新版的wxPython。有时候示例中使用的功能并不适用于老的版本。
检查你的wxPython版本,可以运行:
import wx
print wx.version()
wxPython中一种很普遍的工作方式,就是找到一个类似于你想要的功能的示例,然后复制它,并修改添加出你需要的功能。
另一个示例的源码是wxPython Cookbook.


阅读wxWidgets文档
一个非常重要的资源就是wxWidgets文档.
它主要是用C++编写的,但是它有很多针对于wxPython的注释,大多数时候,你可以从c++语法转换为wxPython语法。你并不需要知道C++对于它的作用在哪里。
很多wxPython程序员根本不懂c++,但是他们还是认为wxWidgets文档是很有帮助的。
如果你要阅读这个wxWidgets文档,C++ Guide for Pythoneers对你会有很大的帮助。或者你也可以在mailing list上寻求帮助。


使用wxPython引用(试验)
你可以去尝试automatically generated API reference。它是一个试验性的功能。它不像wxWidgets文档那样完善,但是它是用wxPython语法编写的。


学习其他人的代码
查尔斯·西蒙尼,微软的传奇性程序员,生于匈牙利,只有很少的书本能够让他去学习计算机科学。他就像音乐家使用乐谱学习一样,通过源码的编译和打印输出去学习编程。
在用wxPython编写的代码中,有很多经典之外,这是示例代码所没有的。例如,FrogEdit和它的底层wx.lib.editor模块。
我猜测一个editor会是一个wx.TextCtrl。我非常惊讶的发现,这个text使用DC(device control)绘制到屏幕上,我学习到了一些不错的技巧。
我也”读“了Transana和Task Coach这两个使用Python和wxPython编写的复杂的应用,去学习大型的应用是如何组成的。
在这个wiki中的小例子,和真实项目中的代码有非常大的不同,所以分析大型应用的过程就是学习wxPython的一部分。


提出问题!
wxPython用户邮件列表中的成员,都是友好的,乐于助人的。你可以在这里订阅它:https://wxpython.org/maillist.php






wxPyhon入门指南


第一个应用:”Hello World“
作为一种传统,我们首先编写一个”Hello World“的小应用。代码如下:
#!/usr/bin/env python
import wx


app = wx.App(False)  # Create a new app, don't redirect stdout/stderr to a window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World") # A Frame is a top-level window.
frame.Show(True)     # Show the frame.
app.MainLoop()
说明:
app = wx.App(False) 每一个wxPython App都是wx.App的一个实例。对于大多数简单的应用你都可以直接使用wx.App。当你要开发更为复杂的应用时,你就应该去继承wx.App类了。”False“参数代表”不要将标准输出和标准错误重定向到一个窗口“
wx.Frame(None,wx.ID_ANY,"Hello") 一个wx.Frame是一个最高等级的窗口。它的语法是x.Frame(Parent, Id, Title).大多数的时候,它的构造函数是这样的(a parent object, followed by an Id)。在这个例子中,我们使用None表示了”没有parent“,wx.ID_ANY表示让wxWidgets为我们选择一个ID
frame.Show(True)  我们修改一个frame的可见性,并展示出来。
app.MainLoop() 最后,我们开始一个应用的MainLoop,它是用来处理事件的
注意:你可能总是使用wx.ID_ANY或由wxWidgets提供的standard ID (v2.8)。你也可以去使用你自己的ID,但是这里没有必要去这样做。
运行程序,你可以看到如下的一个窗口:


窗口还是框架?
当人们在讨论GUI的时候,他们通常都是在说窗口,菜单和图标。自然地,你会认为wx.Window应该表示一个在屏幕上的窗口。
事实并非如此。一个wx.Window是一个所有可视化元素推导出来的基类(如按钮,菜单等),我们正常来说的作为一个程序窗口的其实是一个wx.Frame。
这是最让初学者感到困惑的地方。


构建一个简单的文本编辑器
在这个教程中,我们将要去构建一个简单的文本编辑器。在这个过程中,我们将要探索几个部件,并且学习相关的功能,如事件和回调。


第一步
第一步是创建一个带有可编辑文本框的框架。一个文本框可以用wx.TextCtrl部件来创建。默认情况下,一个文本框是单行的,wx.TE_MULTILINE参数可以允许我们输入多行的文本。
#!/usr/bin/env python
import wx
class MyFrame(wx.Frame):
    """ We simply derive a new class of Frame. """
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.Show(True)


app = wx.App(False)
frame = MyFrame(None, 'Small editor')
app.MainLoop()
在这个例子中,我们取得wx.Frame,并重写了它的__init__函数。这里我们声明了一个新的wx.TextCtrl,是一个简单的文本编辑控件。注意,因为我们在MyFrame的__init__函数中运行了self.Show(),所以我们不需要再去调用frame.Show()了。


添加一个菜单栏
每一个应用都应该有一个菜单栏和一个状态栏。让我们把它们添加到我们应用中:
import wx


class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.CreateStatusBar() # A Statusbar in the bottom of the window


        # Setting up the menu.
        filemenu= wx.Menu()


        # wx.ID_ABOUT and wx.ID_EXIT are standard IDs provided by wxWidgets.
        filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program")
        filemenu.AppendSeparator()
        filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")


        # Creating the menubar.
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.
        self.Show(True)


app = wx.App(False)
frame = MainWindow(None, "Sample editor")
app.MainLoop()
提示:注意wx.ID_ABOUT和wx.ID_EXIT这两个ID。它们是由wxWidgets提供的标准ID(点击这里查看完整的列表)。使用标准ID是一个非常良好的习惯。标准ID能够让wxWidgets知道如何在每个平台中去显示这个部件,能够让部件看起来更加的自然。


事件处理
在wxPython中,对于事件的反馈叫事件处理。一个事件表示在你的应用中发生了某些事情(如点击按钮、文本输入、鼠标点击等)。GUI程序很大一部分都是由事件处理组成的。使用bind()方法将事件绑定到对应的对象上:
class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self,parent, title=title, size=(200,100))
        ...
        menuItem = filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program")
        self.Bind(wx.EVT_MENU, self.OnAbout, menuItem)
这样意味着,从现在开始,当用户选择”About“菜单项时,self.OnAbout这个函数会被调用。wx.EVT_MENU是“选择菜单项”事件。wxWidgets能够理解更多的其他事件(点击查看完整列表)。这个self.OnAbout函数拥有如下声明:
def OnAbout(self, event):
        ...
这里event是wx.Event子类的一个实例。例如,一个按钮点击事件——wx.EVT_BUTTON——是wx.Event的一个子类。
当事件发生时,这个函数会被调用。默认情况下,这个函数会处理这个事件,在回调完成后这个事件会终止。但是,你也可以使用event.Skip()去“跳过”一个事件。这会使得这个事件直接通过这个事件处理。例如:
def OnButtonClick(self, event):
    if (some_condition):
        do_something()
    else:
        event.Skip()


def OnEvent(self, event):
    ...
当一个按钮点击事件发生时,OnButtonClick函数被调用。如果some_condition是true,我们会调用do_something(),否则我们会让这个事件直接通过事件处理。现在让我们来看看我们的应用:
import os
import wx




class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200,100))
        self.control = wx.TextCtrl(self, style=wx.TE_MULTILINE)
        self.CreateStatusBar() # A StatusBar in the bottom of the window


        # Setting up the menu.
        filemenu= wx.Menu()


        # wx.ID_ABOUT and wx.ID_EXIT are standard ids provided by wxWidgets.
        menuAbout = filemenu.Append(wx.ID_ABOUT, "&About"," Information about this program")
        menuExit = filemenu.Append(wx.ID_EXIT,"E&xit"," Terminate the program")


        # Creating the menubar.
        menuBar = wx.MenuBar()
        menuBar.Append(filemenu,"&File") # Adding the "filemenu" to the MenuBar
        self.SetMenuBar(menuBar)  # Adding the MenuBar to the Frame content.


        # Set events.
        self.Bind(wx.EVT_MENU, self.OnAbout, menuAbout)
        self.Bind(wx.EVT_MENU, self.OnExit, menuExit)


        self.Show(
  • 0
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值