Как мне получить размер окна Pygtk? - PullRequest
3 голосов
/ 01 ноября 2011

Я пытаюсь использовать gtk.window.get_size (), но он всегда просто возвращает ширину и высоту по умолчанию. В документации написано

Метод get_size () возвращает кортеж, содержащий текущую ширину и высоту окна.Если окно не отображается на экране, оно возвращает размер, который PyGTK предложит диспетчеру окон для начального размера окна.Размер, полученный методом get_size (), является последним размером, полученным в событии конфигурации, то есть PyGTK использует свой локально сохраненный размер, а не запрашивает размер у X-сервера.В результате, если вы вызываете метод resize (), а затем немедленно вызываете метод get_size (), размер еще не вступит в силу.После того, как оконный менеджер обработает запрос на изменение размера, PyGTK получает уведомление о том, что размер изменился с помощью события конфигурации, и размер окна обновляется.

Я попытался изменить размер окна вручную и ждуминуту или около того, но я все еще получаю ширину и высоту по умолчанию.

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

Вот фрагмент кода, который у меня есть для моего основного выхода.

def on_main_window_destroy(self, widget, data=None):
    if self.view.current_view.layout == 'list':
        self.view.current_view.set_column_order()

    width = self.main_window.get_size()[0]
    height = self.main_window.get_size()[1]
    #test statement
    print (width, height)

    self.prefs.set_size_prefs(width, height)
    self.prefs.set_view_prefs(self.view.current_view.media, self.view.current_view.layout)
    gtk.main_quit()

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

Ответы [ 2 ]

6 голосов
/ 02 ноября 2011

Кажется, это решает вашу проблему:

import gtk

def print_size(widget, data=None):
    print window.get_size()

def delete_event(widget, data=None):
    print window.get_size()
    return False

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

window = gtk.Window()
window.connect('delete_event', delete_event)
window.connect('destroy', destroy)

button = gtk.Button(label='Print size')
button.connect('clicked', print_size)
window.add(button)

window.show_all()

gtk.main()

Я думаю, что ключ вызывает get_size по сигналу delete_event, а не по сигналу destroy.Если вы делаете это по сигналу destroy, это как вы описали, он просто возвращает размер по умолчанию.

0 голосов
/ 01 ноября 2011

Попробуйте запустить:

while gtk.events_pending():
    gtk.main_iteration_do(False)

прямо перед звонком window.get_size()

...