【问题标题】:How can I update a Tkinter widget inside a multiprocess?如何在多进程中更新 Tkinter 小部件?
【发布时间】:2021-09-03 22:00:20
【问题描述】:

我正在尝试使用进程更新框架,但我无法这样做。如果我不使用进程,框架会随子元素一起更新,但在使用多进程时不会。

这是我尝试过的(代码是类的一部分):

def zx(self, q):
    print('asdadsas')
    lbl = Label(self.myframe, text="assagj")
    lbl.pack(ipady=2, padx=10, pady=5, anchor=NW)
try:
    p = multiprocessing.Process(target=self.zx, args=('a', ))
    p.daemon=True
    p.start()
    sleep(2)
    p.terminate()
except KeyboardInterrupt:
    p.terminate()
except:
    p.terminate()

【问题讨论】:

  • 省去心痛,现在切换到 Qt...文档是一流的,它为几乎所有事情(包括与主事件循环通信的线程和进程)提供了解决方案。唯一的小问题是文档是针对 C++ 的,但 python 接口在 99.99% 的情况下是相同的。
  • @Aaron Tkinter 几乎可以做任何事情,并且有据可查。在这种情况下,我会使用线程而不是多进程。
  • 我讨厌 C++,但出于某种原因喜欢 C,它适用于我的小项目,而 python+tk 是最快的,所以我想我现在只能坚持下去。
  • @Mike-SMT tkinter 不是线程安全的,所以你不应该在不同的线程中使用它。我看到tkinter 在从另一个线程访问它时崩溃而没有错误回溯。
  • @Mike-SMT 我只是向您展示,在您创建Tk() 窗口之外的线程中使用tkinter 时,让python 崩溃而没有错误回溯并不难。问题是它没有给你回溯,所以很难调试。我之前在一个大项目中遇到过这个问题,我唯一的选择是重新启动整个项目。这就是为什么我建议人们不要使用tkinterthreading,除非他们真的知道风险。

标签: python tkinter multiprocessing tk


【解决方案1】:

Tkinter 小部件不能跨越进程。所有对 Tkinter 小部件的访问都必须来自同一进程。

这是因为小部件存在于嵌入的 Tcl 解释器中,并且 Tcl 解释器不能跨进程共享。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多