Как передать / вернуть данные из диалога Gtk в основной класс приложения - PullRequest
0 голосов
/ 07 января 2019

У меня есть приложение на Python Gtk. У меня есть основной класс приложения в моем главном файле. У меня тогда все мои диалоги находятся в другом файле. Мне нужно иметь возможность передавать / возвращать пользовательские данные из диалогового окна в основной класс приложения, кроме стандартных кодов ответов Gtk, вот несколько базовых примеров кода, поскольку мой собственный код очень длинный:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class DialogWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Dialog Example")

        self.set_border_width(6)

        button = Gtk.Button("Open dialog")
        button.connect("clicked", self.on_button_clicked)

        self.add(button)

    def on_button_clicked(self, widget):
        dialog = DialogExample(self)
        response = dialog.run()

        if response == Gtk.ResponseType.OK:
            print("The OK button was clicked")
        elif response == Gtk.ResponseType.CANCEL:
            print("The Cancel button was clicked")

        dialog.destroy()

win = DialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Диалоговое окно в отдельном файле:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class DialogExample(Gtk.Dialog):

    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OK, Gtk.ResponseType.OK))

        self.set_default_size(150, 100)

        label = Gtk.Label("This is a dialog to display additional information")

        box = self.get_content_area()
        box.add(label)
        self.show_all()

Стандартно мы применяем Gtk.ResponseType к кнопкам. Но что, если мы хотим вернуть некоторые пользовательские данные - не просто код ответа - в качестве дополнительного примера кода:

class DialogExample(Gtk.Dialog):

    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "My Dialog", parent, 0)

        self.set_default_size(150, 100)

        label = Gtk.Label("This is a dialog to display additional information")

        button = Gtk.Button("Return something")
        button.connect("clicked", self.on_button_clicked)

        box = self.get_content_area()
        box.add(label)
        self.show_all()

    def on_button_clicked(self, widget):
        if SOME_CONDITION:
            return <CUSTOM_RESPONSE>
        else:
            return <ALT_CUSTOM_RESPONSE>

Когда я делаю последний пример, диалоговое окно ничего не возвращает, я хотел бы сделать что-то вроде:

class DialogWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Dialog Example")

        self.set_border_width(6)

        button = Gtk.Button("Open dialog")
        button.connect("clicked", self.on_button_clicked)

        self.add(button)

    def on_button_clicked(self, widget):
        dialog = DialogExample(self)
        response = dialog.run()

        if response == <CUSTOM_RESPONSE>:
            #do something with <CUSTOM_RESPONSE>
        elif response == <ALT_CUSTOM_RESPONSE>:
            #do something different with <ALT_CUSTOM_RESPONSE>

        dialog.destroy()

win = DialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Окно DialogExample не разрушается / не закрывается и ничего не возвращается, и приложение в основном просто приостанавливается, так как считает, что больше нет методов для запуска - хотя после возвращения пользовательских данных еще многое предстоит сделать (мне нужно затем начните добавлять записи в базу данных).

[UPDATE]

Сейчас я пробовал так много разных вещей, чтобы решить эту проблему, и я не смог бы перечислить их все здесь. Я бесконечно искал какой-то ответ, и кажется, что это не то, что кто-то делает в Интернете.

1 Ответ

0 голосов
/ 10 января 2019

C-версия gtk_dialog_run ограничена возвращаемыми целыми числами, вы можете устанавливать пользовательские значения, но ничего похожего на строки или объекты. Вы можете обойти это, установив значение в ответном сигнале, а затем получить его после возврата из функции запуска.

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class DialogExample(Gtk.Dialog):

    def __init__(self, parent):
        Gtk.Dialog.__init__(self, "My Dialog", parent, 0,
            (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
             Gtk.STOCK_OK, Gtk.ResponseType.OK))

        self.result = ""
        self.set_default_size(150, 100)
        self.connect("response", self.on_response)

        label = Gtk.Label(label="Type something")
        self.entry = Gtk.Entry()

        box = self.get_content_area()
        box.add(label)
        box.add(self.entry)
        self.show_all()

    def on_response(self, widget, response_id):
        self.result = self.entry.get_text ()

    def get_result(self):
        return self.result

class DialogWindow(Gtk.Window):

    def __init__(self):
        Gtk.Window.__init__(self, title="Dialog Example")
        self.set_border_width(6)

        box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(box)

        button = Gtk.Button(label="Open dialog")
        button.connect("clicked", self.on_button_clicked)
        box.add(button)

        self.label = Gtk.Label()
        box.add(self.label)

    def on_button_clicked(self, widget):
        dialog = DialogExample(self)
        response = dialog.run()

        if response == Gtk.ResponseType.OK:
            self.label.set_text(dialog.get_result())
            print("The OK button was clicked")
        elif response == Gtk.ResponseType.CANCEL:
            print("The Cancel button was clicked")

        dialog.destroy()

win = DialogWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()
...