我希望生成另一个进程,以便在应用程序的其余部分继续时异步显示错误消息。
我正在使用Python 2.6中的multiprocessing
模块来创建进程,我正在尝试使用TKinter
显示窗口。
此代码在Windows上运行正常,但在Linux上运行它,如果我调用TKinter
,则不会显示'showerror("MyApp Error", "Something bad happened.")'
窗口。如果我通过直接调用showerrorprocess
在同一进程中运行它, 就会出现。鉴于此,似乎TKinter
正常工作。我可以打印到控制台并从multiprocessing
生成的进程中执行其他操作,因此它似乎也在起作用。
他们似乎没有一起工作。我是否需要做一些特殊的事情来允许衍生的子进程创建窗口?
from multiprocessing import Process
from Tkinter import Tk, Text, END, BOTH, DISABLED
import sys
import traceback
def showerrorprocess(title,text):
"""Pop up a window with the given title and text. The
text will be selectable (so you can copy it to the
clipboard) but not editable. Returns when the
window is closed."""
root = Tk()
root.title(title)
text_box = Text(root,width=80,height=15)
text_box.pack(fill=BOTH)
text_box.insert(END,text)
text_box.config(state=DISABLED)
def quit():
root.destroy()
root.quit()
root.protocol("WM_DELETE_WINDOW", quit)
root.mainloop()
def showerror(title,text):
"""Pop up a window with the given title and text. The
text will be selectable (so you can copy it to the
clipboard) but not editable. Runs asynchronously in
a new child process."""
process = Process(target=showerrorprocess,args=(title,text))
process.start()
修改
问题似乎是TKinter
由父进程导入,并且“继承”到子进程中,但不知何故,它的状态与父进程密不可分,并且它无法在子进程中工作。只要您确保在生成子进程之前不导入TKinter
,它就会起作用,因为它是第一次导入它的子进程。
答案 0 :(得分:4)
这discussion可能会有所帮助。
以下是我发现的一些示例问题:
- 第一次尝试后,
虽然多处理模块紧跟线程,但它绝对不是完全匹配。一个例子:从参数到a 进程必须是 pickleable ,我不得不经历很多代码 更改以避免传递
Tkinter
个对象,因为这些不是 与pickle 。线程模块不会发生这种情况。- 醇>
process.terminate()
无效。第二次或第三次尝试可能只是挂起翻译 因为数据结构已损坏(在API中提到,但是这个 很少安慰。)
答案 1 :(得分:0)
在从同一个shell调用程序之前调用shell命令xhost +
可能会有效吗?
我猜你的问题在于X服务器。