You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中调用gdk_frame_clock_get_refresh_info函数?

在Python 3+GTK3中调用gdk_frame_clock_get_refresh_info()的正确姿势

我之前也碰到过这个问题,主要是因为GTK的C API和Python绑定(PyGObject)对输出参数的处理方式不一样,别慌,我给你捋清楚怎么弄:

首先得明白,C版本的gdk_frame_clock_get_refresh_info()里最后两个gint64*是输出指针,用来返回刷新时间和间隔的;但PyGObject已经帮我们把这种指针参数转换成了函数的返回值,不用手动传指针,这就是你之前报错的原因。

正确调用步骤

  1. 先获取FrameClock对象:从任意GTK控件调用get_frame_clock()就行,但要确保控件已经被显示(比如调用过show_all()),否则可能返回None。
  2. 调用get_refresh_info()时,只需要传入当前的单调时间(用GLib.get_monotonic_time()获取),函数会直接返回两个值:下一次刷新的时间,以及刷新间隔(单位都是微秒)。

代码示例

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib

class DemoWindow(Gtk.Window):
    def __init__(self):
        super().__init__(title="Frame Clock Refresh Info")
        self.connect("draw", self.handle_draw)
        self.set_default_size(300, 200)

    def handle_draw(self, widget, cr):
        frame_clock = widget.get_frame_clock()
        if not frame_clock:
            print("还没获取到FrameClock,请确保控件已显示")
            return False
        
        # 获取当前单调时间
        current_time = GLib.get_monotonic_time()
        # 调用get_refresh_info,直接接收返回的两个值
        next_refresh_time, refresh_interval = frame_clock.get_refresh_info(current_time)
        
        print(f"下一次刷新时间(微秒):{next_refresh_time}")
        print(f"刷新间隔(微秒):{refresh_interval},对应帧率:{1000000/refresh_interval:.2f} FPS")
        return False

if __name__ == "__main__":
    win = DemoWindow()
    win.connect("destroy", Gtk.main_quit)
    win.show_all()
    Gtk.main()

关键细节说明

  • 单调时间是系统启动以来的累计时间,不会受系统时间调整影响,是GTK帧时钟使用的标准时间格式。
  • 如果你的场景是在动画回调里(比如gtk_widget_add_tick_callback),回调函数本身会传入frame_clock和当前时间,直接用就行,不用额外调用get_frame_clock()。

内容的提问来源于stack exchange,提问作者user4815162342

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 08:47:57