我正在使用 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()
我没有测试过它,但它看起来应该是什么样的。