对于PyGTK/win32,如何将新窗口放在其父窗口附近而不是屏幕外?

2024-03-29 11:38:08 发布

您现在位置:Python中文网/ 问答频道 /正文

PyGTK运行于Windows的情况下,我希望在父窗口附近弹出一个新窗口,但永远不要离开屏幕。在

我在Windows7和WindowsXP中都观察到了我想要的微软写字板行为。如果您使窗口非常小并将其移动到桌面的右下角,右键单击文本字段,然后打开段落菜单,对话框将弹出,完全可见。即使“写字板”窗口部分不在屏幕上,也会发生这种情况。子对话框不会在相对于主窗口的固定位置弹出。它只是突然出现,完全可见。在

我的应用程序由一个主屏幕组成,这个主屏幕会生成子窗口,这些子窗口将阻止应用程序的其余部分,直到用户使用完它们为止。用户可能需要依次打开和关闭许多子窗口,因此我希望它们出现在单击按钮的位置附近,这样用户就不必在屏幕上到处移动鼠标。在

我试着用gtk.WIN_POS_鼠标,但当主菜单靠近屏幕边缘时,生成的子窗口通常会部分离开屏幕。在

我希望在子窗口上调用set_transient_for(main_menu)会通知Windows我希望我的窗口靠近其父窗口。然而,Windows只是把它放在桌面的左上角——甚至不一定和主菜单在同一个屏幕上。在

下面的代码将通过在屏幕左下角弹出一个窗口来演示该问题,该窗口包含一个按钮,该按钮在单击时生成一个子窗口:

import gtk

class MyWindow(gtk.Window):
    def __init__(self):
        gtk.Window.__init__(self)
        self.connect("delete-event",self.on_delete_event)
        button = gtk.Button("Open Subwindow")
        button.connect("clicked",self.open_sub_window)
        self.add(button)
        self.set_gravity(gtk.gdk.GRAVITY_SOUTH_EAST)
        self.show_all()
        width, height = self.get_size()
        self.move(gtk.gdk.screen_width() - width, gtk.gdk.screen_height() - height)

    def on_delete_event(self, widget=None, data=None):
        gtk.main_quit()

    def open_sub_window(self, widget=None, data=None):
        w = gtk.Window()
        w.set_size_request(200,200)
        w.set_transient_for(self)
        w.set_position(gtk.WIN_POS_CENTER_ON_PARENT)
        w.show()

if __name__=="__main__":
    MyWindow()
    gtk.main()

如您所见,子窗口部分显示在屏幕外。 如果你把这行注释掉(gtk.WIN_POS_中心_ON_家长)您将看到Windows窗口管理器只是将子窗口放在桌面的左上角。不是很有用!在

有没有一种方法可以在不借助于手动管理窗口定位的情况下,通过检查窗口结束在什么位置,然后将窗口移动到完全不在屏幕上的位置,从而获得所需的行为?在

更新: 我在2011年2月23日为pyGTK提交了一个bug报告:http://bugzilla.gnome.org/show_bug.cgi?id=643138

开发人员或其他用户尚未对此做出任何回应。如果你有这个问题,请插嘴的错误,使它得到修复(或这样我们可能会得到一个解决办法)。在


Tags: 用户posselfnonegtk屏幕mainwindows