ich bin noch neu im Programmieren und versuche gerade eine GUI in Python, auf dem Raspberry Pi zu schreiben, welche eine Reihe von LED-Leisten ansteuern soll. Dabei soll auch eine Funktion integriert werden die die Leisten, in einer vom Nutzer angegebenen Zeit (ms), blinken lässt. Diese versuche ich über das Multiprocessing Modul in einen eigenen Prozess auszulagern. Dieser soll dann in einem unendlichen Loop laufen, bis der User den "Aplly Blink Change's" Button erneut betätigt, daraufhin soll der laufende Blinkprozess beendet und ein neuer gestartet werden.
Mein Problem liegt nun darin den gestarteten Prozess zu beenden. Ich denke, dadurch das ich versuche den Prozess durch ein erneutes aufrufen der Klasse Blink zu beenden, eine neue Instanz dieser erschaffen wird und diese dann keinen Zugriff mehr auf den gestarteten, ersten Prozess hat.
Ich habe versucht auf den Prozess über den, beim print() Befehl angegebenen Namen und über die ID(pip) zuzugreifen, beides ohne Erfolg. Die Frage ist nun gibt es eine Möglichkeit einen spezifischen Prozess zu terminieren (oder alle, außer dem mainloop) oder ist mein ganzer Ansatz einfach Quark?
Mir ist bewusst das python für zeitkritische Sachen nicht die beste Wahl ist aber da ich mit dieser Sprache nun begonnen habe, würde ich wenn Möglich auch erst einmal bei ihr bleiben, bis ich mich wenigstens einigermaßen eingelebt habe.
Schon mal vielen Dank für alle Antworten.
Gruß Paula
Code: Alles auswählen
import tkinter as tk
import wiringpi as wp
import time
from Blink_Process import Blink
pins ={'pin_R1':11, 'pin_G1':12, 'pin_B1':13}
wp.wiringPiSetupPhys()
for i in pins:
wp.pinMode(pins[i],1)
wp.softPwmCreate(pins[i],0,255)
#---------------------------------------------------------class's
class LabeledEntry(tk.Entry):
def __init__(self, master = None, label = 'Platzhalter',**kwargs):
tk.Entry.__init__(self, master, **kwargs)
self.label = label
self.on_exit()
self.bind('<FocusIn>', self.on_entry)
self.bind('<FocusOut>', self.on_exit)
def on_entry(self, event = None):
if self.get() == self.label:
self.delete(0, tk.END)
def on_exit(self, event = None):
if not self.get():
self.insert(0, self.label)
#---------------------------------------------------------def's
def apply_RGB_Var():
duty_cycle = {'r1':100,'r2':100,'r3':100,'r4':100,'r5':100,'r6':100,'r7':100,'r8':100,'r9':100,'r10':100,
'g1':100,'g2':100,'g3':100,'g4':100,'g5':100,'g6':100,'g7':100,'g8':100,'g9':100,'g10':100,
'b1':100,'b2':100,'b3':100,'b4':100,'b5':100,'b6':100,'b7':100,'b8':100,'b9':100,'b10':100}
duty_cycle ['r1'] = entry_row1_red.get()
duty_cycle ['g1'] = entry_row1_green.get()
duty_cycle ['b1'] = entry_row1_blue.get()
for key, value in duty_cycle.items():
if type(value) is str:
if value.isdigit():
duty_cycle[key] = int(value)
else:
duty_cycle[key] = 100
for key, value in duty_cycle.items():
if type(value) is int:
if value > 255:
duty_cycle[key] = 255
print(duty_cycle)
wp.softPwmWrite(pins['pin_R1'], duty_cycle ['r1'])
wp.softPwmWrite(pins['pin_G1'], duty_cycle ['g1'])
wp.softPwmWrite(pins['pin_B1'], duty_cycle ['b1'])
def run_blink(): #die Funktion die den Blinkprozess starten soll
on_time = entry_row1_on.get()
off_time = entry_row1_off.get()
on_time = int(on_time)
off_time = int(off_time)
global first_run
blink = Blink(on_time, off_time)
if first_run:
if on_time | off_time != 0:
blink.start()
first_run = False
else:
blink.stop()
first_run = True
#---------------------------------------------------------main Window
main_window = tk.Tk()
label_row1 = tk.Label(main_window, text = 'LED-Reihe 1: ')
label_row1.grid(row = 2, sticky = 'W')
label_row1_red = tk.Label(main_window, text = 'Red')
label_row1_red.grid(row = 2, column = 2)
entry_row1_red = LabeledEntry(main_window, width = 5, label = '0-255' )
entry_row1_red.grid(row = 2, column = 3)
label_row1_green = tk.Label(main_window, text = 'Green')
label_row1_green.grid(row = 3, column = 2)
entry_row1_green = LabeledEntry(main_window, width = 5, label = '0-255')
entry_row1_green.grid(row = 3, column = 3)
label_row1_blue = tk.Label(main_window, text = 'Blue')
label_row1_blue.grid(row = 4, column = 2)
entry_row1_blue = LabeledEntry(main_window, width = 5, label = '0-255')
entry_row1_blue.grid(row = 4, column = 3)
label_row1_on = tk.Label(main_window, text = 'On-Time')
label_row1_on.grid(row = 5, column = 2)
entry_row1_on = LabeledEntry(main_window, width = 5, label = '0')# muss noch in 'in ms' geändert werden, kein int, lösung finden
entry_row1_on.grid(row = 5, column = 3)
label_row1_off = tk.Label(main_window, text = 'Off-Time')
label_row1_off.grid(row = 6, column = 2)
entry_row1_off = LabeledEntry(main_window, width = 5, label = '0')
entry_row1_off.grid(row = 6, column = 3)
apply_row1 = tk.Button(main_window, text = "Apply Color Change's", command = apply_RGB_Var)
apply_row1.grid(row = 3, column = 0)
apply_row1_blink = tk.Button(main_window, text = "Apply Blink Change's", command = run_blink) # der Button der die Blinkfunktion ausführt
apply_row1_blink.grid(row = 4, column = 0)
apply_to_all = tk.Button(main_window, text = 'Apply to all!')
apply_to_all.grid(row = 5, column = 0)
#---------------------------------------------------------advanced option's window's
#---------------------------------------------------------
main_window.title('Beleuchtungssteuerung KHO 1.1')
main_window.mainloop()
for i in pins:
wp.digitalWrite(pins[i],0)
wp.pinMode(pins[i],0)
Code: Alles auswählen
class Blink():
def __init__(self, on_time, off_time):
self.pool = None
self.on_time = Value('i',on_time)
self.off_time = Value('i',off_time)
self.do_blink = Value('b', True)
self.proc_blink = Process(target =self.blink)
def blink(self):
print(self.proc_blink.pid)
self.x = self.proc_blink.pid
self.x.terminate()
while self.do_blink:
print('on: ')
time.sleep(1)
print('off: ')
time.sleep(1)
def start(self):
self.proc_blink.start()
def stop(self):
self.do_blink.value = False
self.proc_blink.terminate()