С PyGTK / win32, как мне разместить новое окно рядом с его родителем, но не за пределами экрана? - PullRequest
2 голосов
/ 28 августа 2010

С PyGTK , работающим на Windows , я хочу, чтобы новое окно всплыло рядом с родительским окном, но не за кадром.

Я наблюдал поведение, которое я хочу в Microsoft Wordpad в обоих Windows 7 и Windows XP .Если вы сделаете окно очень маленьким и переместите его в нижний правый угол рабочего стола, щелкните правой кнопкой мыши в текстовом поле и откройте меню Абзац , диалоговое окно появится полностью видимым.Это происходит, даже если окно Wordpad частично находится за пределами экрана.Дочернее диалоговое окно не появляется в фиксированной позиции относительно основного окна.Он просто появляется близко и полностью виден.

Мое приложение состоит из главного экрана, который порождает дочерние окна, которые блокируют остальную часть приложения до тех пор, пока пользователь не закончит их использовать.Пользователю может потребоваться последовательно открывать и закрывать многие дочерние окна, поэтому я хочу, чтобы они появлялись рядом с местом, где они нажимают кнопку, чтобы пользователю не приходилось перемещать мышь по всему экрану.

Я пытался использовать gtk.WIN_POS_MOUSE , но когда главное меню находится у края экрана;порождаемое дочернее окно часто оказывается частично за кадром.

Я ожидаю, что вызов 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()

Как вы можете видеть, подокно отображается частично вне экрана.Если вы закомментируете строку w.set_position (gtk.WIN_POS_CENTER_ON_PARENT) , вы увидите, что оконный менеджер Windows просто размещает подокно в самом верхнем левом углу рабочего стола.Не очень полезно!

Есть ли способ получить желаемое поведение, не прибегая к ручному управлению позиционированием окна, проверяя, в каком месте находится окно, а затем перемещая окно в полностью неэкранное положение?

ОБНОВЛЕНИЕ: Я отправил отчет об ошибке для pyGTK 23 февраля 2011 года: http://bugzilla.gnome.org/show_bug.cgi?id=643138

Он еще не получил никаких ответов от разработчиков или других пользователей.Если у вас возникла эта проблема, пожалуйста, сообщите об ошибке, чтобы она была исправлена ​​(или чтобы мы могли обойти ее).

1 Ответ

0 голосов
/ 29 сентября 2011

В моей системе Windows 7 всплывающее окно появляется в центре главного окна.У меня один вопрос: почему вы используете окно вместо диалога?

...