pygtk:如何强制消息对话框显示在屏幕中央?

时间:2009-12-24 15:43:23

标签: python pygtk dialog

我有一个glade GUI,我正在使用用pygtk创建的圆顶gtk.MessageDialog小部件进行用户交互。我的问题是每当我在屏幕上抛出一条对话框消息时,它们就会出现在整个地方。一个可能出现在右上角,下一个出现在左下角,左上角,左上角等......

有没有办法强制这些东西显示在屏幕中央或父窗口所在的位置?

3 个答案:

答案 0 :(得分:5)

没关系。找到了解决方案。

对于可能对同一事物感到徘徊的其他人,此问题的解决方案在于为gtk.MessageDialog构造指定父值。 如果你在你的班级使用glade gui,并且你的glade xml被加载到名为'gui'的变量中,它将如下所示:

#!/usr/bin/env/python
par = self.gui.get_widget('your_parent_window')

msg = gtk.MessageDialog(type=gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK, parent=par)
if msg.run():
    msg.destroy()
    return None

答案 1 :(得分:2)

查看PyGTK 2.0 Reference Manual

上的参考资料

我没有机会尝试这个,但MessageDialog似乎是从Window中派生出来的set_position方法。

此方法接受以下之一:

# No influence is made on placement.
gtk.WIN_POS_NONE 

# Windows should be placed in the center of the screen.
gtk.WIN_POS_CENTER 

# Windows should be placed at the current mouse position.
gtk.WIN_POS_MOUSE 

# Keep window centered as it changes size, etc.
gtk.WIN_POS_CENTER_ALWAYS

# Center the window on its transient parent
# (see the gtk.Window.set_transient_for()) method.
gtk.WIN_POS_CENTER_ON_PARENT 

答案 2 :(得分:0)

如果尚未显示您的父窗口,也就是说,如果要在类(您的类,而不是“父”窗口类)的实例化过程中显示messagedialog,则所有提供的解决方案都将无法使用。在此期间,即使messagedialog的代码在显示窗口的代码之后,Gtk仍未放置该窗口。这意味着您的对话框将以某种方式“无父母”,并且消息对话框将出现在任何喜欢的地方……

我对这个问题的幼稚解决方案...

GObject.timeout_add(interval=50, function=self.stupid_dialog_1)

def stupid_dialog_1(self):
    par = self.gui.get_widget('your_parent_window')
    msg = gtk.MessageDialog(type=gtk.MESSAGE_INFO, buttons = gtk.BUTTONS_OK, parent=par)
    # do anything here...
    return False #stop the timer...