С 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
Он еще не получил никаких ответов от разработчиков или других пользователей.Если у вас возникла эта проблема, пожалуйста, сообщите об ошибке, чтобы она была исправлена (или чтобы мы могли обойти ее).