【问题标题】:How do I get the size of a pygtk window?如何获得 pygtk 窗口的大小?
【发布时间】:2011-10-31 23:24:05
【问题描述】:

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

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()

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

【问题讨论】:

  • 它应该适用于gtk.window.get_size()。也许您应该发布代码 sn-ps 以保存和恢复窗口大小。我在我的项目中实现了这个功能,也许你应该看看to this
  • @LoïcGRENON 我现在看到get_size 正在工作,只是不在我所说的地方。在您链接的代码中,您将 quit 函数用于销毁信号。当我这样做时,get_size 永远不会返回新值。但是如果我在代码中的其他地方调用get_size,它确实有效。

标签: python gtk window pygtk


【解决方案1】:

这似乎解决了你的问题:

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 信号而不是destroy 信号上调用get_size。如果您对destroy 信号执行此操作,就像您描述的那样,它只是返回默认大小。

【讨论】:

  • 啊,好吧。我回家后会试试这个。 delete_event 信号是什么?我在 pygtk 文档中找不到它。
  • 据我了解(即可能有一个技术上更正确的定义),delete_event 是在destroy 之前调用的,特别是给你最后一次机会,通过返回 True 和从而阻止destroy。当用户在尝试退出程序时打开修改过的文档时,我过去曾使用它来启动“保存/不保存/取消”对话框。
【解决方案2】:

尝试运行:

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

就在致电window.get_size()之前

【讨论】:

  • 这看起来可能有效。我今天回家试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多