我使用Python 2.7和Gtk3,每次启动Gtk.Dialog时都会收到警告:
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
我读到这是因为对话框需要父窗口 - 直到我用 Gtk.DialogFlags.MODAL 调用它。
但是怎么样?
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class Question():
def __init__(self):
self.message_dialog = Gtk.Dialog(
"Dialog Title",
None,
Gtk.DialogFlags.MODAL,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK)
)
self.message_dialog.set_modal(1)
response = self.message_dialog.run()
self.message_dialog.destroy()
if __name__ == "__main__":
q = Question()
为什么不将父设置为Gtk.Window(),以便它在没有警告的情况下运行?
#!/usr/bin/env python
#-*- coding: utf-8 -*-
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
class Question():
def __init__(self):
self.message_dialog = Gtk.Dialog(
"Dialog Title",
Gtk.Window(),
None,
(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
Gtk.STOCK_OK, Gtk.ResponseType.OK)
)
response = self.message_dialog.run()
self.message_dialog.destroy()
if __name__ == "__main__":
q = Question()
答案 0 :(得分:2)
你所看到的只是一个警告。对话框的主要目标是引用现有的UI窗口,但是,您可以创建一个没有父级的对话框,如API reference所示,不推荐但可能:
...和临时父母的父母(或者没有任何人......
优点是,如果你设置它然后你可以设置它是否是模态(之后也可以这样做)。具有模态含义:
一个“模态”对话框(即冻结其余部分的对话框) 来自用户输入的应用程序),可以通过调用创建 对话框中的gtk_window_set_modal()...
如果对话框不是模态的,那么您可以与父级进行交互,由于最终的不一致,这有时不是一件好事。
结论:如果你真的需要它,那么继续,它只是一个警告,并且不介意用Gtk.Window隐藏它或者使它静音。
编辑(到theGtkNerd评论):
消息确实是一个警告,而不是编译警告或错误,而是一个运行时消息。为了测试它,我做了一个简单的c程序,用Gtk +版本2和3编译它。结果是:
[...]$ gcc -o dialog dialog.c `pkg-config --cflags --libs gtk+-2.0`
[...]$ ./dialog
[...]$ gcc -o dialog dialog.c `pkg-config --cflags --libs gtk+-3.0`
[...]$ ./dialog
Gtk-Message: GtkDialog mapped without a transient parent. This is discouraged.
此消息是在Gtk + 3中引入的,不确定哪个次要版本号。
另外,文档非常精确。让我们检查继承自GtkDialog的GtkMessageDialog:
parent transient parent, or NULL for none. [allow-none]
这就是说,正如我和theGtkNerd所指出的那样,不建议在没有父母的情况下使用GtkDialog有几个原因,但结论是,如果你真的需要它,那么继续但是请注意风险。