标记文本标签中带有“激活链接”信号的 PyGtk 分割

问题描述

下面的 MWE 只是创建了一个带有超文本的标签。大多数情况下(但不是每次),当我点击该链接时,它会导致分段错误

enter image description here

我认为我误解了 PyGtk 的某些内容并且我以错误的方式使用它?

这是错误输出

Window._on_activate_link()
Fatal Python error: Segmentation fault

Current thread 0x00007fa2718a7740 (most recent call first):
  File "/usr/lib/python3/dist-packages/gI/Overrides/Gtk.py",line 1641 in main
  File "./window.py",line 45 in <module>
Speicherzugriffsfehler

这里是关于我的系统和版本的信息

Linux-4.19.0-14-amd64-x86_64-with-debian-10.8
Python 3.7.3 cpython
Gtk 3.0
GIO 3.30.4
Cairo 1.16.2

这是 MWE

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import faulthandler; faulthandler.enable()
import gi
gi.require_version('Gtk','3.0')
from gi.repository import Gtk


class FeedybusWindow(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)

        hBox = Gtk.Box(spacing=5)
        self.add(hBox)

        self._Feed_label = Gtk.Label(label='')
        self._Feed_label.set_use_markup(True)
        self._Feed_label.set_markup('<a href="renamelabel">Click me</a>')
        self._Feed_label.connect('activate-link',self._on_activate_link)
        hBox.pack_start(self._Feed_label,True,20)


        # EVENT: destroy
        self.connect('delete-event',self._on_delete_event)
        self.connect('destroy',self._on_destroy)

    def _on_activate_link(self,label,uri):
        print('Window._on_activate_link()')
        if uri == 'renamelabel':
            self._Feed_label.set_markup('<a href="renamelabel">Click me AGAIN</a>')
            return True
 
        return False

    def _on_delete_event(self,window,event=None):
        self.destroy()

    def _on_destroy(self,caller):
        Gtk.main_quit()


if __name__ == '__main__':
    window = FeedybusWindow()
    window.show_all()
    Gtk.main()

EDIT:当然,我可以使用其他 GUI 元素而不是 Gtk.Label。但这将是一种解决方法而不是解决方案。 我的问题的重点是我是否以错误的方式使用了 Gtk 包,或者 Gtk 中可能存在我应该报告的错误

解决方法

这一定是一个错误(可能:https://gitlab.gnome.org/GNOME/gtk/-/issues/1498)。我看不出你的代码有任何问题,我也可以在我的 Ubuntu 20.04 系统上重现崩溃。 似乎在激活链接处理程序中设置标签是问题所在。

FWIW:一种解决方法是将其设置在处理程序之外,如下所示:

def _on_activate_link(self,label,uri):
    print('Window._on_activate_link()')
    if uri == 'renamelabel':
         Gdk.threads_add_idle(GLib.PRIORITY_DEFAULT_IDLE,self._rename)
    return False

def _rename(self):
    self._feed_label.set_markup('<a href="renamelabel">Click me AGAIN</a>')