pygtk:如何强制消息对话框在屏幕中央显示?
我有一个用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