0

我正在尝试使用 GTK 和 PyGObject 实现自定义小部件。这个自定义小部件应该有一个自定义绘制函数,并且这个函数将使用它接收到的 Cairo 对象来绘制东西。

这是我的代码:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class CustomWidget(Gtk.DrawingArea):
    def __init__(self):
        super().__init__()
        self.connect("draw", self.on_draw)
        self.draw_counter = 0

    def on_draw(self, cw, cr):
        self.draw_counter += 1
        print("CustomWidget.on_draw() called {} times".format(self.draw_counter))
        return False

class TopLevelWin(Gtk.Window):
    def __init__(self):
        super().__init__(title="Custom Widgets Test")
        self.set_default_size(500, 500)

        self.hbox = Gtk.HBox()
        self.add(self.hbox)
        self.hbox.pack_start(CustomWidget(), False, False, 0)

    def destroy(self):
        self.hbox.destroy()

win = TopLevelWin()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

请注意,我将CustomWidget.on_draw()方法连接到draw信号并使用计数器来计算调用该方法的次数;这就是我觉得奇怪的地方。

启动程序后立即进行CustomWidget.on_draw() 2 到 4 次。实际调用次数因执行而异。

我的 DE 会自动关注新创建的窗口。但是,假设我手动关注我的编辑器或任何其他窗口。在这种情况下,该函数会被额外调用约 36 次(近似值在此程序的执行之间也会有所不同)。每当我关注另一个窗口或重新关注 GTK 窗口时,都会再次发生这种情况。

也许我误解了 GTK 是如何生成draw信号的,但是当窗口聚焦或另一个窗口在其上方时,不应该接收到单个绘制信号吗?

我不知道这是否与桌面环境相关,但我正在运行 KDE Plasma 5.23.5,即 Wayland 会话。

谢谢。

4

0 回答 0