Я новичок в Python и ООП и мне нужен пример скрипта, чтобы понять, как связаны объекты gtk.builder и объекты окон. Для начала я использую gnome-builder.
То, что я хотел бы, это загрузить определение графического интерфейса из xml, созданного строителем (или Glade): на самом деле все просто:
Окно для кнопки и метки. При нажатии кнопки метка переключается, как показано или скрыто. Однако метка (если она показана) должна представлять собой постоянно меняющуюся случайную букву.
Следующий код из Приветственного мира Gnome Builder с графическим интерфейсом, измененным для моих нужд.
main.py:
import sys
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gio
from .window import TestWindow
class Application(Gtk.Application):
def __init__(self):
super().__init__(application_id='test',
flags=Gio.ApplicationFlags.FLAGS_NONE)
def do_activate(self):
win = self.props.active_window
if not win:
win = TestWindow(application=self)
win.present()
def main(version):
app = Application()
return app.run(sys.argv)
window.py:
from gi.repository import Gtk
@Gtk.Template(resource_path='/test/window.ui')
class TestWindow(Gtk.ApplicationWindow):
__gtype_name__ = 'TestWindow'
label = Gtk.Template.Child()
def __init__(self, **kwargs):
super().__init__(**kwargs)
window.ui:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.22.1 -->
<interface>
<requires lib="gtk+" version="3.20"/>
<template class="TestWindow" parent="GtkApplicationWindow">
<property name="can_focus">False</property>
<property name="default_width">600</property>
<property name="default_height">300</property>
<child type="titlebar">
<placeholder/>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="orientation">vertical</property>
<child>
<object class="GtkLabel" id="label">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="button">
<property name="label" translatable="yes">button</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
</child>
</object>
</child>
</template>
</interface>