Диалог Pygtk и возвращение идентификатора / информации

Я пишу приложение с быстро-pygtk-glade, и я хочу показать диалог и получить идентификатор возврата ... Я использовал метод run (), но если закрыть диалоговое окно и открыть его снова, я получаю пустое окно и некоторые ошибки! Я использовал destroy (), чтобы закрыть его ..

Затем я попытался использовать метод show (), но я могу получить возвращаемое значение, используя

id = dialog.show()

, как я могу получить возвращаемый идентификатор?

Кроме того, как я могу получить текст какой-нибудь записи в диалоге из основного кода?

1
задан 2 August 2012 в 02:08

3 ответа

from gi.repository import Gtk

builder = Gtk.Builder()
#correct the path to ui file
builder.add_from_file("ui/stuff.glade")

class Worker:
    def __init__(self):
        self.dia = builder.get_object("MyDialogue")
        self.win = builder.get_object("MyWindow")
    def change_application_settings(self, *args, **kwds):
        '''
        get dialogue states
        '''
        pass
    def reset_dialogue_settings(self, *args, **kwds):
        '''
        set dialogue states
        '''
        pass

worker = Worker()

class Handler:
    def on_mywindow_delete_event(self, *args, **kwds):
        Gtk.main_quit()

    def on_show_dialogue_button_clicked(self, *args, **kwds):
        retval = worker.dia.run()
        worker.dia.hide()
        if retval in [Gtk.ResponseType.OK,
                      Gtk.ResponseType.APPLY, 
                      Gtk.ResponseType.ACCEPT]:
            worker.change_application_settings()
        else:
            worker.reset_dialogue_settings()

builder.connect_signals(Handler())
worker.win.show_all()
Gtk.main()  

Я не проверял это, но это о том, как это должно выглядеть.

0
ответ дан 2 August 2012 в 02:08

Я нашел этот стековый поток после , который приводит к документации о функции запуска GtkDialog, в которой говорится:

Выполнение ( ) метод блокирует рекурсивный основной цикл до тех пор, пока диалоговое окно либо не выдаст сигнал «ответа», либо не будет уничтожено. Если диалог разрушен, метод run () возвращает gtk.RESPONSE_NONE; в противном случае он возвращает идентификатор ответа из «ответного» сигнала. Перед входом в рекурсивный основной цикл метод run () вызывает для вас gtk.Widget.show () в этом диалоговом окне. Обратите внимание, что вам все равно нужно показывать дочерние элементы диалога самостоятельно.

Во время метода run () поведение по умолчанию «delete_event» отключено; если диалоговое окно получает «delete_event», оно не будет уничтожено, как это обычно бывает с окнами, и метод run () вернет gtk.RESPONSE_DELETE_EVENT. Кроме того, во время выполнения метода run () диалог будет модальным. Вы можете принудительно вернуть метод run () в любое время, вызвав response () для выдачи сигнала «response». Уничтожение диалога во время метода run () - очень плохая идея, потому что ваш код после запуска не будет знать, был ли диалог уничтожен или нет.

После того, как метод run () вернется, вы отвечаете за сокрытие или уничтожение диалога по мере необходимости.

А также из руководства PyGTK 3 :

Наконец, есть два способа удалить диалог. Метод Gtk.Widget.hide () удаляет диалог из вида, но сохраняет его в памяти. Это полезно, чтобы избежать необходимости повторного создания диалога, если к нему нужно будет обратиться позже. Кроме того, метод Gtk.Widget.destroy () можно использовать для удаления диалога из памяти, когда он больше не нужен. Следует отметить, что если к диалоговому окну необходимо получить доступ после его уничтожения, его нужно будет создать заново, иначе диалоговое окно будет пустым.

Поэтому, следуя этим битам информации, если вы вызовете функцию скрытия диалога до того, как он получит событие удаления, он не будет уничтожен, и вы можете продолжать вызывать команду run, чтобы сосредоточить диалог. .

, например,

def on_mnu_test_dialog_activate(self, widget, data=None):
    result = self.TestDialog.run()
    if result == Gtk.ResponseType.OK:
        print "The OK button was clicked"
    self.TestDialog.hide()

Кроме того, просто чтобы ответить на ваш второй вопрос.

В моем примере я импортировал класс для диалога:

from dialog_show.TestDialog import TestDialog

Затем в функции finish_initializing я создал переменную экземпляра для диалога:

self.TestDialog = TestDialog()

Я могу затем получите доступ к таким свойствам:

self.TestDialog.ui.txt_entry1.get_text()

или, как предполагает Джон,

self.TestDialog.builder.get_object("txt_entry1").get_text()
0
ответ дан 2 August 2012 в 02:08

Проект, над которым я работаю, определяет имя файла пользовательского интерфейса и каждый раз перестраивает диалоговое окно. Он показывает это и заканчивает, вызывая gtk.main ().

Различные элементы управления имеют названия в glade-gtk2, а glade-gtk2 также используется для определения кнопок отмены и ОК. Обработчики названы на поляне для сигналов при нажатии этих кнопок.

В кодовых именах также подключены различные элементы управления. Например:

self.use_vertical_layout = builder.get_object('vertical_layout')

Код определяет определения для обработчиков, и эти обработчики связаны с builder.connect_signals до отображения диалогового окна.

Когда вызывается обработчик для ok, он может проверять значения различных элементов управления флажками. В приведенном выше случае self.use_vertical_layout представляет значение флажка, когда выбрано ОК.

Пожалуйста, имейте в виду, что pygtk - это способ выполнения задач gtk-2, и текущие версии вместо этого быстро используют gtk3 и introspection (но используя очень похожий подход).

0
ответ дан 2 August 2012 в 02:08

Другие вопросы по тегам:

Похожие вопросы: