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.

War es hilfreich?

Lösung

Die Diskussion rel="nofollow hilfreich sein könnte.

  

Hier einige Beispiele für Probleme, die ich gefunden:

     
      
  1. 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.

  2.   
  3. 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).

  4.   

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top