Ich bekomme es nicht hin die Funktion def schalten1() ohne Buttom auszulösen.
Darum habe ich es jetzt auf GPIO umgestellt. Sieht so aus:
Code: Alles auswählen
class Ventil1:
def __init__(self, canvas, position):
self.canvas = canvas
self.status = 0
self.id1_ventil1 = self.canvas.create_polygon(ventil1[0]-20, ventil1[1]+10, ventil1[0], ventil1[1], ventil1[0]-20, ventil1[1]-10, fill="green")
self.id2_ventil1 = self.canvas.create_polygon(ventil1[0]+20, ventil1[1]-10, ventil1[0], ventil1[1], ventil1[0] + 20, ventil1[1] + 10, fill="red")
self.canvas.create_polygon(ventil1[0], ventil1[1], ventil1[0]-10, ventil1[1]-20, ventil1[0]+10, ventil1[1]-20, fill="green")
def schalten1(self):
self.status = 1 - self.status
self.canvas.itemconfig(self.id1_ventil1, fill="green" if GPIO.input(2) == GPIO.HIGH else "red")
self.canvas.itemconfig(self.id2_ventil1, fill="red" if GPIO.input(2,) == GPIO.HIGH else "green")
GPIO.output(2, GPIO.HIGH) if self.status == 1 else GPIO.output(2, GPIO.LOW)
Und funktioniert, aber nur solange ich den GPIO über diese Funktion schalte. Wenn ich ihn mit einem Befehl außerhalb diese Funktion anspreche ändert sich die Visualisierung nicht. Die Funktion mainloop sollte doch def schalt() bzw. das Fenster darin aktualisieren oder habe ich was falsch verstanden?
Hier ist der komplette CODE.
Code: Alles auswählen
import tkinter as tk
import random
import time
#import fake_GPIO as GPIO
import RPi.GPIO as GPIO
#Position Ventile
ventil1 = [50, 50]
ventil2 = [50, 200]
ventil3 = [200, 50]
Status2=0
class Ventil1:
def __init__(self, canvas, position):
self.canvas = canvas
self.status = 0
self.id1_ventil1 = self.canvas.create_polygon(ventil1[0]-20, ventil1[1]+10, ventil1[0], ventil1[1], ventil1[0]-20, ventil1[1]-10, fill="green")
self.id2_ventil1 = self.canvas.create_polygon(ventil1[0]+20, ventil1[1]-10, ventil1[0], ventil1[1], ventil1[0] + 20, ventil1[1] + 10, fill="red")
self.canvas.create_polygon(ventil1[0], ventil1[1], ventil1[0]-10, ventil1[1]-20, ventil1[0]+10, ventil1[1]-20, fill="green")
def schalten1(self):
self.status = 1 - self.status
self.canvas.itemconfig(self.id1_ventil1, fill="green" if GPIO.input(2) == GPIO.HIGH else "red")
self.canvas.itemconfig(self.id2_ventil1, fill="red" if GPIO.input(2,) == GPIO.HIGH else "green")
GPIO.output(2, GPIO.HIGH) if self.status == 1 else GPIO.output(2, GPIO.LOW)
class Ventil2:
def __init__(self, canvas, position):
global Status2
self.canvas = canvas
self.status = Status2
self.id1_ventil2 = self.canvas.create_polygon(ventil2[0]-20, ventil2[1]+10, ventil2[0], ventil2[1], ventil2[0]-20, ventil2[1]-10, fill="green" if self.status == 0 else "red")
self.id2_ventil2 = self.canvas.create_polygon(ventil2[0]+20, ventil2[1]-10, ventil2[0], ventil2[1], ventil2[0] + 20, ventil2[1] + 10, fill="red" if self.status == 0 else "green")
self.canvas.create_polygon(ventil2[0], ventil2[1], ventil2[0]-10, ventil2[1]-20, ventil2[0]+10, ventil2[1]-20, fill="green")
def schalten2(self):
self.status = 1 - self.status
self.canvas.itemconfig(self.id1_ventil2, fill="green" if self.status == 0 else "red")
self.canvas.itemconfig(self.id2_ventil2, fill="red" if self.status == 0 else "green")
class Ventil3:
def __init__(self, canvas, position):
self.canvas = canvas
self.status = 0
x, y = position
self.id1_ventil3 = self.canvas.create_polygon(x-20, y+10, x, y, x-20, y-10, fill="green")
self.id2_ventil3 = self.canvas.create_polygon(x+20, y-10, x, y, x + 20, y + 10, fill="red")
self.canvas.create_polygon(x, y, x-10, y-20, x+10, y-20, fill="green")
def schalten3(self):
self.status = 1 - self.status
self.canvas.itemconfig(self.id1_ventil3, fill="green" if self.status == 0 else "red")
self.canvas.itemconfig(self.id2_ventil3, fill="red" if self.status == 0 else "green")
def Programm():
GPIO.output(2, GPIO.HIGH)
time.sleep(3)
GPIO.output(2, GPIO.LOW)
def schalt():
schaltplan = tk.Tk()
schaltplan.title('Nukular Schaltplan')
schaltplan.geometry('600x600')
zeichner = tk.Canvas(schaltplan)
zeichner.pack(fill='both')
ventil_1 = Ventil1(zeichner, ventil1)
tk.Button(schaltplan, text="Ventil1", command=ventil_1.schalten1).place(x=ventil1[0]-30, y=ventil1[1]+10)
ventil_2 = Ventil2(zeichner, ventil2)
tk.Button(schaltplan, text="Ventil2", command=ventil_2.schalten2).place(x=ventil2[0]-30, y=ventil2[1] + 10)
ventil_3 = Ventil3(zeichner, ventil3)
tk.Button(schaltplan, text="Ventil3", command=ventil_3.schalten3).place(x=ventil3[0]-30, y=ventil3[1] + 10)
tk.Button(schaltplan, text="Programm", command=Programm).place(x=500, y=500)
schaltplan.mainloop()