Konsolenbefehl in Python Benutzeroberfläche einbinden

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Antworten
TimboJack
User
Beiträge: 1
Registriert: Montag 2. April 2018, 13:15

Hallo zusammen,

habe zwar programmiertechnisch ein paar Kenntnisse, aber bin mit dem Pi noch nicht lange unterwegs. Ich habe angefangen ein paar Funksteckdosen fernzusteuern. Das hat aber bisher nur über die Konsole funktioniert in dem ich über die Befehle

Code: Alles auswählen

cd raspberry-remote

Code: Alles auswählen

sudo ./send 00100 1 1
meinen Sender ansteuere um den Code an die Steckdosen zu senden.
Da das aber nicht allzu elegant ist, wollte ich eine Benutzeroberfläche in Python um dort das quasi nur über ein Button zu schalten.
Ich habe um das auszuprobieren mal ein einfaches Fenster erstellt mit einem Button. leider schaffe ich es nicht, diesem Button den Befehl zuzuweisen.
Mein Programm für den Button ist das folgende:

Code: Alles auswählen

from tkinter import *

def button_action():
    anweisungs_label.config(text="Änderung ausgeführt!")

fenster = Tk()

fenster.title("Lichtsteuerung")

change_button = Button(fenster, text="Ändern", command=button_action)

anweisungs_label = Label(fenster, text="Ich bin eine Anweisung:\n\
Klicke auf 'Ändern'.")

anweisungs_label.pack()
change_button.pack()

fenster.mainloop()
Dabei Ändert sich jetzt zwar das Label, aber anstatt dieser Änderung hätte ich eben gerne die Befehle oben um den Sender zu aktivieren. Vielen Dank für eure Hilfe.
Benutzeravatar
noisefloor
User
Beiträge: 3843
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

`Button` kennt die Option `command`, mit der du eine Callback-Funktion (also eine auszuführende Funktion) an die Schaltfläche binden kannst. Beispiel: http://effbot.org/zone/tkinter-callbacks.htm

Zum Code: grundsätzlich solltest du Sternchenimporte vermeiden, weil du dir damit den Namensraum unkontrolliert "zumüllen" kannst.Das kann später zu schwer findbaren Fehlern führen. Bei `from tkinter import *` holst du dir ca. 140 Funktionen, Klassen, Konstanten in den Namensraum.

Und ich würde selbst bei trivialen GUIs empfehlen, eine Klasse dafür anzulegen. Das ist a) IMHO sauberer und b) später wesentlich einfacher zu erweitern, wenn mal 2, 3, 4, ... Button oder andere Elemente dazu kommen.

Gruß, noisefloor
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@TimboJack: externe Programme startet man mit dem subprocess-Modul:

Code: Alles auswählen

subprocess.check_call(['sudo', '/pfad_zu/raspberry-remote/send', '00100', '1', '1'])
Antworten