Python 设置时,自定义Gtk pixbuf光标闪烁
我有一个奇怪的经历,从Gtk将自定义鼠标光标设置为pixbuf。下面的示例代码——这段代码做了它应该做的事情(单击按钮时设置光标),但是光标在设置时闪烁,就好像它被快速关闭和打开一样Python 设置时,自定义Gtk pixbuf光标闪烁,python,graphics,gtk,gtk3,xorg,Python,Graphics,Gtk,Gtk3,Xorg,我有一个奇怪的经历,从Gtk将自定义鼠标光标设置为pixbuf。下面的示例代码——这段代码做了它应该做的事情(单击按钮时设置光标),但是光标在设置时闪烁,就好像它被快速关闭和打开一样 #!/usr/bin/env python "Grab the window cursor and set it to be a pixmap. This flickers; why?" from gi.repository import Gtk, Gdk, GdkPixbuf, GLib import cairo
#!/usr/bin/env python
"Grab the window cursor and set it to be a pixmap. This flickers; why?"
from gi.repository import Gtk, Gdk, GdkPixbuf, GLib
import cairo
def grab(button, window):
display = window.get_screen().get_display()
pointer = display.get_device_manager().get_client_pointer()
# Create a simple filled 100x100 rectangle as the cursor pixbuf
pb = GdkPixbuf.Pixbuf.new(GdkPixbuf.Colorspace.RGB, False, 8, 100, 100)
surface = Gdk.cairo_surface_create_from_pixbuf(pb, 0, None)
context = cairo.Context(surface)
context.set_source_rgba(1, 0.5, 0.5, 1)
context.rectangle(0, 0, 100, 100)
context.fill()
pbdrawn = Gdk.pixbuf_get_from_surface(surface, 0, 0, surface.get_width(), surface.get_height())
# Create the cursor, and grab the mouse and set that cursor
cursor = Gdk.Cursor.new_from_pixbuf(display, pbdrawn, 100, 100)
pointer.grab(
window.get_window(),
Gdk.GrabOwnership.NONE,
True,
Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.SCROLL_MASK,
cursor,
Gdk.CURRENT_TIME)
# After five seconds, quit
GLib.timeout_add(5000, ungrab, pointer)
def ungrab(pointer):
pointer.ungrab(Gdk.CURRENT_TIME)
w = Gtk.Window()
btn = Gtk.Button("Change cursor")
btn.connect("clicked", grab, w)
b = Gtk.Box()
b.pack_start(btn, True, True, 50)
w.add(b)
w.show_all()
w.connect("destroy", Gtk.main_quit)
Gtk.main()
您不能使用
set\u cursor()
为窗口设置光标吗?我以前从未做过游标工作,所以我在这方面没有经验。另外,您的超时\u add()
可能会导致一些问题。在GTK程序中正确地安排事件需要仔细的计划。@oldtechaa我正在做指针抓取,以便在这段代码运行时光标始终设置为该值。如果我只做了window.set\u cursor()
,那么它只会为我的窗口设置它。更新:已经请其他人对此进行了测试,对于某些人来说它似乎不会闪烁。因此,这可能是一个图形驱动程序问题,而不是Gtk问题。我在某个地方读到,Intel和nVidia往往比Radeons for Xlib绘图(Cairo的默认后端)更快。你不会碰巧有AMD图形吧?我没有;我有情报。它适用于不同的Intel用户和AMD用户,但不适用于我。您不能使用set\u cursor()
为窗口设置光标吗?我以前从未做过游标工作,所以我在这方面没有经验。另外,您的超时\u add()
可能会导致一些问题。在GTK程序中正确地安排事件需要仔细的计划。@oldtechaa我正在做指针抓取,以便在这段代码运行时光标始终设置为该值。如果我只做了window.set\u cursor()
,那么它只会为我的窗口设置它。更新:已经请其他人对此进行了测试,对于某些人来说它似乎不会闪烁。因此,这可能是一个图形驱动程序问题,而不是Gtk问题。我在某个地方读到,Intel和nVidia往往比Radeons for Xlib绘图(Cairo的默认后端)更快。你不会碰巧有AMD图形吧?我没有;我有情报。它适用于不同的英特尔用户和AMD用户,但不适用于我。