运行Python Gtk3对话框或消息对话框,没有临时父警告

时间:2017-06-06 14:16:48

标签: python modal-dialog gtk3

我使用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()

1 个答案:

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

enter image description here

  

parent transient parent, or NULL for none. [allow-none]

这就是说,正如我和theGtkNerd所指出的那样,不建议在没有父母的情况下使用GtkDialog有几个原因,但结论是,如果你真的需要它,那么继续但是请注意风险。