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

4 投票
3 回答
3377 浏览
提问于 2025-04-15 17:20

我有一个用glade做的图形界面,正在使用pygtk创建的gtk.MessageDialog小部件来和用户互动。我的问题是,每当我在屏幕上弹出一个对话框时,它们的位置总是乱七八糟的。有的会出现在右上角,有的在左下角,还有的在左上角或者中间左边等等……

有没有办法让这些对话框总是出现在屏幕的中心,或者在它们的父窗口的位置呢?

3 个回答

0

如果你的父窗口还没有显示出来,那么提供的解决方案都无法奏效。也就是说,如果你是在创建一个类的时候想要显示消息对话框(是你自己的类,而不是“父”窗口的类),在这个时候,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...
2

可以查看这个参考资料:PyGTK 2.0 参考手册

我还没试过这个,不过 MessageDialog 似乎是从 Window 这个类派生出来的,而 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 
5

没关系,我找到解决办法了。

对于其他可能遇到同样问题的人,这个问题的解决办法在于给gtk.MessageDialog构造函数指定一个父级值。如果你在使用glade图形界面,并且你的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

撰写回答