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.
Image
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()