Мне нужен пример кода для простого скрипта Python-GUI с Gtk + - PullRequest
0 голосов
/ 06 мая 2019

Я новичок в 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>

1 Ответ

0 голосов
/ 13 мая 2019

Я предполагаю, что вы используете Gnome Builder для создания своего приложения. Чтобы подключить обработчик к кнопке, необходимо добавить <signal name="clicked" handler="handler_name" /> к кнопке.

http://www.learningpython.com/2006/05/07/creating-a-gui-using-pygtk-and-glade/

Это ссылка на учебник по использованию pygtk с glade, который в основном применим к фреймворку, с которым вы работаете

Это блок кода из моего файла window.py, который соединяет кнопку VisitFaq с ее обработчиком

@Gtk.Template(resource_path='/edu/umich/help/window.ui')
class HelpWindow(Gtk.ApplicationWindow):
    __gtype_name__ = 'HelpWindow'
    VisitFaq = Gtk.Template.Child()
    ChatButton = Gtk.Template.Child()
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.ChatButton.connect('clicked', self.start_chat)


    def start_chat(self):

Вот как выглядит VisitFaq в файле пользовательского интерфейса

<object class="GtkButton" id="VisitFaq">
                    <property name="label" translatable="yes">Visit the FAQ</property>
                    <property name="name">FaqButton</property>
                    <property name="visible">True</property>
                    <property name="can_focus">True</property>
                    <property name="receives_default">True</property>
                    <signal name="clicked" handler="visit_faq" />
                  </object>
...