Когда 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()
Как видите, sub_window частично отображается за пределами экрана. Если вы закомментируете строку w.set_position(gtk.WIN_POS_CENTER_ON_PARENT), вы увидите, что оконный менеджер Windows просто помещает подокно в самый верхний левый угол рабочего стола. Не очень полезно!
Есть ли способ получить желаемое поведение, не прибегая к ручному управлению позиционированием окна, проверяя, в каком месте заканчивается окно, а затем перемещая окно в полностью заэкранное положение?
ОБНОВЛЕНИЕ: я подал отчет об ошибке для pyGTK 23 февраля 2011 г.: http://bugzilla.gnome.org/show_bug.cgi?id=643138
Ответов от разработчиков и других пользователей пока не поступало. Если у вас возникла эта проблема, сообщите об ошибке, чтобы она была исправлена (или чтобы мы могли найти обходной путь).