Pygtk 对话框并返回 id/info

Pygtk 对话框并返回 id/info

我正在使用 quick-pygtk-glade 编写一个应用程序,我想显示一个对话框并获取返回 id...我使用了 run() 方法,但如果关闭对话框并重新打开它,我会得到一个空窗口和一些错误!我使用 destroy() 来关闭它。

然后我尝试使用 show() 方法,但我可以通过使用获取返回值

id = dialog.show()

我如何获取返回 ID?

另外,如何从主代码中获取对话框中某些条目的文本?

答案1

我发现这个stackoverflow邮政,这导致了文档在 GtkDialog 的运行函数中,它指出:

run() 方法在递归主循环中阻塞,直到对话框发出“响应”信号或被销毁。如果对话框被销毁,run() 方法将返回 gtk.RESPONSE_NONE;否则,它将返回“响应”信号发射的响应 ID。在进入递归主循环之前,run() 方法会为您调用对话框上的 gtk.Widget.show()。请注意,您仍需要自己显示对话框的任何子项。

在 run() 方法期间,默认的“delete_event”行为被禁用;如果对话框收到“delete_event”,它将不会像通常的窗口那样被销毁,并且 run() 方法将返回 gtk.RESPONSE_DELETE_EVENT。此外,在 run() 方法期间,对话框将是模态的。您可以通过调用 response() 发出“response”信号来强制 run() 方法随时返回。在 run() 方法期间销毁对话框是一个非常糟糕的主意,因为您的运行后代码将不知道对话框是否被销毁。

run() 方法返回后,您负责根据需要隐藏或销毁对话框。

还有来自 PyGTK 3教程

最后,有两种方法可以删除对话框。Gtk.Widget.hide() 方法会将对话框从视图中删除,但会将其存储在内存中。这很有用,可以避免以后需要访问对话框时不得不再次构造对话框。或者,一旦不再需要对话框,可以使用 Gtk.Widget.destroy() 方法从内存中删除对话框。需要注意的是,如果对话框在被销毁后需要访问,则需要再次构造对话框,否则对话框窗口将为空。

因此,根据这些信息,如果在对话框接收到删除事件之前调用其隐藏函数,它将不会被销毁,并且您可以继续调用运行,以使对话框成为焦点。

例如

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

答案2

我从事的项目每次都会找出 ui 文件名并重建对话框。它会显示它并通过调用 gtk.main() 来完成。

glade-gtk2 中为各种控件指定了名称,glade-gtk2 还用于定义取消和确定按钮。glade 中为按下这些按钮时的信号指定了处理程序的名称。

在代码名称中还与各种控件相关联。例如:

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

代码定义了处理程序的定义,这些处理程序在显示对话框之前与 builder.connect_signals 连接。

当调用 ok 的处理程序时,它可以检查各种复选框控件的值。在上述情况下,self.use_vertical_layout 表示选择 OK 时复选框的值。

请记住 pygtk 是 gtk-2 的做事方式,当前版本快速使用 gtk3 和自省(但使用非常相似的方法)。

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

我没有测试过它,但它看起来应该是什么样的。

相关内容