Как можно создать программу, использующую графический интерфейс?

Я только начал Python, около 2 недель назад. Теперь я пытаюсь создать графический интерфейс с PyGObject, используя Glade.

Однако я озадачен тем, каким должен быть общий макет программы.

Должен ли я использовать класс для основной программы и сигналов, или я должен разделить их?

Есть ли «лучший подход» для этого?

Или, как в моем скромном подходе, мне вообще не использовать классы?

Как мне общаться между функциями в приведенном ниже примере? Например, как сделать параметр parent функции Gtk.MessageDialog главным окном программы?

Код Python:

#!/usr/bin/python

try:
    from gi.repository import Gtk
except:
    print('Cannot Import Gtk')
    sys.exit(1)

# Confirm and exit when Quit button is clicked.
def on_button_quit_clicked(widget):
    confirmation_dialog = Gtk.MessageDialog(parent = None,
                                            flags = Gtk.DialogFlags.DESTROY_WITH_PARENT,
                                            type = Gtk.MessageType.QUESTION,
                                            buttons = Gtk.ButtonsType.YES_NO,
                                            message_format = 
                                            'Are you sure you want to quit?')
    print ('Quit confirmation dialog is running.')
    confirmation_response = confirmation_dialog.run()                                              
    if confirmation_response == Gtk.ResponseType.YES:
        print ('You have clicked on YES, quiting..')
        Gtk.main_quit()
    elif confirmation_response == Gtk.ResponseType.NO:
        print ('You have clicked on NO')
    confirmation_dialog.destroy()
    print ('Quit confirmation dialog is destroyed.')

# Show About dialog when button is clicked.
def on_button_about_clicked(widget):
    print ('About')

# Perform addition when button is clicked.
def on_button_add_clicked(widget):
    print ('Add')

# Main function
def main():
    builder = Gtk.Builder()
    builder.add_from_file('CalculatorGUI.glade')

    signalHandler = {
    'on_main_window_destroy': Gtk.main_quit,
    'on_button_quit_clicked': on_button_quit_clicked,
    'on_button_about_clicked': on_button_about_clicked,
    'on_button_add_clicked': on_button_add_clicked
    }
    builder.connect_signals(signalHandler)

    main_window = builder.get_object('main_window')  
    main_window.show_all()

    Gtk.main()
    print ('Program Finished!')

# If the program is not imported as a module, then run.
if __name__ == '__main__':
    main()

Состав файла CalculatorGUI.glade: http://pastebin.com/K2wb7Z4r

Скриншот программы:

введите здесь описание изображения


person abdullah kahraman    schedule 25.04.2013    source источник
comment
Совет: не просто используйте except, использование except ImportError более точно.   -  person Santosh Kumar    schedule 25.04.2013
comment
@SantoshKumar Спасибо за совет :)   -  person abdullah kahraman    schedule 25.04.2013


Ответы (2)


Для тех, кто только начал программировать на Python, я настоятельно рекомендую попробовать программировать графический интерфейс вручную, а не с помощью таких инструментов, как GLADE, wxGLADE...

Выполняя этот трудный путь, вы узнаете все, что вам нужно знать о структуре программы. Особенно с такими простыми программами.

person Domagoj    schedule 25.04.2013
comment
Спасибо за рекомендацию. - person abdullah kahraman; 25.04.2013

Я бы использовал классы, таким образом вы можете сохранить состояние/переменные приложения, разделенные между методами. Конкретный дизайн вашего приложения зависит от ваших потребностей. Это мой личный базовый шаблон для простых приложений:

# -*- coding:utf-8 -*-
#
# Copyright (C) 2013 Carlos Jenkins <[email protected]>
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

"""
PyGObject example with Glade and GtkBuilder.

Check dependencies are installed:

    sudo apt-get install python2.7 python-gi gir1.2-gtk-3.0

To execute:

    python main.py

Python reference still unavailable, nevertheless C reference documentation is
available at:

    https://developer.gnome.org/gtk3/

And a good tutorial at:

    https://python-gtk-3-tutorial.readthedocs.org/en/latest/index.html

"""

from gi.repository import Gtk
from os.path import abspath, dirname, join

WHERE_AM_I = abspath(dirname(__file__))

class MyApp(object):

    def __init__(self):
        """
        Build GUI
        """

        # Declare states / variables
        self.counter = 0

        # Build GUI from Glade file
        self.builder = Gtk.Builder()
        self.glade_file = join(WHERE_AM_I, 'gui.glade')
        self.builder.add_from_file(self.glade_file)

        # Get objects
        go = self.builder.get_object
        self.window = go('window')
        self.button = go('button')

        # Connect signals
        self.builder.connect_signals(self)

        # Configure interface
        self.window.connect('delete-event', lambda x,y: Gtk.main_quit())

        # Everything is ready
        self.window.show()

    def _btn_cb(self, widget, data=None):
        """
        Button callback
        """
        self.counter += 1
        print('Button pressed {} times.'.format(self.counter))


if __name__ == '__main__':
    gui = MyApp()
    Gtk.main()

Вы можете проверить полный шаблон по адресу https://gist.github.com/carlos-jenkins/5467657

И если вы учитесь лучше, если вы учитесь правильно и сразу используете Glade, это очень поможет вам и уменьшит сложность кода, который в противном случае был бы забит ненужным и сложным в обслуживании кодом.

person Havok    schedule 26.04.2013
comment
Спасибо, я тоже так понял. Но мне нравится твой подход к подключению сигнала. - person abdullah kahraman; 26.04.2013