如何获得pygtk窗口的大小?

时间:2011-10-31 23:24:06

标签: python gtk window pygtk

我正在尝试使用gtk.window.get_size(),但它总是只返回默认的宽度和高度。 The documentation says

  

get_size()方法返回一个包含当前宽度和的元组   窗户的高度。如果窗口不在屏幕上,则返回   大小PyGTK会向窗口管理器建议初始窗口   尺寸。 get_size()方法获得的大小是最后一个大小   在配置事件中收到,即PyGTK使用其本地存储   大小,而不是查询X服务器的大小。结果,如果   你调用resize()方法然后立即调用get_size()   方法,尺寸还没有生效。窗口管理器之后   处理resize请求,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()

我想我明白现在发生了什么。这是在destroy信号内部,因此在调用代码时,窗口已经消失。是否有更规范的方法来处理窗口大小调整?我希望每次用户调整窗口大小时都避免处理调整大小事件。

2 个答案:

答案 0 :(得分:6)

这似乎可以解决您的问题:

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信号上进行,就像你描述的那样,它只返回默认大小。

答案 1 :(得分:0)

尝试跑步:

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

在致电window.get_size()

之前