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