ich möchte ein Programm zur Gartenbewässerung schreiben, dass den Raspery Pi steuert. Dabei muss ich diverse Ventile mit den IO´s schalten und gleichzeitig den Zustand auf dem Touchscreen visualisieren.
Wenn also Ventil geschlossen, dann ist nur ein Punkt zu sehen. Wenn das Ventil offen ist soll der Punkt blinken. Dabei soll das Programm aber weiter laufen andere Ventile zu schalten, Sensoren aus zu lesen oder eingaben am Touch auf zu nehmen.
Das Blinken lasse ich also in einem eigenen Thread laufen, und bekomme natürlich prompt die Fehlermeldung RuntimeError: main thread is not in main loop
Wie komme ich aus der Nummer raus, bzw. wie kann man so etwas realisieren?
Hier mein Versuch (Sorry bin Laie, will aber mal groß werden ):
Code: Alles auswählen
from tkinter import *
import _thread, time
#############################################################################
class Background(Canvas):
def __init__(self, window):
self.garten = PhotoImage(file="Gartenhintergrund.pgm")
Canvas.__init__(self, master=window, width=800, height=480)
#Entspricht RPI Touch mit 800x480 Pixeln
self.create_image(0,0, anchor=NW, image=self.garten)
self.pack()
#############################################################################
class Regner:
def __init__(self, background, x, y):
self.background = background
self.x = x
self.y = y
self.aktiv = False
self.farbeRuhend="#2007ad"
self.farbeAktiv= "#299be6"
self.r=20
self.iD = self.background.create_oval(self.x-self.r/2,
self.y-self.r/2,
self.x+self.r/2,
self.y+self.r/2,
fill=self.farbeRuhend,
outline=self.farbeRuhend)
#......................................................................
def an(self):
self.aktiv = True
_thread.start_new_thread(self.run, ())
#......................................................................
def run(self):
self.aktiv = True
while self.aktiv:
time.sleep(1)
self.background.itemconfigure(self.iD,
fill="white",
outline="white")
time.sleep(1)
self.background.itemconfigure(self.iD,
fill="red",
outline="red")
#......................................................................
def aus(self):
self.aktiv = False
self.background.itemconfigure(self.iD,
fill=self.farbeRuhend,
outline=self.farbeRuhend)
window = Tk()
background = Background(window)
rasen = Regner(background, 150, 100)
_thread.start_new_thread(rasen.run,())
time.sleep(3)
rasen.aus()
window.mainloop()