如何不创建窗口即可将pixbuf图片保存到Gtk剪贴板?
问题原因
clipboard.store() 方法只是将写入剪贴板的操作提交到GTK内部事件队列,并不会直接完成系统剪贴板写入,必须运行GTK主循环处理完队列内的相关事件,数据才能真正写入系统剪贴板被其他程序读取。直接调用Gtk.main()会启动无限主循环,所以程序会一直阻塞无法退出。
解决方案
不需要保持主循环持续运行,只需要让主循环处理完剪贴板相关事件后自动退出即可,两种实现方式如下:
方案1:超时自动退出(兼容性更好)
# pixbuf is a pixbuf image import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clipboard.set_image(pixbuf) clipboard.store() # 注册10毫秒超时回调,触发后自动退出主循环 Gtk.timeout_add(10, Gtk.main_quit) # 启动主循环,完成剪贴板写入后会自动退出,无感知延迟 Gtk.main()
方案2:事件队列清空后自动退出(无额外等待)
# pixbuf is a pixbuf image import gi gi.require_version('Gtk', '3.0') from gi.repository import Gtk, Gdk clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD) clipboard.set_image(pixbuf) clipboard.store() # 循环处理所有待处理GTK事件,直到队列清空 while Gtk.events_pending(): Gtk.main_iteration()
两种方案都不需要创建任何窗口,也不会出现程序长时间阻塞的问题。
内容的提问来源于stack exchange,提问作者user1880364
相关产品推荐
相关产品推荐

