2013-04-25 2 views
1

Я только что начал Python, около 2 недель назад. Теперь я пытаюсь создать GUI с 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

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

enter image description here

+0

Совет: не просто использовать 'except', используя' except ImportError' более точный. –

+0

@SantoshKumar Спасибо за подсказку :) –

ответ

2

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

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

+0

Спасибо за рекомендацию. –

2

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

# -*- 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 сразу, это поможет вам значительно сократить сложность кода, что в противном случае было бы связано с ненужным и трудноподдерживаемым кодом.

+0

Спасибо, это то, что я выяснил, тоже. Но мне нравится ваш подход к подключению к сигналу. –

Смежные вопросы