Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.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 通过gobject.timeout\u add回调函数使用cairo绘制点_Python_Gtk_Cairo_Gobject - Fatal编程技术网

Python 通过gobject.timeout\u add回调函数使用cairo绘制点

Python 通过gobject.timeout\u add回调函数使用cairo绘制点,python,gtk,cairo,gobject,Python,Gtk,Cairo,Gobject,我有一段几乎可以工作的代码(我希望如此)。在该类的更新方法中,应在窗口宽度和高度限定的位置绘制随机黑点-问题是没有绘制点。显示一个gtk窗口,其中包含加载了cairo ImageSurface.create_from_png(BG_IMG))的背景图像,我还验证了是否调用了更新函数(使用gobject.timeout_add回调函数每隔17ms调用一次)。我已经在这里和其他地方搜索过了,但我不太明白这段代码有什么问题 class Screen(gtk.DrawingArea): __g

我有一段几乎可以工作的代码(我希望如此)。在该类的更新方法中,应在窗口宽度和高度限定的位置绘制随机黑点-问题是没有绘制点。显示一个gtk窗口,其中包含加载了cairo ImageSurface.create_from_png(BG_IMG))的背景图像,我还验证了是否调用了更新函数(使用gobject.timeout_add回调函数每隔17ms调用一次)。我已经在这里和其他地方搜索过了,但我不太明白这段代码有什么问题

class Screen(gtk.DrawingArea):

    __gsignals__ = {"expose-event": "override"}

    def do_expose_event(self, event):
        self.cr = self.window.cairo_create()

        self.cr.rectangle(event.area.x, event.area.y, event.area.width, event.area.height)
        self.cr.clip()
        self.draw(*self.window.get_size())

    def draw(self, width, height):
        x = y = 0
        self.bg = c.ImageSurface.create_from_png(BG_IMG)
        self.cr.set_source_surface(self.bg, x, y)
        self.cr.paint()

    def update(self):
        x = randint(0, DOCK_W)
        y = randint(0, DOCK_H)
        self.cr.rectangle(x, y, 1, 1)
        self.cr.set_source_rgba(0, 0, 0, 1)
        self.cr.fill()
        self.cr.paint()
有人对这段代码失败的原因有一些见解吗?非常感谢

解决了的
我不知道每个绘图操作都可以使用新的cairo上下文。这是主要的问题。

一般来说,您不应该在曝光事件之外直接绘制窗口。不要保留cairo上下文供以后使用:为每个事件运行创建一个

当您想要绘制点时,只需执行以下操作:
widget.queue\u draw()
,一个新的公开事件将尽快发送给您。但是请注意,在曝光事件中,您必须绘制所有点,而不仅仅是新点

您的代码类型有一个有用的优化:从计时器中,不要调用
queue\u draw
,因为它效率相当低。相反,只要画出新的点。但是,这并不意味着您可以在“do_expose_”事件中绘制所有点,因为暴露事件随时都可能发生,您不希望丢失已绘制的点

要进行单点绘制,您必须创建一个新的cairo上下文,但不需要保存它:

def update(self):
    cr = self.window.cairo_create()
    x = randint(0, DOCK_W)
    y = randint(0, DOCK_H)
    self.points.append((x,y)) #for the expose event ;-)
    cr.rectangle(x, y, 1, 1)
    cr.set_source_rgba(0, 0, 0, 1)
    cr.fill()
    cr.paint()

另一种常见的优化方法,尤其是当你有很多点的时候,是将绘制的图像保存在位图中,因此当曝光事件发生时,你只需简单地对位图进行blit,而不是沿着点列表进行迭代。

一般来说,你不应该在曝光事件之外直接绘制到窗口。不要保留cairo上下文供以后使用:为每个事件运行创建一个

当您想要绘制点时,只需执行以下操作:
widget.queue\u draw()
,一个新的公开事件将尽快发送给您。但是请注意,在曝光事件中,您必须绘制所有点,而不仅仅是新点

您的代码类型有一个有用的优化:从计时器中,不要调用
queue\u draw
,因为它效率相当低。相反,只要画出新的点。但是,这并不意味着您可以在“do_expose_”事件中绘制所有点,因为暴露事件随时都可能发生,您不希望丢失已绘制的点

要进行单点绘制,您必须创建一个新的cairo上下文,但不需要保存它:

def update(self):
    cr = self.window.cairo_create()
    x = randint(0, DOCK_W)
    y = randint(0, DOCK_H)
    self.points.append((x,y)) #for the expose event ;-)
    cr.rectangle(x, y, 1, 1)
    cr.set_source_rgba(0, 0, 0, 1)
    cr.fill()
    cr.paint()

另一种常见的优化方法,尤其是当你有很多点时,是将绘制的图像保留在位图中,因此当曝光事件发生时,你只需对位图进行blit,而不是沿着点列表进行迭代。

你的提示实际上画了一些黑色的东西!现在我必须弄清楚为什么矩形不是一个像素而是一个巨大的区域(至少它看起来是这样的)。但我相信我会自己解决这个问题。谢谢!我会记住闪电战的事。我会投票给你,但显然我还没有足够的声誉-p@trsk字体也许你不能投票,但你当然可以——也应该——接受答案。你的建议实际上被黑了!现在我必须弄清楚为什么矩形不是一个像素而是一个巨大的区域(至少它看起来是这样的)。但我相信我会自己解决这个问题。谢谢!我会记住闪电战的事。我会投票给你,但显然我还没有足够的声誉-p@trsk字体也许你不能投票,但你当然可以——也应该——接受答案。