Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 设置时,自定义Gtk pixbuf光标闪烁_Python_Graphics_Gtk_Gtk3_Xorg - Fatal编程技术网

Python 设置时,自定义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

我有一个奇怪的经历,从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

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用户,但不适用于我。