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

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

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

id = dialog.show()

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

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

3 ответа

Решение

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

Метод run() блокирует рекурсивный основной цикл до тех пор, пока диалоговое окно не выдаст ответный сигнал или не будет уничтожено. Если диалог разрушен, метод 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()

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

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

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

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

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

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

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

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()  

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

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