如何在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已经帮我们把这种指针参数转换成了函数的返回值,不用手动传指针,这就是你之前报错的原因。
正确调用步骤
- 先获取
FrameClock对象:从任意GTK控件调用get_frame_clock()就行,但要确保控件已经被显示(比如调用过show_all()),否则可能返回None。 - 调用
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
相关产品推荐
相关产品推荐

