如何获取pygtk窗口的大小?

3 投票
2 回答
6747 浏览
提问于 2025-04-17 05:23

我在尝试使用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 个回答

0

试着在调用 window.get_size() 之前运行:

while gtk.events_pending():
    gtk.main_iteration_do(False)
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()

我觉得关键在于在delete_event信号上调用get_size,而不是在destroy信号上。如果你在destroy信号上调用,就像你说的那样,它只会返回默认的大小。

撰写回答