Zimmerautomation mit Tkinter
Verfasst: Samstag 23. Januar 2016, 16:45
Hallo allerseits,
ich versuche mich im Moment an einer Art Hausautomation. Bevor ich jedoch die einzelnen Geräte versuche anzusteuern, möchte ich mir mit Tkinter ein graphisches Interface programmieren. Mein erster Versuch bestand darin die Standard-Bibliothek von Tkinter zu verwenden. Den Code dazu seht ihr hier:
Prinzipiell funktioniert der Code auch sehr gut, ist jedoch sehr unelegant gelöst. Zudem möchte ich später über ein Einstellungsmenü direkt über die visuelle Oberfläche Buttons hinzufügen können. Daher habe ich versucht das Erstellen der Buttons in eine for-Schlefe einzubinden und die einzelnen Buttonnamen, sowie deren Aufschrift in ein Array zu packen, was sich im Nachhinein erweitern ließe. Dadurch konnte ich allerdings keine einzelnen Buttons mehr konfigurieren, da diese nacheinander in diesselbe Variable übergeben wurden, was ich aber benötige, um die Hintergrundfarbe zu ändern. Weil das dynamische Erstellen von Variablen jedoch sehr "riskant" ist, habe ich diese Idee verwerfen können.
Meinen zweiter Versuch startete ich mit der Erweiterung Tix, weil diese die Möglichkeit einer ButtonBox enthält und für das Hinzufügen eines weiteren Buttons keine Variable benötigt und es damit ermöglicht einen Button über das Interface zu erstellen.
Hier mal ein Ansatz:
Die elegante Variante wäre es natürlich wieder das Hinzufügen der Buttons in eine for-Schleife zu setzen, was kein Problem darstellt. Nun hänge ich allerdings fest... Ich suche seit zwei Tagen, habe bis jetzt aber noch keine Möglichkeit gefunden, wie ich einen hinzugefügten Button in Tix konfigurieren kann. Die Python-Docs haben mir leider auch nicht weitergeholfen.
Vielleicht habt Ihr eine Idee, wie ich mein Problem lösen kann. Wenn ihr einen Lösungsvorschlag für eine der beiden Varianten habt oder eventuell eine ganz andere Herangehensweise auch mit einer anderen Bibliothek, wäre ich über eine Antwort sehr dankbar. Sollte es noch Fragen geben stehe ich gern zur Verfügung.
Schonmal Vielen Dank im Vorraus!!!
Grüße
Obiwaahn
ich versuche mich im Moment an einer Art Hausautomation. Bevor ich jedoch die einzelnen Geräte versuche anzusteuern, möchte ich mir mit Tkinter ein graphisches Interface programmieren. Mein erster Versuch bestand darin die Standard-Bibliothek von Tkinter zu verwenden. Den Code dazu seht ihr hier:
Code: Alles auswählen
#Bibliotheken
from tkinter import *
#Variablen
#Variable hilft beim einhalten der richtigen Zeilen und Spalten
test = 0
#Hauptmenue Zeilen
zeilen = 2
#Hauptmenue Spalten
spalten = 5
#Buttonbreite
buttonWidth = 10
#Buttonhoehe
buttonHeight = 2
#Schriftart
schriftArt = ('Arial', 14)
#Farbe Button an
colourAn = 'yellow'
#Farbe Button aus
colourAus = 'grey94'
#Initialisierung des Fensters fuer das Hauptmenue
window = Tk()
window.title('Zimmerautomation')
#Rahmen initialisieren und zentral positionieren
rahmen1 = Frame(window)
rahmen1.pack()
rahmen2 = Frame(window)
rahmen2.pack(side=BOTTOM)
#Definition der Befehle, die die Buttons ausfuehren sollen zum ANSCHALTEN
#Fenster Button an
def rollladenAn():
button1.config(bg=colourAn, command=rollladenAus)
#Fernseher Button an
def fernseherAn():
button2.config(bg=colourAn, command=fernseherAus)
#Deckenfluter Button an
def deckenfluterAn():
button3.config(bg=colourAn, command=deckenfluterAus)
#Nachttischlampe Button an
def tischlampeAn():
button4.config(bg=colourAn, command=tischlampeAus)
#Nachtmodus Button an
def ruhemodusAn():
button5.config(bg=colourAn, command=ruhemodusAus)
#Kino Button an
def kinoAn():
button6.config(bg=colourAn, command=kinoAus)
#Defintionen der Befehle, die die Buttons ausfuehren sollen zum AUSSCHALTEN
#Fenster Button aus
def rollladenAus():
button1.config(bg=colourAus, command=rollladenAn)
#Fernseher Button aus
def fernseherAus():
button2.config(bg=colourAus, command=fernseherAn)
#Deckenfluter Button aus
def deckenfluterAus():
button3.config(bg=colourAus, command=deckenfluterAn)
#Nachttischlampe Button aus
def tischlampeAus():
button4.config(bg=colourAus, command=tischlampeAn)
#Nachtmodus Button aus
def ruhemodusAus():
button5.config(bg=colourAus, command=ruhemodusAn)
#Kino Button aus
def kinoAus():
button6.config(bg=colourAus, command=kinoAn)
#Quit Button
def schliessen():
print('Schliessen')
#Arrays fuer die Texte der einzelnen Buttons im Hauptmenue
buttonText = ['Fenster', 'Fernseher', 'Deckenfluter', 'Tischlampe', 'Ruhemodus', 'Kino']
buttonCommands = [rollladenAn, fernseherAn, deckenfluterAn, tischlampeAn, ruhemodusAn, kinoAn]
#Initialisierung der Buttons im Hauptmenue
button1 = Button(rahmen1, text=buttonText[0], command=buttonCommands[0], width=buttonWidth, height=buttonHeight, font=schriftArt)
button2 = Button(rahmen1, text=buttonText[1], command=buttonCommands[1], width=buttonWidth, height=buttonHeight, font=schriftArt)
button3 = Button(rahmen1, text=buttonText[2], command=buttonCommands[2], width=buttonWidth, height=buttonHeight, font=schriftArt)
button4 = Button(rahmen1, text=buttonText[3], command=buttonCommands[3], width=buttonWidth, height=buttonHeight, font=schriftArt)
button5 = Button(rahmen1, text=buttonText[4], command=buttonCommands[4], width=buttonWidth, height=buttonHeight, font=schriftArt)
button6 = Button(rahmen1, text=buttonText[5], command=buttonCommands[5], width=buttonWidth, height=buttonHeight, font=schriftArt)
#button7 = Button(rahmen1, text=buttonText[6], command=buttonCommands[6], width=buttonWidth, height=buttonHeight, font=schriftArt, visible='No')
buttonQuit = Button(rahmen2, text='QUIT', command=schliessen, width=buttonWidth, height=buttonHeight, font=schriftArt)
#Hauptmenuebuttons werden in Arry eingetragen, jeder Button muss eingetragen werden
hButtons = [button1, button2, button3, button4, button5, button6, buttonQuit]
#Buttons werden erstellt
for i in range(zeilen):
for j in range(spalten):
hButtons[test].grid(row=i, column=j, padx=4, pady=4)
test=test + 1
if test == len(hButtons):
break
window.mainloop()
Meinen zweiter Versuch startete ich mit der Erweiterung Tix, weil diese die Möglichkeit einer ButtonBox enthält und für das Hinzufügen eines weiteren Buttons keine Variable benötigt und es damit ermöglicht einen Button über das Interface zu erstellen.
Hier mal ein Ansatz:
Code: Alles auswählen
import tkinter.tix as tix
def test(a):
#erstellt Titel der Buttonbox
top = tix.Label(a, padx=20, pady=10, bd=1, relief=tix.RAISED, text='Test Box')
#ordnet Titel an
top.pack(side=tix.TOP, fill=tix.BOTH, expand=1)
#erstellt Buttonbox
box = tix.ButtonBox(a, orientation=tix.HORIZONTAL)
#fuegt Buttons hinzu
box.add('fenster', text='Fenster', underline=0, width=5, command= ausdruck)
box.add('lampe', text='Lampe', underline=0, width=5, command= back)
#ordnet Buttons an
box.pack(side=tix.BOTTOM, fill=tix.X)
def ausdruck():
print ('Fenster')
def back():
print('Lampe')
if __name__ == '__main__':
fenster = tix.Tk()
test(fenster)
fenster.mainloop()
Vielleicht habt Ihr eine Idee, wie ich mein Problem lösen kann. Wenn ihr einen Lösungsvorschlag für eine der beiden Varianten habt oder eventuell eine ganz andere Herangehensweise auch mit einer anderen Bibliothek, wäre ich über eine Antwort sehr dankbar. Sollte es noch Fragen geben stehe ich gern zur Verfügung.
Schonmal Vielen Dank im Vorraus!!!
Grüße
Obiwaahn