ttk.Button reagiert nicht

Fragen zu Tkinter.
Antworten
Oldie59
User
Beiträge: 4
Registriert: Mittwoch 3. September 2025, 11:20

Hallo,

ich benutze tkinter erst seit Kurzem und habe mir dazu auf Youtube einige Videos angesehen. Für meine Anwendung möchte ich mir nun eine eigene GUI bauen. Ich scheitere aber schon bei einem tkk.Button (das Erstellen eines Labels funktioniert einwandfrei). Der Button wird zwar auf der Oberfläche dargestellt, reagiert aber nicht auf das Anklicken (keine print-Ausgabe in der shell).
Auch das Argument 'padding' funktioniert nicht wie erwartet: es wird nicht der Abstand zum Fensterrand eingestellt, sondern der Button vergrössert sich in x und y.
Meine Anwendung läuft auf einem Raspberry Pi4 und Thonny.
Kann mir jemand einen Tipp geben, woran das liegen kann?

Mein Code:
import tkinter as tk
from tkinter import ttk
root = tk.TK()
root.geomentry("400x400")

def button_pressed():
print("gedrückt")

mybutton = ttk.Button(root, state="normal",text="Testbutton",command=button_pressed)
mybutton.pack()
root.mainloop()

Vielen Dank für die Hilfe im Voraus!
Benutzeravatar
Dennis89
User
Beiträge: 1592
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

kopiere mal direkt den Code, den du ausführst hier ins Forum. Am besten noch in Code-Tags (siehe vollständiger Editor). So läuft er Code nämlich gar nicht. Wenn man dann `Tk` und `geometry` schreibt, dann läuft er und macht auch was du erwartest.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
__blackjack__
User
Beiträge: 14131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Oldie59: Quelltext bitte in Code-Tags setzen, damit die Einrückung erhalten bleibt. Das ist im vollständigen Editor die Schaltfläche mit der Aufschrift „</>“.

Zu `padding` steht in der Dokumentation „Specify the element’s interior padding.“ (Hervorhebung von mir). Du suchst wahrscheinlich `margin`: „Specifies the elements exterior padding.“

Auf Modulebene sollte nur Code stehen, der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst. Besonders unübersichtlich wird es wenn man Hauptprogramm und Funktions-/Klassendefinitionen vermischt.

Wenn es im `tkinter`-Modul eine Konstante für Zeichenketten mit einer besonderen Bedeutung als Argument gibt, sollte man die verwenden. Dann bekommt man Tippfehler um die Ohren gehauen und der Leser weiss, dass das nicht irgendeine beliebige Zeichenkette ist an der Stelle. Also hier ``tk.NORMAL`` statt ``"normal"``. Allerdings braucht man dieses Argument nicht wirklich denn NORMAL ist der Normalzustand den man bekommt wenn man kein `state` angibt.

Die Vorsilbe `my` macht in 99,99% der Fälle keinen Sinn. Wenn es nicht auch einen `our_button` oder `their_button` gibt, von dem man `my_button` abgrenzen muss, ist das einfach nur `button`. Falls man das Objekt danach nicht mehr benötigt, kann man auch einfach gar keinen Namen vergeben.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from tkinter import ttk


def on_button_press():
    print("gedrückt")


def main():
    root = tk.Tk()
    root.geometry("400x400")

    ttk.Button(root, text="Testbutton", command=on_button_press).pack()

    root.mainloop()


if __name__ == "__main__":
    main()
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Oldie59
User
Beiträge: 4
Registriert: Mittwoch 3. September 2025, 11:20

Hallo blackjack,

habe den Code jetzt nochmal neu genauso geschrieben, wie oben. Einrückung 4 Leerzeichen, keine Tabs. Ich sehe den button, aber er hat nach wie vor keine Reaktion. Ich kann mit der Tab-Taste den Fokus auf den Button setzen, aber auf ein Mausklick reagiert er trotzdem nicht.
Habe auch schon eine andere Maus an einem anderen USB-Anschluss des RPi4 angeschlossen. Bringt aber leider auch nichts. Bin jetzt ziemlich ratlos.

Deinen Hinweis mit mit dem Inhalt im Modul werde ich berücksichtigen, habe gerade erst mit Python/tkinter angefangen.
Sirius3
User
Beiträge: 18297
Registriert: Sonntag 21. Oktober 2012, 17:20

Startest du das Programm aus irgendeiner IDE heraus? wenn Ja versuche es mal direkt über die Konsole.
Oldie59
User
Beiträge: 4
Registriert: Mittwoch 3. September 2025, 11:20

Hallo,

ein erster Erfolg! Normalerweise starte ich ein Python-Programm immer in Thonny mit dem RUN-Button. Und da funktioniert der ttk-Button nicht. Wenn ich meine GUI in der Raspberry-Konsole starte, funktioniert der Button-Klick. Mit jedem Klick wird, wie erwartet, in einer neuen Zeile der Text "gedrückt" ausgegeben.
Grundsätzlich könnte ich damit leben. Anwenderfreundlicher wäre für mich natürlich, wenn ich die Datei aus Thonny heraus starten könnte.
Benutzeravatar
__blackjack__
User
Beiträge: 14131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Also bei mir funktioniert das in Thonny. Der Text erscheint dort in der Shell:
Bild

Ansonsten kann man das ja auch von Thonny aus direkt in einem Terminalfenster starten, entweder aus dem Menü oder über die zugeordnete Tastenkombination.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Oldie59
User
Beiträge: 4
Registriert: Mittwoch 3. September 2025, 11:20

Hallo,

ich habe jetzt Thonny auf meinem Windows-Rechner installiert und damit funktioniert der Button-Klick. Liegt die Ursache nun an meinem Raspberry?
Benutzeravatar
__blackjack__
User
Beiträge: 14131
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Oldie59: Wohl eher nicht, ich habe das Bildschirmfoto auf einem Linuxrechner gemacht.
“It is easier to change the specification to fit the program than vice versa.” — Alan J. Perlis
Antworten