PyGTK 예제 소스를 순수 API를 호출하는 방법과 GtkBuilder를 사용한 방법으로 각각 구현해본다.
Hello, World
아래와 같은 모습을 가지도록 프로그램을 수정한다.
API 호출
코드
hello.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
class HelloWorld :
def hello(self, widget, data=None) :
print 'Hello, World'
def delete_event(self, widget, event, data=None):
print 'delete event occurred'
return False
def destroy(self, widget, data=None) :
gtk.main_quit()
def __init__(self) :
self._win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self._win.connect('delete_event', self.delete_event)
self._win.connect('destroy', self.destroy)
self._win.set_border_width(10)
self._btnhello = gtk.Button('Hello World')
self._btnhello.connect('clicked', self.hello, None)
self._btnhello.connect_object('clicked', gtk.Widget.destroy, self._win)
self._win.add(self._btnhello)
def main(self) :
self._win.show_all()
gtk.main()
def main() :
w = HelloWorld()
w.main()
if __name__ == '__main__' :
main()
GtkBuilder
GtkBuilder를 사용하면 ui 구성 코드를 xml로 분리할 수 있다.
코드
hello.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<interface>
<object class="GtkWindow" id="HelloWindow">
<property name="border_width">10</property>
<signal name="delete_event" handler="delete_event" />
<signal name="destroy" handler="destroy" />
<child>
<object class="GtkButton" id="BtnHello">
<property name="label">Hello, world</property>
<signal name="clicked" handler="hello" />
</object>
</child>
</object>
</interface>
hello2.py
>#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
class HelloWorld :
def hello(self, widget, data=None) :
print 'Hello, World'
def delete_event(self, widget, event, data=None):
print 'delete event occurred'
return False
def destroy(self, widget, data=None) :
gtk.main_quit()
def __init__(self) :
builder = gtk.Builder()
builder.add_from_file('hello2.xml')
builder.connect_signals(self)
self._win = builder.get_object('HelloWindow')
self._btnhello = builder.get_object('BtnHello')
self._btnhello.connect_object('clicked', gtk.Widget.destroy, self._win)
def main(self) :
self._win.show_all()
gtk.main()
def main() :
w = HelloWorld()
w.main()
if __name__ == '__main__' :
main()
Hello, World 업그레이드
아래와 같은 모습을 가지도록 프로그램을 수정한다.
API 호출
코드
hello_upgrade.py
>#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
class HelloWorld2 :
def callback(self, widget, data) :
print 'Hello again - %s was pressed ' % data
def delete_event(self, widget, event, data=None):
gtk.main_quit()
return False
def __init__(self) :
self._win = gtk.Window(gtk.WINDOW_TOPLEVEL)
self._win.set_title('Hello Buttons!')
self._win.connect('delete_event', self.delete_event)
self._win.set_border_width(10)
self._box1 = gtk.HBox(False, 0)
self._win.add(self._box1)
self._button1 = gtk.Button('Button 1')
self._button1.connect('clicked', self.callback, 'button 1')
self._box1.pack_start(self._button1, True, True, 0)
self._button2 = gtk.Button('Button 2')
self._button2.connect('clicked', self.callback, 'button 2')
self._box1.pack_start(self._button2, True, True, 0)
def main(self) :
self._win.show_all()
gtk.main()
def main() :
w = HelloWorld2()
w.main()
if __name__ == '__main__' :
main()
GtkBuilder
코드
hello2_upgrade.xml
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<interface>
<object class="GtkWindow" id="HelloWindow">
<property name="title">Hello Buttons!</property>
<property name="border_width">10</property>
<signal name="delete_event" handler="delete_event" />
<child>
<object class="GtkHBox" id="box1">
<child>
<object class="GtkButton" id="button1">
<property name="label">Button 1</property>
<signal name="clicked" handler="callback" />
</object>
</child>
<child>
<object class="GtkButton" id="button2">
<property name="label">Button 2</property>
<signal name="clicked" handler="callback" />
</object>
</child>
</object>
</child>
</object>
</interface>
hello2_upgrade.py
#!/usr/bin/python
# -*- coding: utf-8 -*-
import gtk
class HelloWorld2 :
def callback(self, widget, data = None) :
print 'Hello again - %s was pressed ' % widget.get_name()
def delete_event(self, widget, event, data=None):
gtk.main_quit()
return False
def __init__(self) :
builder = gtk.Builder()
builder.add_from_file('hello2_upgrade.xml')
builder.connect_signals(self)
self._win = builder.get_object('HelloWindow')
def main(self) :
self._win.show_all()
gtk.main()
def main() :
w = HelloWorld2()
w.main()
if __name__ == '__main__' :
main()
Reference