星空有烂,观之忘我
wxpython 使用 XRCed创建界面
周海汉 /文
2010.1.9
wxPython写UI界面是比较爽的事情。python和wxWidgets都是跨平台的。因此,用wxPython写的应用程序的界面,可以在 不同的操作系统有本地一样的界面。即windows用户看到的是windows界面,linux,mac用户看到的是linux和mac的界面。这比使用 java,qt,tcl等写的界面会更符合用户的操作习惯一些。
除了直接调用wxPython API,还可以利用一些工具,wxGlade,BOA, XRCed等。前两者都支持所见即所得的拖放生成UI,XRCed是wxPython自带的UI生成工具,支持UI控件布局的逻辑,参数,事件设置,但非所见即所得的拖放。
本文是利用XRCed生成界面的简单示例。
1.进入XRCed, 创建wxFrame。(因为CSDN现在不能传图,只描述一下)
再创建一个横排的wxBoxSizer,里面放一个textCtrl, 一个竖排的wxBoxSizer,里面放一个按钮。在不选中任何组件时,将编码设为UTF-8. 否则对中文字符无法保存xrc文件。
配置gettext,以生成多种语言界面。(支持I18N)
设置完毕,保存为hello.xrc
- <?xml version=“1.0″ encoding=“UTF-8″?>
- <resource class=“wxButton”>
- <object class=“wxFrame” name=“zframe”>
- <object class=“wxBoxSizer”>
- <orient>wxHORIZONTAL</orient>
- <object class=“sizeritem”>
- <object class=“wxTextCtrl” name=“txt_main”>
- <size>300,300</size>
- <value>hello</value>
- <mce:style><!–
- wxTE_AUTO_SCROLL|wxTE_MULTILINE
- –></mce:style><style mce_bogus=“1″>wxTE_AUTO_SCROLL|wxTE_MULTILINE</style>
- </object>
- <option>4</option>
- <flag>wxEXPAND</flag>
- <border>2</border>
- </object>
- <object class=“sizeritem”>
- <object class=“wxBoxSizer”>
- <orient>wxVERTICAL</orient>
- <object class=“sizeritem”>
- <object class=“wxButton” name=“btn_next”>
- <label>下一个</label>
- <XRCED>
- <events>EVT_BUTTON|EVT_KEY_DOWN</events>
- <assign_var>1</assign_var>
- </XRCED>
- </object>
- </object>
- </object>
- </object>
- </object>
- <title>你好</title>
- </object>
- </resource>
2.自动生成hello_xrc.py
- # This file was automatically generated by pywxrc.
- # -*- coding: UTF-8 -*-
- import wx
- import wx.xrc as xrc
- __res = None
- def get_resources():
- “”" This function provides access to the XML resources in this module.”"”
- global __res
- if __res == None:
- __init_resources()
- return __res
- class xrczframe(wx.Frame):
- #!XRCED:begin-block:xrczframe.PreCreate
- def PreCreate(self, pre):
- “”" This function is called during the class’s initialization.
- Override it for custom setup before the window is created usually to
- set additional window styles using SetWindowStyle() and SetExtraStyle().
- ”"”
- pass
- #!XRCED:end-block:xrczframe.PreCreate
- def __init__(self, parent):
- # Two stage creation (see http://wiki.wxpython.org/index.cgi/TwoStageCreation)
- pre = wx.PreFrame()
- self.PreCreate(pre)
- get_resources().LoadOnFrame(pre, parent, “zframe”)
- self.PostCreate(pre)
- # Define variables for the controls, bind event handlers
- self.btn_next = xrc.XRCCTRL(self, “btn_next”)
- self.Bind(wx.EVT_BUTTON, self.OnButton_btn_next, self.btn_next)
- self.Bind(wx.EVT_KEY_DOWN, self.OnKey_down_btn_next, self.btn_next)
- #!XRCED:begin-block:xrczframe.OnButton_btn_next
- def OnButton_btn_next(self, evt):
- # Replace with event handler code
- print “OnButton_btn_next()”
- self.txt_main = xrc.XRCCTRL(self, “txt_main”)
- self.txt_main.SetValue(“你好”)
- #!XRCED:end-block:xrczframe.OnButton_btn_next
- #!XRCED:begin-block:xrczframe.OnKey_down_btn_next
- def OnKey_down_btn_next(self, evt):
- # Replace with event handler code
- print “OnKey_down_btn_next()”
- #!XRCED:end-block:xrczframe.OnKey_down_btn_next
- # ———————— Resource data ———————-
- def __init_resources():
- global __res
- __res = xrc.EmptyXmlResource()
- wx.FileSystem.AddHandler(wx.MemoryFSHandler())
- hello_xrc = ””’\
- <?xml version=”1.0″ ?><resource class=”wxButton”>
- <object class=”wxFrame” name=”zframe”>
- <object class=”wxBoxSizer”>
- <orient>wxHORIZONTAL</orient>
- <object class=”sizeritem”>
- <object class=”wxTextCtrl” name=”txt_main”>
- <size>300,300</size>
- <value>hello</value>
- <mce:style><!–
- wxTE_AUTO_SCROLL|wxTE_MULTILINE
- –></mce:style><style mce_bogus=”1″>wxTE_AUTO_SCROLL|wxTE_MULTILINE</style>
- </object>
- <option>4</option>
- <flag>wxEXPAND</flag>
- <border>2</border>
- </object>
- <object class=”sizeritem”>
- <object class=”wxBoxSizer”>
- <orient>wxVERTICAL</orient>
- <object class=”sizeritem”>
- <object class=”wxButton” name=”btn_next”>
- <label>下一个</label>
- <XRCED>
- <events>EVT_BUTTON|EVT_KEY_DOWN</events>
- <assign_var>1</assign_var>
- </XRCED>
- </object>
- </object>
- </object>
- </object>
- </object>
- <title>你好</title>
- </object>
- </resource>”’
- wx.MemoryFSHandler.AddFile(‘XRC/hello/hello_xrc’, hello_xrc)
- __res.Load(‘memory:XRC/hello/hello_xrc’)
- # ———————– Gettext strings ———————
- def __gettext_strings():
- # This is a dummy function that lists all the strings that are used in
- # the XRC file in the _(“a string”) format to be recognized by GNU
- # gettext utilities (specificaly the xgettext utility) and the
- # mki18n.py script. For more information see:
- # http://wiki.wxpython.org/index.cgi/Internationalization
- def _(str): pass
- _(“hello”)
- _(“下一个”)
- _(“你好”)
3.实现按钮点击,改变txt的内容。
找到def OnButton_btn_next(self, evt):
在下面添加:
self.txt_main = xrc.XRCCTRL(self, “txt_main”)
self.txt_main.SetValue(“你好”)
4.完成可执行程序。
新建一个testhello.py
- #!/bin/env python
- #-*- coding=utf8 -*-
- import wx
- import hello_xrc
- app = wx.PySimpleApp()
- frame = hello_xrc.xrczframe(parent = None)
- frame.Show()
- app.MainLoop()
执行testhello.py,即可看到设计的界面。
参考:
xrced官网(只有源码下载):http://xrced.sourceforge.net/
wxpython的doc里包括xrced的可执行文件
http://www.wxpython.org/download.php
win32二进制版:
http://downloads.sourceforge.net/wxpython/wxPython2.8-win32-docs-demos-2.8.10.1.exe
ubuntu:可以在库里安装wxpython时自带
金庆的专栏
http://blog.csdn.net/jq0123/archive/2008/03/24/2213855.aspx
http://blog.csdn.net/jq0123/archive/2008/03/26/2219836.aspx

原创文章,转载请注明出自瀚海星空.
本文链接地址:http://abloz.com/2010/01/09/wxpython-interface-created-using-xrced.html
| 打印文章 | 这篇文章由梦想家于2010年01月9日 14:51发表在技术。你可以订阅RSS 2.0 也可以发表评论或引用到你的网站。 |