5

我尝试在 2 个 Python 进程中使用 SecretStorage,但是当我尝试更新我的 Gtk.Window 时,我大部分时间都会收到此消息:

RuntimeError:无法初始化 SecretService:没有收到回复。可能的原因包括:远程应用程序未发送回复、消息总线安全策略阻止回复、回复超时或网络连接中断。

两者都从multiprocessing.Process开始,这是有效的:

def get_data(self):
    p1 = Process(target=P1().update_database)
    p1.start()
    p1.join()
    p2 = Process(target=P2().update_database)
    p2.start()
    p2.join()

问题是:这阻止了我的 Gtk 界面,窗口被阻止,没有其他按钮可点击。

因此,我也使用了threading.Thread

def on_get_data_button_clicked(self, widget):
    thread = Thread(target=self.get_data)
    thread.start()

这也有效,但如果进程仍在进行中,我无法从主窗口看到。

所以我添加了一个 Gtk.Spinner-Button 来查看活动

def on_get_data_button_clicked(self, widget):
    thread = Thread(target=self.get_data)
    thread.start()
    GObject.timeout_add(200, self.manage_spinner, thread)

def manage_spinner(self, thread):
    if thread.is_alive():
        return True
    else:
        self.sync_spinner.stop()
        return False

有时这是可行的,但大多数时候我会收到此错误:

RuntimeError:无法初始化 SecretService:没有收到回复。可能的原因包括:远程应用程序未发送回复、消息总线安全策略阻止回复、回复超时或网络连接中断。

在下标中 SecretStorage 是这样使用的:

def get_key(self, key_name):
    bus = secretstorage.dbus_init()
    collection = secretstorage.get_default_collection(bus)
    if collection.is_locked():
        collection.unlock()
    items = collection.get_all_items()
    for item in items:
        if item.get_label() == key_name:
            return item.get_secret()

如果在 get_key() 调用期间调用 GObject.timeout_add,则会出现问题。

也许它也与这个问题有关:How to find a key by label from secretstorage collection

4

0 回答 0