Я хочу порождать другой процесс для асинхронного отображения сообщения об ошибке, пока остальная часть приложения продолжается.
Я использую модуль multiprocessing
в Python 2.6 для создания процесса и пытаюсь отобразить окно с 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
, прежде чем вызывать дочерний процесс, он будет работать, потому что тогда это будет дочерний процесс, который импортирует его впервые.