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!
ttk.Button reagiert nicht
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
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]
- __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.
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
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.
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.
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.
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.
- __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:

Ansonsten kann man das ja auch von Thonny aus direkt in einem Terminalfenster starten, entweder aus dem Menü oder über die zugeordnete Tastenkombination.

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
- __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