pygtk: как заставить диалоги сообщений отображаться в центре экрана?

У меня есть графический интерфейс Glade, и я использую виджеты dome gtk.MessageDialog, созданные с помощью pygtk для взаимодействия с пользователем. Моя проблема в том, что всякий раз, когда я вывожу диалоговое сообщение на экран, они появляются повсюду. Один может появиться в верхнем правом углу, следующий в нижнем левом, верхнем левом, среднем левом и т. д.

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


person M0E-lnx    schedule 24.12.2009    source источник


Ответы (3)


Не бери в голову. Решение найдено.

Для тех, кто может бродить по тому же вопросу, решение этой проблемы заключается в указании родительского значения для конструкции gtk.MessageDialog. Если вы используете графический интерфейс поляны в своем классе, и ваш 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
person M0E-lnx    schedule 24.12.2009

Ознакомьтесь со справочными материалами в Справочном руководстве по PyGTK 2.0.

У меня не было возможности попробовать это, но MessageDialog, похоже, получен из 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 
person Jesse Vogt    schedule 24.12.2009
comment
Да... Я думаю, вы можете сделать это с помощью настроек позиционирования, но я обнаружил, что по умолчанию они равны gtk.WIN_POS_CENTER_ON_PARENT. Так что все, что ему действительно нужно, это родительское значение, и оно всегда будет отображаться в центре родительского элемента. Спасибо за советы - person M0E-lnx; 24.12.2009

Ни одно из предоставленных решений не будет работать, если ваше родительское окно еще не показано, то есть если диалоговое окно сообщений должно отображаться во время создания экземпляра класса (ваш класс, а не «родительский» класс окна). За это время 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...
person ilias iliadis    schedule 29.10.2019