Linux에서 멀티 프로세싱을 사용할 때는 Tkinter Windows가 나타나지 않습니다.

StackOverflow https://stackoverflow.com/questions/410469

문제

나머지 응용 프로그램이 계속되는 동안 오류 메시지를 비동기로 표시하는 다른 프로세스를 스폰하고 싶습니다.

나는 사용하고있다 multiprocessing Python 2.6의 모듈은 프로세스를 만들려면 Window를 다음과 함께 표시하려고합니다. 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 아동 과정을 생성하기 전에 처음으로 수입하는 어린이 과정이기 때문에 작동합니다.

도움이 되었습니까?

해결책

이것 논의 도움이 될 수 있습니다.

내가 찾은 몇 가지 샘플 문제는 다음과 같습니다.

  1. 멀티 프로세싱 모듈은 스레드를 밀접하게 따르지만 정확히 일치하지는 않습니다. 한 예 : 프로세스의 매개 변수는 picklable, 나는 통과를 피하기 위해 많은 코드 변경을 거쳐야했다. Tkinter 이것들은 그렇지 않기 때문에 개체입니다 picklable. 스레딩 모듈에서는 발생하지 않습니다.

  2. process.terminate() 첫 번째 시도 후에는 실제로 작동하지 않습니다. 두 번째 또는 세 번째 시도는 단순히 데이터 구조가 손상 되었기 때문에 (API에서 언급되었지만, 이것은 거의 위로가 아닙니다) 통역사를 걸어 다닙니다.

다른 팁

어쩌면 쉘 명령을 부를 수도 있습니다 xhost + 동일한 쉘에서 프로그램을 호출하기 전에 작동합니까?

나는 당신의 문제가 X-Server에 있다고 생각합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top