TKinter-Fenster erscheinen nicht bei der Verwendung von Multiprocessing unter Linux

Ich möchte einen anderen Prozess hervorbringen, um eine Fehlermeldung asynchron anzuzeigen, während der Rest der Anwendung fortfährt.

Ich benutze das multiprocessing Modul in Python 2.6, um den Prozess zu erstellen und ich versuche, das Fenster mit TKinter .

Dieser Code funktionierte auf Windows, aber es läuft auf Linux das TKinter Fenster erscheint nicht, wenn ich 'showerror("MyApp Error", "Something bad happened.")' . Es kommt vor, wenn ich es im selben Prozess showerrorprocess indem showerrorprocess direkt showerrorprocess . Angesichts dessen scheint TKinter richtig zu funktionieren. Ich kann auf die Konsole drucken und andere Dinge aus Prozessen, die durch multiprocessing hervorgebracht werden, multiprocessing , also scheint es auch zu funktionieren.

Sie scheinen einfach nicht zusammen zu arbeiten. Muss ich etwas Besonderes machen, um geplante Unterprozesse zu erstellen, um Fenster zu erstellen?

 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 zu sein, dass TKinter durch den Elternprozess importiert wurde und "in den Kinderprozess" geerbt wurde, aber irgendwie ist sein Zustand untrennbar mit dem Elternprozess verknüpft und kann nicht im Kind arbeiten. Solange du dafür TKinter du TKinter nicht importierst, bevor du den Kindprozeß TKinter , wird es funktionieren, denn dann ist es der Kinderprozess, der ihn zum ersten Mal importiert.

2 Solutions collect form web for “TKinter-Fenster erscheinen nicht bei der Verwendung von Multiprocessing unter Linux”

Diese Diskussion könnte hilfreich sein.

Hier sind einige Beispielprobleme, die ich gefunden habe:

  1. Während das Multiprocessing-Modul dem Threading genau folgt, ist es definitiv kein exaktes Spiel. Ein Beispiel: Da die Parameter eines Prozesses ablesbar sein müssen , musste ich viele Codeänderungen durchlaufen, um Tkinter Objekte zu vermeiden, da diese nicht ablesbar sind . Dies geschieht nicht mit dem Gewindeschneidemodul.

  2. process.terminate() funktioniert nach dem ersten Versuch nicht wirklich. Der zweite oder dritte Versuch hängt einfach den Dolmetscher, vermutlich weil Datenstrukturen beschädigt sind (in der API erwähnt, aber das ist wenig Trost).

Vielleicht rufen Sie den Shell-Befehl xhost + vor dem Aufruf Ihres Programms von der gleichen Shell wird funktionieren?

Ich vermute, Ihr Problem liegt beim X-Server.

  • Tkinter Bildtransparenz
  • Wie kann ich die Ausgabe von tkFileDialog.askdirectory verwenden, um ein tkinter Entry-Feld zu füllen
  • Getting die Gesamtzahl der Zeilen in einem Tkinter Text-Widget?
  • Python tkinter verbindet eine Funktion mit mehreren Parametern
  • So ändern Sie die Farbe der ttk-Taste
  • Python gui veranstaltungen vergeben
  • Python tkinter Leinwand transparent
  • Grundfrage über tkinter Buttons
  • Python Tkinter: Baumauswahl
  • Tastenbefehle in Tkinter
  • Handle Touchscreen Geste in Tkinter
  • Python ist die beste Programmiersprache der Welt.