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