Shuttersteuerung V1.0 GUI
Die grafische Oberfläche habe ich mit TKinter gebaut. Allerdings hat die Oberfläche mich vor eine neues Problem gestellt.
Der Aufruf "Fenster.mainloop()" startet eine Endlosschleife. Innerhalb dieser Schleife wird allerdings nicht die Midischnittstelle abgefragt. Eingehende MIDI Kommandos werden ignoriert. Deshalb musste ich die Endlosschleife für die Midischnittstelle in die Funktion "midi_eingabe()" verlagern. Diese Funktion wird in einem eigenen Thread gestartet.
Innerhalb des Bedienfensters gibt es Buttons zur manuellen Steuerung des Shutters mit der Maus bzw. einen Button zum Beenden des Programms. Die Funktion "callback()" ermöglicht zusätzlich auch eine Steuerung mit der Tastatur.
Ansonsten ist der Rest identisch zur CLI Version.
Und im nächsten Schritt die Statusabfrage.
Der Aufruf "Fenster.mainloop()" startet eine Endlosschleife. Innerhalb dieser Schleife wird allerdings nicht die Midischnittstelle abgefragt. Eingehende MIDI Kommandos werden ignoriert. Deshalb musste ich die Endlosschleife für die Midischnittstelle in die Funktion "midi_eingabe()" verlagern. Diese Funktion wird in einem eigenen Thread gestartet.
Innerhalb des Bedienfensters gibt es Buttons zur manuellen Steuerung des Shutters mit der Maus bzw. einen Button zum Beenden des Programms. Die Funktion "callback()" ermöglicht zusätzlich auch eine Steuerung mit der Tastatur.
Ansonsten ist der Rest identisch zur CLI Version.
Und im nächsten Schritt die Statusabfrage.
import tkinter as tk
from pygame import midi
import socket
import threading
import sys
#PJLink Funktion wie in der CLI Version
def shutter(aktion):
ip = '192.168.20.68'
port = 4352
if aktion == 'zu':
msg = '%1AVMT 31\r'
elif aktion == 'auf':
msg = '%1AVMT 30\r'
msg = msg.encode('UTF-8')
s=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((ip, port))
s.send(msg)
s.close()
#MIDI Funktionen
def midi_decode(key):
#prüfe auf Note on Status, gib Note on Status und Midinote zurück wie in der CLI Version
if key[0] == 144:
s = True
else:
s = False
n = key[1]
return s, n
def midi_eingabe():
#warte auf MIDI Input Signal und löse Shutter Funktion aus
while True:
if midi_input.poll():
eingabe = midi_input.read(num_events=16)
note_on, taste = midi_decode(eingabe[0][0])
if note_on and taste == 125: #F8
shutter('zu')
if note_on and taste == 127: #G8
shutter('auf')
#Funktionen der Grafischen Oberfläche
def callback(event):
#Tastatursteuerung
if event.keysym == 'x': #Taste x zum beenden des Programms
fenster.destroy()
if event.keysym == 'a': #Taste a um den Shutter manuell zu öffnen
shutter('auf')
if event.keysym == 'z': #Taste z um den Shutter manuell zu schließen
shutter('zu')
def erlaube_tastatur_eingabe():
fenster.bind('<Key>',callback)
#Initialisiere Midi Schnittstelle
midi.init()
default_id = midi.get_default_input_id()
midi_input = midi.Input(device_id=default_id)
#Erstelle Grafische Oberfläche
fenster = tk.Tk()
fenster.geometry("300x250")
fenster.title("Shuttersteuerung V1.0.0")
text1 = tk.Label(fenster, text="Dieses Tool übersetzt MIDI Noten")
text1.grid(row=1,column=1,columnspan=2)
text2 = tk.Label(fenster, text="in PJLink Kommandos für Panasonic Beamer")
text2.grid(row=2,column=1,columnspan=2)
text3 = tk.Label(fenster, text="Shutter auf:")
text3.grid(row=3,column=1)
text4 = tk.Label(fenster, text="Channel 1, G8")
text4.grid(row=3,column=2)
text5 = tk.Label(fenster, text="Shutter zu:")
text5.grid(row=4,column=1)
text6 = tk.Label(fenster, text="Channel 1, F8")
text6.grid(row=4,column=2)
button_auf = tk.Button(text="Shutter auf (a)", command=lambda: shutter('auf'))
button_auf.grid(row=5, column=1, pady=20)
button_zu = tk.Button(text="Shutter zu (z)", command=lambda: shutter('zu'))
button_zu.grid(row=5, column=2, pady=20)
button_quit = tk.Button(text="Beenden (x)", command=fenster.destroy)
button_quit.focus()
button_quit.grid(row=6,column=2, pady=20)
erlaube_tastatur_eingabe()
#Öffne neuen Thread für Midi Input Loop
t = threading.Thread(target=midi_eingabe)
t.daemon = True
t.start()
#Starte Grafische Oberfläche
fenster.mainloop()
#Stoppe alle Threads
sys.exit()