wiki:waue/2009/1126

glade 3

用glade 3可以幫助我們把程式介面畫出來,存檔的副檔名雖為glade,但為xml格式。

細部的格式分libgrade 與 gtkbuilder ,此範例是用 libgrade。

libgrade

ui.glade (libgrade 的xml )

<glade-interface>
  <!-- interface-naming-policy project-wide -->
</glade-interface>

python 部份程式碼

#!/usr/bin/env python
import pygtk
import gtk
import gtk.glade

...

class Example():

    def __init__(self):
        self.ui_file=sys.path[0]+'/ui.glade'
        self.widgetTree=gtk.glade.XML(self.ui_file,'window1')
        dic={"on_exit_clicked":gtk.main_quit,\
             "on_window1_destroy":gtk.main_quit,\
             "on_XX_clicked":self.toXX,\
             "on_OO_clicked":self.toOO}
        self.widgetTree.signal_autoconnect(dic)

python範例的完整程式碼

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import pygtk
import gtk
import gtk.glade
import urllib
import urllib2
import threading
import re
import sys

#class trans(threading.Thread):
class trans(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self, name='trans')
        self.url='http://fanyi.cn.yahoo.com/translate_txt'
        self.text=None
        self.trans_in=''
        self.trans_out=''
        self.text_out=None
        self.text_in=None
        
    def getText(self,widget):
        buf=widget.get_buffer()
        b,e=buf.get_bounds()
        return buf.get_text(b,e)
        
    def setText(self,widget,text=''):
        buf=widget.get_buffer()
        buf.set_text(text)
        widget.set_buffer(buf)
        
    def run(self):
        self.setText(self.text_out,'正在翻譯')
        
        values={'ei':'UTF-8',\
                'fr':'',\
                'lp':'%s_%s' %(self.trans_in,self.trans_out),\
                'trtext':'%s' %(self.getText(self.text_in).replace('\n','\r\n\r'),)}       
        data=urllib.urlencode(values)
        request=urllib2.Request(self.url,data)
        conn=urllib2.urlopen(request)
        res=conn.read()
        res=re.findall('<div id="pd" class="pd"> (.{1,})</div>',res)
        res=res[0].replace('<br/>','\n')
        res=res.replace('<dnt> </dnt>','\n')
        self.setText(self.text_out,res)
        
        
class yahooTrans():

    def __init__(self):
        self.ui_file=sys.path[0]+'/ui.glade'
        self.widgetTree=gtk.glade.XML(self.ui_file,'window1')
        dic={"on_exit_clicked":gtk.main_quit,\
             "on_window1_destroy":gtk.main_quit,\
             "on_to_zh_clicked":self.toZh,\
             "on_to_en_clicked":self.toZh}
        self.widgetTree.signal_autoconnect(dic)
        
    def toZh(self,widget):
        print widget.get_name()
        t=trans()
        t.text_in=self.widgetTree.get_widget('text_in')
        t.text_out=self.widgetTree.get_widget('text_out')
        if widget.get_name()=='to_zh':
            t.trans_in='en'
            t.trans_out='zh'
        else:
            t.trans_in='zh'
            t.trans_out='en'
        t.setDaemon(True) 
        t.start()

    def main(self):
        gtk.main()
        
if __name__=='__main__':
    gtk.gdk.threads_init()
    app=yahooTrans()
    app.main()

GTKBuilder

  • GTKBuilder 為通用格式,libglade也可轉換為此格式

gtkbuilder 的xml格式

<interface>
  <!-- interface-naming-policy project-wide -->
</interface>

python 引用方法

import pygtk
pygtk.require("2.0")
import gtk
class TutorialApp(object):
    def __init__(self):
        builder = gtk.Builder()
        builder.add_from_file("tutorial.xml")
        builder.connect_signals({ "on_window_destroy" : gtk.main_quit })
        self.window = builder.get_object("window")
        self.window.show()

    if __name__ == "__main__":
        app = TutorialApp()
        gtk.main()
Last modified 14 years ago Last modified on Jun 29, 2010, 11:16:18 AM

Attachments (2)

Download all attachments as: .zip