使用PyGtk和Glade构建应用程序_第1页
使用PyGtk和Glade构建应用程序_第2页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、PyGtkGlade构建应程序在使PyGTK和Glade完成了我的第个例后,我决定写个更加复杂的例,但是我写不出个好的题来.(注: 我很乐意听到你对任何例或帖有任何建议),于是我决定写个简单的程序或许会从这找出些有的主题来.我的想法是创建个可以让我记录我喝过酒的种类以及我对它们的喜好程度.我写想这个程序很久了,因此我想把学习PyGTK和写它结合起来会是个好主意.我把这个项命名为PyWine.本例程的全部代码和Glade件可以从这下载.下载:我们要做的第件事情是在项录下创建个名为PyWine的新Glade项.然后创建个名为”mainWindow”的窗,并把它的标题设置成”PyWine”.然后像在

2、例程1那样为它添加个销毁的信息处理器.然后我添加了个有4的垂直盒(VerticalBox), (从上到下):放置菜单栏,放具栏,放个树状或列表视图,最后旋转个状态栏.把树状视图命名为”wineView”.我们刚添加的树形/列表视图会来显酒的信息.因此我们要做的第件事就是我们应当允许户往对话框添加种酒.我们需要使个菜单命令和具栏按钮来完成这个任务.先添加个具栏按钮.这只需要简单的在控件板选择”具栏按钮”控件然后再点击我们往窗添加的具栏.这应该会往具栏添加个样很奇怪的按钮.现在我们需要在”物件标签”(widget tab)来编辑这个具栏按钮的属性.我们把它的名字设置成”tbAddWine”,图标设

3、置成个带加号的图标.(译注:下的图可能与glade版本相关,我这的图标名称为gtk-add,请根据需要作少许变更:D).现在我们要为tbAddWine按钮添加个点击事件的处理器,这次我们不使默认的名字,把它命名为”on_AddWine”.现在我们要对菜单作些修改了,因为我们希望们既能够通过具栏按钮或是通过菜单栏添加酒的条.那么就点击窗上的菜单栏然后转到属性窗中的物件标签页,然后点”编辑菜单”按钮来编辑菜单栏.(译注:这没有讲怎么往窗添加菜单栏,和添加具栏样,从glade的板找:D).现在点击”添加”按钮来添加个新的根菜单项,把它的标签设置成”_Add”.然后在菜单列表中选择这个”Add”项然后

4、点击”添加项”(Add Child)按钮, 这就会为Add菜单创建个菜单.把这个新的菜单项的标签设置成”_Wine”并把它的事件处理器设成”on_AddWine”.你可能会注意到具栏按钮Add的点击事件处理器和菜单Add|Wine的点击事件处理器是样的.这是因为这两个物件都是要进同样的任务:往酒列表中添加酒的条.因此当户点Add Wine按钮或是从菜单中选择Add|Wine时要发就是弹出个可以让户添加些有关酒详细信息的对话框.如果他们最后选择Ok按钮那么就把他们输的酒的信息添加进列表视图中.所以接下来我们要做的是创建个可以让户添加酒的对话框.在这个例中我们尽量让事情保持简单:仅仅让户输酒的名字

5、,产家,装瓶的年代以及葡萄的类别.因此我们仅要通过点击Glade板上的对话框按钮来创建个新的对话框.这就会弹出个新建对话框窗,在选择包含Cancel和Ok按钮的”标准按钮布局”选项.把对话框的名字设置成”wineDlg”,窗标题设置成”Add Wine”.接下来我们要个表格来布置winedlg中的东西.向对话框中添加表格(和通常添加物件的法相同),并把数设成4,列数设置成2.然后我们就要标签和字输物件来填充表格的空隙直到它看起来像这样:我在表格的间增加了3个像素的间隔,这个设置可以在表格属性的物件标签页找到.如果你正在为怎么选择这个表格犯愁,你可以通过选择glade主窗中的菜单栏”视图 | 显

6、物件树”(View|Show widget Tree). 或者按下shift键,然后左键点击表格上的物件,这会让你在这个对话框中的所有物件间循环.现在我们要编辑这个对话框中的所有东西,把它们命名为:enWine, enWinery, enGrape和enYear.Python现在我们要写些让它作的代码了.我们把这个python件命名为pywine.py,把它放在/projects/Pywine录中(和我们创建glade件的录相同).下是我们要到的基本代码(部分都是从上个例程中拿来的).passThis is the PyWine applicationself.wTree.signal_aut

7、oconnect(dic)def OnAddWine(self, widget):Called when the use wants to add a wineprint OnAddWinegtk.main()在这多了点额外的东西.个是on_AddWine信号的处理器.如果你运这个程序你会注意到当你点击Add Wine按钮或是从菜单栏中选择Add | Wine时会打印出”OnAddWine”.代码中的新加的另外个是我们把主窗的名字传给gtk.glade.XML,这会让我们只加载这个窗和它的窗.下步是创建个来存储酒信息的类:class Wine:This class represents all

