Button function to Double value and UNDO

Fragen zu Tkinter.
Antworten
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Hallo zusammen,

ich hab hier ein kleines einfaches Programm, welches eine Zahl anzeigt und beim Klicken der Buttons 1-3 der entsprechende Wert abgezogen wird.
Das funktioniert aktuell auch problemlos. Button 4 und Button 5 sind aktuell ohne Funktion.

Code: Alles auswählen


import tkinter as tk
from functools import partial
#Create Window
app = tk.Tk()
#Create Start Number
Zahl = tk.Label(app, text="50",font="Verdana 20 bold")
def change_zahl(num):
    counter = int(str(Zahl['text']))
    counter -=num
    Zahl.config(text=str(counter))
#Create Buttons and pack them(Button4 and Button 5 do nothing till now :(
Button1 = tk.Button(app, text="-1", command=partial(change_zahl, 1)).pack()
Button2 = tk.Button(app, text="-2", command=partial(change_zahl, 2)).pack()
Button3 = tk.Button(app, text="-3", command=partial(change_zahl, 3)).pack()
Button4 = tk.Button(app, text="double next pressed button").pack()
Button5 = tk.Button(app, text="UNDO action from last pressed button").pack()
#Pack Start Number
Zahl.pack()
#mainloop
app.mainloop()

Mir fehlt eine Funktion für Button 4, die wenn ich Button 4 drücke, die Ausführung des nächsten gedrückten Buttons(1-3) verdoppelt.
Ich hab es mit Checkboxen umständlich hinbekommen, die gefallen mir aber nicht und habs mit image import für die checkbox auch nicht hinbekommen.

Außerdem bräuchte ich noch eine Funktion für Button5, die das ausgeführte, egal von welchem zuvor gedrückten Button, wieder rückgängig macht.

Freue mich über Tipps/Lösungsvorschläge.
Danke und Grüße :geek:
Benutzeravatar
__blackjack__
User
Beiträge: 14085
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@python95: Eine Klasse für den Zustand wurde Dir doch schon im letzten Thema von Dir nahegelegt.

Der Wert sollte nicht im `Label` gespeichert sein. Das ist zum Anzeigen, nicht das man da Zahlen als Zeichenketten raus holt, in Zahlen umwandelt, damit rechnet, um es dann wieder als Zeichenkette in das Label zu stecken.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase). Man nummeriert keine Namen. Es macht auch so gar keinen Sinn an `Button1` bis `button4` den Wert `None` zu binden. Das ist der Rückgabewert von `pack()`.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein Weg undo umzusetzen besteht darin, sich alle vorherigen Berechnungen in einer Liste zu merken. Und dann beim Druck auf den Knopf den letzten Wert mit pop zu entfernen, und den davor wieder als den aktuellen zu setzen.
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Danke für die Tipps und HIlfe. Hab in einem anderen Forum ein Bsp. mit den genannten Tipps bekommen.
import tkinter as tk
from functools import partial

history = [] # store history values

def change_zahl(num):
if double_var.get():
num += num
val = counter.get()
counter.set(val-num)
history.append(val) # store last value to history

def undo():
if history:
val = history.pop()
counter.set(val)

app = tk.Tk()

tk.Button(app, text="-1", command=partial(change_zahl, 1)).pack()
tk.Button(app, text="-2", command=partial(change_zahl, 2)).pack()
tk.Button(app, text="-3", command=partial(change_zahl, 3)).pack()
double_var = tk.BooleanVar()
tk.Checkbutton(app, text="Double", variable=double_var, indicator=0).pack()
tk.Button(app, text="Undo", command=undo).pack()

counter = tk.IntVar(value=50)
Zahl = tk.Label(app, textvariable=counter, font="Verdana 20 bold")
Zahl.pack()

app.mainloop()
Das mit der Namensgebung werde ich mir merken und hoffentlich umsetzen, damit es nicht mehr so chaotisch aussieht.
Das mit dem Undo und der Liste wurde ja genau so hier vorgeschlagen
Danke!
Antworten