金慶的專(zhuān)欄
C++博客
::
首頁(yè)
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
::
423 隨筆 :: 0 文章 :: 454 評(píng)論 :: 0 Trackbacks
公告
我的隨筆
我的評(píng)論
我參與的隨筆
留言簿
(12)
給我留言
查看公開(kāi)留言
查看私人留言
隨筆分類(lèi)
(502)
1. C/C++(166)
(rss)
2. 網(wǎng)游開(kāi)發(fā)(108)
(rss)
3. Golang(20)
(rss)
4. Linux/Unix(30)
(rss)
5. 軟工與管理(44)
(rss)
6. Python(23)
(rss)
7. Erlang(18)
(rss)
8. Rust(16)
(rss)
9. 其它(77)
(rss)
隨筆檔案
(423)
2023年1月 (1)
2022年11月 (1)
2022年10月 (2)
2022年9月 (1)
2022年4月 (6)
2022年1月 (2)
2021年12月 (4)
2021年11月 (6)
2021年10月 (2)
2021年9月 (2)
2021年8月 (7)
2021年7月 (2)
2021年5月 (2)
2021年3月 (1)
2021年2月 (2)
2021年1月 (1)
2020年12月 (1)
2020年10月 (1)
2020年9月 (5)
2020年8月 (1)
2020年7月 (1)
2020年6月 (1)
2020年4月 (2)
2020年3月 (3)
2020年2月 (3)
2020年1月 (1)
2019年12月 (1)
2019年9月 (2)
2019年4月 (2)
2019年1月 (1)
2018年12月 (1)
2018年11月 (3)
2018年10月 (1)
2018年9月 (3)
2018年8月 (3)
2018年7月 (2)
2018年6月 (4)
2018年5月 (4)
2018年4月 (4)
2018年3月 (1)
2018年1月 (2)
2017年12月 (2)
2017年11月 (3)
2017年10月 (3)
2017年8月 (7)
2017年7月 (1)
2017年6月 (1)
2017年5月 (3)
2017年4月 (3)
2017年3月 (3)
2017年2月 (2)
2017年1月 (2)
2016年12月 (5)
2016年11月 (2)
2016年10月 (2)
2016年9月 (1)
2016年8月 (6)
2016年7月 (3)
2016年6月 (2)
2016年5月 (4)
2016年4月 (2)
2016年3月 (2)
2016年1月 (3)
2015年12月 (2)
2015年11月 (2)
2015年10月 (1)
2015年8月 (2)
2015年7月 (1)
2015年6月 (1)
2015年5月 (4)
2015年4月 (3)
2015年3月 (4)
2015年2月 (5)
2015年1月 (4)
2014年12月 (3)
2014年11月 (3)
2014年10月 (2)
2014年9月 (3)
2014年8月 (1)
2014年4月 (4)
2014年3月 (1)
2014年2月 (4)
2014年1月 (5)
2013年12月 (5)
2013年11月 (5)
2013年9月 (2)
2013年8月 (2)
2013年7月 (2)
2013年6月 (2)
2013年5月 (1)
2013年1月 (2)
2012年12月 (1)
2012年11月 (1)
2012年9月 (1)
2012年8月 (3)
2012年7月 (2)
2012年6月 (1)
2012年4月 (3)
2012年3月 (2)
2012年2月 (3)
2012年1月 (2)
2011年11月 (2)
2011年10月 (3)
2011年9月 (2)
2011年8月 (2)
2011年7月 (3)
2011年6月 (2)
2011年5月 (3)
2011年1月 (2)
2010年12月 (1)
2010年11月 (2)
2010年10月 (2)
2010年9月 (3)
2010年8月 (2)
2010年7月 (3)
2010年6月 (1)
2010年5月 (3)
2010年4月 (3)
2010年3月 (5)
2010年2月 (4)
2010年1月 (4)
2009年12月 (2)
2009年11月 (3)
2009年10月 (4)
2009年9月 (3)
2009年8月 (2)
2009年7月 (4)
2009年6月 (1)
2009年5月 (3)
2009年4月 (4)
2009年3月 (2)
2009年2月 (5)
2009年1月 (1)
2008年12月 (7)
2008年11月 (4)
2008年10月 (1)
2008年9月 (3)
2008年8月 (4)
2008年7月 (3)
2008年6月 (4)
2008年5月 (6)
2008年4月 (7)
2008年3月 (6)
2008年1月 (5)
2007年12月 (7)
2007年11月 (4)
2007年10月 (5)
2007年9月 (6)
2007年8月 (8)
2007年7月 (5)
相冊(cè)
公告照片
搜索
積分與排名
積分 - 659027
排名 - 25
最新評(píng)論
1.?re: boost::asio::spawn 將一統(tǒng)C++網(wǎng)絡(luò)庫(kù)
asio 成為C++首選網(wǎng)絡(luò)庫(kù)
--linda
2.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--金慶
3.?re: mingw編譯OrzNet
能發(fā)送一個(gè)mingw編譯好的OrzNet庫(kù)給我嗎? liuweiqcxy@163.com
謝謝!
--劉威
4.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--bigbad
5.?re: log4cxx中文輸出錯(cuò)誤補(bǔ)丁
評(píng)論內(nèi)容較長(zhǎng),點(diǎn)擊標(biāo)題查看
--bigbad
閱讀排行榜
1.?"multiple definition of" 錯(cuò)誤(11054)
2.?SVN中邪惡的replace(10972)
3.?VS2005編譯libevent(10429)
4.?混音算法的學(xué)習(xí)與研究(10230)
5.?C調(diào)用lua腳本的效率測(cè)試(9019)
評(píng)論排行榜
1.?VC6正在被拋棄(35)
2.?VS2005編譯libevent(21)
3.?"multiple definition of" 錯(cuò)誤(18)
4.?C++引用優(yōu)于指針(17)
5.?ACE與ASIO之間關(guān)于Socket編程的比較(16)
XRC初步
XRC初步
轉(zhuǎn)自:
云雀
的
XRC初步(上)
和
XRC初步(下)
XRC初步(上)
wxPython 中定義用戶界面布局可以采用兩種方法。傳統(tǒng)的方法是將界面布局代碼直接寫(xiě)在源文件之中,這種方法不需要學(xué)習(xí)XML語(yǔ)法,概念上較為簡(jiǎn)單,避免了同時(shí)維護(hù)多個(gè)文件的麻煩;同時(shí),對(duì)IDE的自動(dòng)完成的支持較好。另一種方法則是采用XML資源文件,即XRC(XML Resource)。XRC的基本出發(fā)點(diǎn)是界面布局和程序邏輯的分離,即將界面布局代碼采用XML的方式放在分離的文件之中;在程序中不涉及控件的創(chuàng)建和布局,只需要加載相應(yīng)的資源并處理事件綁定即可。在wxPython中采用XRC分離界面布局和程序邏輯主要有以下幾個(gè)方面的好處:
1. 提高了程序的可維護(hù)性
2. 界面布局可由專(zhuān)業(yè)人員設(shè)計(jì)
3. 更好的支持GUI布局設(shè)計(jì)工具
4. 作為wxWidgets的規(guī)范,XRC資源可通用于C++、Python等語(yǔ)言
示例
使用XRC建立用戶界面必須建立兩個(gè)分離的文件:XML資源文件(.xrc)和python源文件。XRC文件包含了用戶界面布局信息,如下例:
#design layout in a separate XML file
<?
xml version="1.0" encoding="utf-8"
?>
<
resource
>
<
object
class
="wxFrame"
name
="mainFrame"
>
<
title
>
My Frame
</
title
>
<
object
class
="wxPanel"
name
="panel"
>
<
object
class
="wxFlexGridSizer"
>
<
cols
>
2
</
cols
>
<
rows
>
3
</
rows
>
<
vgap
>
5
</
vgap
>
<
hgap
>
5
</
hgap
>
<
object
class
="sizeritem"
>
<
object
class
="wxStaticText"
name
="label1"
>
<
label
>
First name:
</
label
>
</
object
>
</
object
>
<
object
class
="sizeritem"
>
<
object
class
="wxTextCtrl"
name
="text1"
/>
</
object
>
<
object
class
="sizeritem"
>
<
object
class
="wxStaticText"
name
="label2"
>
<
label
>
Last name:
</
label
>
</
object
>
</
object
>
<
object
class
="sizeritem"
>
<
object
class
="wxTextCtrl"
name
="text2"
/>
</
object
>
<
object
class
="spacer"
>
<
size
>
0,0
</
size
>
</
object
>
<
object
class
="sizeritem"
>
<
object
class
="wxButton"
name
="button"
>
<
label
>
Submit
</
label
>
</
object
>
</
object
>
</
object
>
</
object
>
</
object
>
</
resource
>
Python源文件中則包括加載資源文件和事件綁定代碼,同時(shí)可以使用xrc.XRCCTRL方法從名字獲取控件,使用xrc.XRCID方法獲取控件ID:
#
logic by itself in module
import
wx
from
wx
import
xrc
class
MyApp(wx.App):
def
OnInit(self):
self.res
=
xrc.XmlResource(
'
gui.xrc
'
)
assert
self.res
self.init_frame()
return
True
def
init_frame(self):
self.frame
=
self.res.LoadFrame(None,
'
mainFrame
'
)
assert
self.frame
self.panel
=
xrc.XRCCTRL(self.frame,
'
panel
'
)
self.text1
=
xrc.XRCCTRL(self.panel,
'
text1
'
)
self.text2
=
xrc.XRCCTRL(self.panel,
'
text2
'
)
self.frame.Bind(wx.EVT_BUTTON, self.OnSubmit, id
=
xrc.XRCID(
'
button
'
))
self.frame.Show()
def
OnSubmit(self, evt):
wx.MessageBox(
'
Your name is %s %s!
'
%
(self.text1.GetValue(), self.text2.GetValue()),
'
Feedback
'
)
if
__name__
==
'
__main__
'
:
app
=
MyApp(False)
app.MainLoop()
創(chuàng)建XRC文件
首先我們看看XRC的組成。XRC文件由一系列預(yù)定義的標(biāo)簽組成,你可以注意到這些預(yù)定義的標(biāo)簽與控件創(chuàng)建時(shí)的關(guān)鍵字參數(shù)相似。例如,在wxPython中創(chuàng)建按鍵的代碼如下:
button
=
wx.Button(parent
=
panel, id
=
wx.ID_ANY, label
=
'
Submit
'
)
與之相應(yīng)的XRC代碼則是這個(gè)樣子:
<
object
class
="wxButton"
name
="button"
>
<
label
>
Submit
</
label
>
</
object
>
從例示中可以注意到幾個(gè)XRC的關(guān)鍵概念:
1. 每個(gè)控件與一個(gè)XML節(jié)點(diǎn)相對(duì)應(yīng)
2. 控件間的層次關(guān)系與XML節(jié)點(diǎn)間層次關(guān)系相對(duì)應(yīng),放置控件的容器與相應(yīng)的XML節(jié)點(diǎn)的父節(jié)點(diǎn)相對(duì)應(yīng)
3. 節(jié)點(diǎn)class屬性值對(duì)應(yīng)控件的C++類(lèi)名
4. 節(jié)點(diǎn)name屬性值為控件在XRC文件中的唯一標(biāo)識(shí),可通過(guò)該值自python源文件中獲取控件
5. label等其余參數(shù)在XRC文件中作為節(jié)點(diǎn)的子節(jié)點(diǎn)出現(xiàn)
有了這些基本概念,現(xiàn)在我們可以使用XRC文件來(lái)布局我們的用戶界面了。存在大量的工具以可視化的方式來(lái)幫助我們完成這個(gè)繁瑣的工作。wxPython 自帶的XRCED以一種半可視化的方式(可視化的設(shè)定控件屬性并預(yù)覽,但不支持直接拖放控件)支持用戶界面設(shè)計(jì);開(kāi)源的wxglade則支持直接的控件拖放,并可生成C++、python、perl、lisp和XRC的源文件;wxDesigner、dialogBlock,wxDesigner,BOA 等工具同樣值得一試。
XRC初步(下)
python源文件中的處理
完成了XRC界面布局文件的編寫(xiě),下一步必須在python源文件中做相應(yīng)的處理。與XRC處理相關(guān)的wxPython代碼段主要包括三個(gè)方面:資源文件的加載,控件的獲取和事件綁定代碼:
1.導(dǎo)入與XRC處理相關(guān)的xrc模塊:
import
wx.xrc as xrc
2.加載資源文件:
self.res
=
xrc.XmlResource(
'
XRCfilename.xrc
'
)
3.獲取控件。此過(guò)程不需要顯式的創(chuàng)建控件,通過(guò)設(shè)計(jì)XRC文件時(shí)相應(yīng)的name屬性值獲取即可:
#
加載Frame,第一個(gè)參數(shù)為父窗口,當(dāng)前為頂層窗口,故為None
#
第二個(gè)參數(shù)為設(shè)計(jì)XRC文件時(shí)Frame的name屬性值
self.frame
=
self.res.LoadFrame(None,
'
mainFrame
'
)
#
獲取控件,第一個(gè)參數(shù)為控件的父窗口
#
第二個(gè)參數(shù)為設(shè)計(jì)XRC文件時(shí)控件的name屬性值
self.panel
=
xrc.XRCCTRL(self.frame,
'
panel
'
)
self.text1
=
xrc.XRCCTRL(self.panel,
'
text1
'
)
#
獲取panel中的控件時(shí)不必顯式獲取panel本身,直接傳入self.frame即可遞歸向下查找
self.text2
=
xrc.XRCCTRL(self.frame,
'
text2
'
)
#
獲取控件ID,參數(shù)為設(shè)計(jì)XRC文件時(shí)控件的name屬性值
self.id
=
xrc.XRCID(
'
button
'
)
4.綁定事件處理有兩種方式:
a. 綁定按鍵事件:
self.button
=
xrc.XRCCTRL(self.panel,
'
button
'
)
self.frame.Bind(wx.EVT_BUTTON, self.OnSubmit, self.button)
b. 因?yàn)閤rc.XRCCTRL僅能返回wx.Window的派生類(lèi),而wxMenuItem不是派生自wx.Window,不能采用xrc.XRCCTRL 獲取菜單項(xiàng),因此事件必須委托給Frame綁定。派生自wx.Window的按鍵等控件也可以采用本方法綁定:
self.frame.Bind(wx.EVT_BUTTON, self.OnSubmit, id
=
xrc.XRCID(
'
button
'
))
動(dòng)態(tài)創(chuàng)建
加載Frame窗體時(shí)將自動(dòng)加載其子控件和子窗體,那么,你如何控制子窗體和子控件的加載呢?為此,你必須將子窗體定義為和窗體節(jié)體平行的頂級(jí)節(jié)點(diǎn) (Frames、Dialogs、Panels、Toolbars、Menus和MenuBars可以作為頂級(jí)節(jié)點(diǎn)),并通過(guò)程序控制加載。如下例:
dynamic.xrc文件:
<?
xml version="1.0" encoding="utf-8"
?>
<
resource
>
<
object
class
="wxFrame"
name
="mainFrame"
>
<
title
>
Primary Frame
</
title
>
<
object
class
="wxPanel"
name
="mainPanel"
>
<
object
class
="wxButton"
name
="button"
>
<
label
>
New Frame
</
label
>
</
object
>
</
object
>
</
object
>
<
object
class
="wxFrame"
name
="nextFrame"
>
<
title
>
Secondary Frame
</
title
>
<
object
class
="wxPanel"
name
="nextPanel"
>
<
object
class
="wxStaticText"
name
="label"
>
<
label
>
This is a dynamically created frame.
</
label
>
</
object
>
</
object
>
</
object
>
</
resource
>
Python源文件:
import
wx
from
wx
import
xrc
class
MyApp(wx.App):
def
OnInit(self):
self.res
=
xrc.XmlResource(
'
dynamic.xrc
'
)
self.init_frame()
return
True
def
init_frame(self):
self.frame
=
self.res.LoadFrame(None,
'
mainFrame
'
)
self.panel
=
xrc.XRCCTRL(self.frame,
'
mainPanel
'
)
self.button
=
xrc.XRCCTRL(self.panel,
'
button
'
)
self.frame.Bind(wx.EVT_BUTTON, self.OnNewFrame, self.button)
self.frame.Show()
def
OnNewFrame(self, evt):
self.frame2
=
self.res.LoadFrame(None,
'
nextFrame
'
)
self.frame2.Show()
if
__name__
==
'
__main__
'
:
app
=
MyApp(False)
app.MainLoop()
動(dòng)態(tài)添加子控件時(shí)必須首先調(diào)用父窗口的GetSizer方法,創(chuàng)建控件后添加到Sizer,并調(diào)用Sizer的Fit方法為控件留出顯示空間:
MainWindow
=
res.LoadFrame(None,
"
frame_1
"
)
my_sizer
=
MainWindow.GetSizer()
my_text
=
wx.TextCtrl(MainWindow,
-
1
,
"
Test
"
, size
=
(
325
,
200
))
my_sizer.Add(my_text,
1
, wx.EXPAND
|
wx.ADJUST_MINSIZE, 0)
my_sizer.Fit(MainWindow)
posted on 2008-03-24 13:52
金慶
閱讀(4847)
評(píng)論(1)
編輯
收藏
引用
所屬分類(lèi):
6. Python
評(píng)論
#
re: XRC初步
2008-08-29 14:23
songgod
請(qǐng)教一下你知道如何解決wxglade導(dǎo)出xrc文件時(shí)候不支持中文的問(wèn)題,編碼用utf-8也不行,而且都也不支持gb2312編碼。如果看到請(qǐng)聯(lián)系我:sgd_33@163.com
回復(fù)
更多評(píng)論
刷新評(píng)論列表
只有注冊(cè)用戶
登錄
后才能發(fā)表評(píng)論。
【推薦】100%開(kāi)源!大型工業(yè)跨平臺(tái)軟件C++源碼提供,建模,組態(tài)!
相關(guān)文章:
vs2017 linux 編譯輸出改成 vs 格式
xlsx批量轉(zhuǎn)為utf8的csv
如何運(yùn)行 rpcz python example
Windows上Python讀取stdin出錯(cuò)
建立Socket Policy服務(wù)器
python計(jì)算24點(diǎn)
(Python編程)Pickle對(duì)象
Boost.Python中文文檔下載
用Boost.Python構(gòu)建混合系統(tǒng)
Python封裝的性能研究
網(wǎng)站導(dǎo)航:
博客園
IT新聞
BlogJava
博問(wèn)
Chat2DB
管理
Powered by:
C++博客
Copyright © 金慶
久久永久免费人妻精品下载
|
无码任你躁久久久久久久
|
亚洲第一极品精品无码久久
|
久久99精品国产自在现线小黄鸭
|
国产∨亚洲V天堂无码久久久
|
国产精品成人99久久久久91gav
|
久久婷婷国产剧情内射白浆
|
国产精品九九九久久九九
|
久久久久女教师免费一区
|
亚洲AV无码一区东京热久久
|
久久被窝电影亚洲爽爽爽
|
国产成人久久久精品二区三区
|
久久天天躁狠狠躁夜夜2020一
|
久久丫忘忧草产品
|
国产精品久久久久久久
|
久久久久久免费视频
|
伊人久久大香线焦综合四虎
|
亚洲中文久久精品无码ww16
|
久久精品国产精品国产精品污
|
精品久久人人爽天天玩人人妻
|
精品国产热久久久福利
|
精品一区二区久久久久久久网站
|
精品国产乱码久久久久软件
|
精品国产91久久久久久久a
|
国产一久久香蕉国产线看观看
|
久久久SS麻豆欧美国产日韩
|
中文国产成人精品久久亚洲精品AⅤ无码精品
|
久久久久亚洲AV无码永不
|
97精品伊人久久大香线蕉
|
久久久久久久国产免费看
|
夜夜亚洲天天久久
|
久久国产影院
|
久久亚洲精品无码播放
|
日韩久久久久中文字幕人妻
|
婷婷久久综合九色综合绿巨人
|
久久精品无码一区二区app
|
国产精品亚洲美女久久久
|
亚洲国产二区三区久久
|
国内精品久久久久久麻豆
|
精品久久久久久无码人妻热
|
久久五月精品中文字幕
|