8、 the wine informationdef _init_(self, wine=, winery=, grape=, year=):很简单,下步我们需要创建个给wineDlg使的类,我们称它为wineDialog:This class is used to show wineDlg#setup the glade fileself.gladefile = pywine.glade#setup the wine that we will returnself.wine = Wine(wine,winery,grape,year)下步我们需要为wineDialog添加个函数,它来从glade

9、件中装载wineDialg物件并显.我们还想要返回这个对话框的执结果,这会是个gtk_RESPONSE,你可以从 得到更多的信息.这个就是run 函数:#run the dialog and store the responseself.result = self.dlg.run()#get the value of the entry fieldsself.wine.wine = self.enWine.get_text()self.wine.winery = self.enWinery.get_text()self.wine.grape = self.enGrape.get_text()s

10、elf.wine.year = self.enYear.get_text()#we are done with the dialog, destroy itself.dlg.destroy()#return the result and the winereturn self.result,self.wine你会注意到我们装载对话框的法的是和装载主窗样的法.我们调gtk_glade_XML()并把我们想要装载物件的名称传给它.这将会动的显这个对话框(和装载主窗的为相同),但这样不够好,我们想让run函数等待户退出了这个对话框才返回.要这么做我们需要从物件树得到这个这个对话框物件(self.dl

11、g = self.wTree.get_widget(“wineDlg”),然后调 . 下是PyGTK档对这个函数的描述:Run()法会在个穷的主循环阻塞到它收到个”response”信号或是销毁.如果这个对话框是被销毁了,run ()法会返回个gtk_RESPONSE_NONE;否则它返回个在response信号中的响应id. 在进这个穷的主循环之前run ()法会为你调对话框的gtk_Widget_show()函数.注意你仍然需要负责显对话框的窗.在run()法运期间,delete事件的默认为是被禁的,如果对话框收到个delete的事件,它并不会像窗通常那样进销毁,这时run()法会返回个g

12、tk_RESPONSE_DELETE_EVENT.且在run()法运的时候对话框是模态的.你可以通过调responese()函数产个response信号来强制run ()法在任何时候退出.在run()法运的时候销毁对话框是很糟糕的主意,因为你后的代码法知道对话框是不是已经销毁了.在run()法返回后,你需要负责对话框的隐藏和销毁.Ok按钮会返回gtk_RESPONSE_OK,Cancel按钮会返回gtk_RESPONSE_CANCEL,部分情况下我们仅关对话框返回的wine信息是不是由户点Ok按钮产的.你还可以看到我们从对话框得到GTKEntry物件来取/设置它们的字.总得来说这个函数还是相当

13、简单的. (List Stores)现在我们有了户想要往列表中添加的酒,我们需要把它添加进 中.GTKTreeViews的主要特性就是它们按照模型指定的任何式来显它们的数据.数据模型可以 , , ,或是 . 在本例中我们将使gkt_ListStore.树状视图与模型的关系有些复杂,但是旦你可以使它你就会理解为什么它们是这样的.很简单的讲模型表现数据,树状视图则是个简单的显数据的法.所以对于同份数据(模型)你可以有多个完全不同的视图.下是 中的内容:在GTK+中要创建个树或列表可以使结合使GtkTreeModel接和GtkTreeView物件.这个物件使模型/视图/控制器模式设计,它由以下四个主

14、要部分组成:树状视图物件(GtkTreeView)列视图 (GtkTreeViewcolumn)单元渲染器(GtkCellRenderer等等)模型接(GtkTreeModel)视图是由前的三组对象组成,最后个是模型.MVC设计模式的个主要收益是可以使单个模型创建多个视图.例如:由件系统映射的模型(可能由个件管理器创建),可以创建多种视图来显件系统的各个部分,但仅需要在内存中保存份拷贝我们要做的第件是在动把词典和物件树连接上后往pyWine类的_init_函数中添加些代码:self.wineView = self.wTree.get_widget(wineView)#Add all of th

15、e List Columns to the wineViewself.AddWineListColumn(self.sWine, self.cWine)self.AddWineListColumn(self.sWinery, self.cWinery)self.AddWineListColumn(self.sGrape, self.cGrape)self.AddWineListColumn(self.sYear, self.cYear)这个代码是相当直观的,先我们创建些类似定义的变量(这样我们在后就可以很轻松的改变它们)然后我们从物件树中得到gtk_TreeView. 在这之后我们通过调个新的

16、函数来往列表中添加我们需要的列.AddWineListColumn是个很快的函数,但它能防我们每次重复写创建列的代码.column = gtk.TreeViewColumn(title, gtk.CellRendererText(), text=columnId)column.set_resizable(True)column.set_sort_column_id(columnId)self.wineView.append_column(column)这个代码有点点复杂,先我们创建个使 作为它的 的新 . 这是些从 的较全的信息:旦GtkTreeView物件有了个模型, 它需要知道如何显这个模

