Tkinter Fenster nicht angezeigt, wenn auf Linux Multiprozessing mit
-
03-07-2019 - |
Frage
Ich möchte einen anderen Prozess zum Laichen eine Fehlermeldung asynchron angezeigt werden, während der Rest der Anwendung wird fortgesetzt.
Ich bin mit dem multiprocessing
Modul in Python 2.6, den Prozess zu schaffen, und ich versuche das Fenster mit TKinter
anzuzeigen.
Dieser Code funktioniert in Ordnung unter Windows, aber es unter Linux das TKinter
Fenster ausgeführt wird nicht angezeigt, wenn ich 'showerror("MyApp Error", "Something bad happened.")'
nennen. Es hat angezeigt, wenn ich es im gleichen Prozess laufen durch showerrorprocess
direkt aufrufen. Vor diesem Hintergrund scheint es TKinter
richtig funktioniert. Ich kann an die Konsole drucken und andere Dinge tun, von Prozessen durch multiprocessing
hervorgebracht, so scheint es, auch zu arbeiten.
Sie scheinen einfach nicht zusammen zu arbeiten. Muss ich spezielle tun etwas hervorgebracht Teilprozesse zu ermöglichen, Fenster zu schaffen?
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()
Bearbeiten
Das Problem scheint, dass TKinter
zu sein wurde von dem übergeordneten Prozess importiert und in den untergeordneten Prozess „geerbt“, aber irgendwie ist ihr Zustand untrennbar mit dem übergeordneten Prozess verknüpft, und es kann in dem Kind nicht. Solange Sie darauf achten, nicht TKinter
zu importieren, bevor Sie das Kind Prozess erzeugen, wird es funktionieren, denn dann ist es das Kind Prozess, der es zum ersten Mal importiert.
Lösung
Die Diskussion rel="nofollow hilfreich sein könnte.
Hier einige Beispiele für Probleme, die ich gefunden:
Während das Multiprocessing-Modul folgt eng Einfädeln, es ist definitiv nicht eine genaue Übereinstimmung. Ein Beispiel: Da Parameter ein Prozess muss sein pickleable , hatte ich durch eine Menge Code gehen Änderungen zu vermeiden
Tkinter
Objekte fließen, da diese nicht pickleable . Das funktioniert nicht mit dem Gewinde-Modul auftreten.
process.terminate()
nicht wirklich funktioniert nach dem ersten Versuch. Der zweite oder dritte Versuch hängt einfach den Dolmetscher, wahrscheinlich da Datenstrukturen beschädigt sind (in der API genannt, aber diese ist nur ein schwacher Trost).
Andere Tipps
Vielleicht machen Sie das Shell-Befehl xhost +
aufrufen, bevor Ihr Programm aus dem gleichen Shell Aufruf funktioniert?
ich Ihr Problem bin zu raten, liegt mit dem X-Server.