如何在GObject.timeout_add - Gtk3中使用Python SecretStorage

时间:2018-02-13 12:07:51

标签: python gtk python-multithreading pygobject python-keyring

我尝试在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

0 个答案:

没有答案