17、型. 它通过列和单元渲染器来完成这项作.单元渲染器 是来使某种法在树状模型中绘图这些数据. 在GTK+2.x中有很多单元渲染器, 包括: GtkCellRenderText,GtkCellRendererPixbuf 和GtkCellRendererToggle. 写个定义的渲染器也相对简单.GtkTreeView使GtkTreeViewColumn对象来组织在树状视图中纵的列. 它需要知道列的名字来以标签的形式显给户, 使单元渲染器的类型和对于个给定的它需要得到的数据块.因此简单的讲我们在创建个包含特定标题的列,并指明它将会使gtk_CellRendererText(来显简单的字),然后再告

18、诉它它与模型中的哪项关联在起.然后我们把它设置成可以改 变且户可以通过点击列的头来对它进排序.在这之后我们把这列加到视图中.好了,我们完成了模型的创建.我们要再回到pyWine类的_init_函数继续:self.wineView.set_model(self.wineList)体上我们仅仅创建了个gtk_ListStore并告诉它它有四个项,并且它们都是字符串.然后我们把这个模型与视图绑定起来,这就是所有我们需要为初始化gtk_TreeView做的.我们要做的最后件事是完成pyWine类中的OnAddWine函数(从菜单或具栏按钮调).这个函数很简单:self.wineList.append(

19、newWine.getList()这我们创建了个wineDialog的实例,然后运它并把户输的酒的信息保存.然后我们检查result是不是gtk_RESPONSE_OK(户点击了Ok按钮),如果是我们就把酒的信息添加到gtk_ListStore中,它会动的在gtk_TreeView中显出来因此它们是连接在起的.在wine类中我使简单的getList函数以使阅读代码变得简单些:到这这个简单程序就算完成了,尽管它不保存任何信息或是任何和它类似的信息,但是它确实描述了些创建个完整pyGTK 应程序的基本步骤.完整的代码和Glade件可以在下载,你也可浏览下的完整程序:#!/usr/bin/env p

20、ythonimport systry:import pygtkpygtk.require(2.0)except:passtry:import gtkimport gtk.gladeexcept:sys.exit(1)class pyWine:This is an Hello World GTK applicationdef _init_(self):#Set the Glade fileself.gladefile = pywine.gladeself.wTree = gtk.glade.XML(self.gladefile, mainWindow)#Create our dictionay

21、and connect itdic = on_mainWindow_destroy : gtk.main_quit, on_AddWine : self.OnAddWineself.wTree.signal_autoconnect(dic)#Here are some variables that can be reused laterself.cWine = 0self.cWinery = 1self.cGrape = 2self.cYear = 3self.sWine = Wineself.sWinery = Wineryself.sGrape = Grapeself.sYear = Ye

22、ar#Get the treeView from the widget Treeself.wineView = self.wTree.get_widget(wineView)#Add all of the List Columns to the wineViewself.AddWineListColumn(self.sWine, self.cWine)self.AddWineListColumn(self.sWinery, self.cWinery)self.AddWineListColumn(self.sGrape, self.cGrape)self.AddWineListColumn(se

23、lf.sYear, self.cYear)#Create the listStore Model to use with the wineViewself.wineList = gtk.ListStore(str, str, str, str)#Attache the model to the treeViewself.wineView.set_model(self.wineList)def AddWineListColumn(self, title, columnId):This function adds a column to the list view.First it create

24、the gtk.TreeViewColumn and then setsome needed propertiescolumn = gtk.TreeViewColumn(title, gtk.CellRendererText(), text=columnId)column.set_resizable(True)column.set_sort_column_id(columnId)self.wineView.append_column(column)def OnAddWine(self, widget):Called when the use wants to add a wine#Cteate

25、 the dialog, show it, and store the resultswineDlg = wineDialog();result,newWine = wineDlg.run()if (result = gtk.RESPONSE_OK):The user clicked Ok, so lets add thiswine to the wine listself.wineList.append(newWine.getList()class wineDialog:This class is used to show wineDlgdef _init_(self, wine=, win

26、ery=, grape=, year=):#setup the glade fileself.gladefile = pywine.glade#setup the wine that we will returnself.wine = Wine(wine,winery,grape,year)def run(self):This function will show the wineDlg#load the dialog from the glade fileself.wTree = gtk.glade.XML(self.gladefile, wineDlg)#Get the actual di

27、alog widgetself.dlg = self.wTree.get_widget( wineDlg)#Get all of the Entry Widgets and set their textself.enWine = self.wTree.get_widget( enWine)self.enWine.set_text(self.wine.wine)self.enWinery = self.wTree.get_widget( enWinery)self.enWinery.set_text(self.wine.winery)self.enGrape = self.wTree.get_widget( e

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论