2017-05-12 2 views
-1

Ich möchte wissen, wie man einen Prozess in Haupt starten Sie dann in einer Def-Funktion beenden. In meinem Code habe ich einen Prozess, der eine Anwendung von Interesse ausführt, dann einen anderen Prozess, der eine einfache GUI unter Verwendung von Tkinter ausführt, die darauf wartet, dass ein Buton gedrückt wird. Wenn diese Schaltfläche gedrückt wird, möchte ich, dass die Prozesse beendet werden. Zum Beispiel:Python - Beende einen Prozess gestartet in Haupt

def pro_a(): 
    #Runs the application 

def pro_b(): 
    root.mainloop() # Runs the GUI 

def buttonCallBack() 
    #I want to terminate the processes here 
    #I've tried doing: p1.terminate() 

b = Button(frame, .........., command = buttonCallBack) 
b.place(......) 

if __name__ == '__main__': 
    p1 = Process(target=pro_b) 
    p2 = Process(target=pro_a) 
    p1.start() 
    p2.start() 

Wenn ich versuche, dies zu tun, es gibt mir den Fehler: AttributeError: 'NoneType' object has no attribute 'terminate'

aber wenn ich versuche, es zu beenden, in main, es funktioniert. Aber das will ich nicht. Um klar zu sein, muss ich die Prozesse in main starten und sie dann beenden, sobald die Schaltfläche gedrückt wird.

+0

Ich sehe nicht, wie Sie den 'AttributeError' bekommen würden. Sie sollten einen 'NameError' erhalten, da' p1' nicht irgendwo definiert ist, dass 'buttonCallBack' es sehen kann. Fehlt Ihrem Beispiel etwas? –

+0

Ich glaube nicht. Ich habe jedes Bit des relevanten Codes eingeschlossen. Das Seltsame ist, wenn ich denselben Code, den ich in main eingegeben habe, in die buttonCallBack-Funktion einfüge, dann versuche zu beenden ... es funktioniert. Es scheint, dass ich den Prozess in der Funktion starten muss, um es in der Funktion beenden zu können. Aber das will ich nicht. – BBEng

+0

Haben Sie den Wert von 'p1' neu zugewiesen? –

Antwort

1

Starten Sie pro_b() nicht in einem Subprozess, rufen Sie einfach pro_b() direkt an. Ich denke, der pro_b() untergeordnete Prozess endet ohne einen Verweis auf den untergeordneten Prozess pro_a(). Wenn Sie pro_b() direkt aufrufen, führen Sie den untergeordneten Prozess pro_a() aus dem übergeordneten Prozess aus.

Verwandte Themen