onClick function to substract a value

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

Hi zusammen,

ich bin neu in python und habe etwas mit tkinter "herumgespielt".
Hab mit einem einfachen Button und einem Label angefangen, das erzeugen geht wirklich einfach und schnell.

Kann mir jemand bei etwas wirklich einfachem evtl. bitte weiterhelfen?

Zwar geht es darum, wenn ich meinen Button "Click Me" drücke, mein Wert im Label um eine beliebige Zahl bspw. 20 verkleinert wird.
Sprich am Anfang zeigt mein Label 100 an, ich drücke den Button, dann änder sich das Label auf 80.

Bin über jede/n Hilfe/Tipp dankbar!

Code: Alles auswählen


from tkinter import *

#variables
a = 100

# create root widget
root = Tk()

# set value of a to b
b = IntVar(root, value=a)

# define  button
button_1 = Button(root, text="Click Me", padx=40, pady=20, command=lambda: onclick())

# define label
start_value = Label(root, textvariable=b)

# positioning button
button_1.grid(row=1, column=0)

#positioning label
start_value.grid(row=2, column=0)

# define what happens when button is clicked
def onclick():
    a = a-20

# main loop for the root-window
root.mainloop()

Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Am besten hättest Du auch gleich den Fehler posten können, den Du bekommst.
*-Importe sind schlecht, weil nicht nachvollzogen werden kann, woher welcher Name kommt.
Alles was eine Funktion braucht, muß sie auch über ihre Parameter bekommen, bei Dir ist das das `b`, das ja die Zahl in Deinem Label enthält.
Variablen sollten aussagekräftig sein, irgendwo eine _1 anzuhängen ist nicht hilfreich.
Es fehlt eine main-Funktion, um das Programm testbar zu machen und globale Variablen zu verhindern.

Code: Alles auswählen

import tkinter as tk
from functools import partial

def onclick(number):
    number.set(number.get() - 20)

def main():
    root = tk.Tk()
    number = tk.IntVar(root, value=100)
    tk.Button(root,
        text="Click Me", padx=40, pady=20,
        command=partial(onclick, number)
    ).grid(row=1, column=0)
    tk.Label(root, textvariable=number).grid(row=2, column=0)
    root.mainloop()

if __name__ == '__main__':
    main()
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Hi @Sirius3
Sorry, nächstes mal poste ich direkt den Fehler.
Das mit den Variablen muss ich mir direkt umgewöhnen, wollte es nur in einem kleinen Bsp. zeigen, aber wahrscheinlich besser wenn man sich immer daran hält.
Danke für die schnelle Hilfe, ich werde es mir gleich mal anschauen und probieren auf einen anderes Projekt zu übernehmen.
Danke und Grüße
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Hi nochmal,
hättest du eine Idee wie ich mit einem anderen Button sagen kann, dass er den nächsten gedrückten Button beispielsweise verdoppelt? Also ich drücke Button "Verdopple den nächsten Button", dann passiert erstmal nichts und wenn ich dann Button "Click me" drücke, werden in dem Beispiel hier 40 abgezogen? :P

Code: Alles auswählen

import tkinter as tk
from functools import partial

def onclick(number):
    number.set(number.get() - 20)

def main():
    root = tk.Tk()
    number = tk.IntVar(root, value=100)
    tk.Button(root,
        text="Click Me", padx=40, pady=20,
        command=partial(onclick, number)
    ).grid(row=1, column=0)
    tk.Button(root,
        text="Verdopple den nächsten Button", padx=40, pady=20
    ).grid(row=1, column=1)
    tk.Label(root, textvariable=number).grid(row=2, column=0)
    root.mainloop()

if __name__ == '__main__':
    main()

Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Du mußt Dir irgendwie den Zustand "verdopple" merken. Das geht am besten, wenn Du eine Klasse definierst, die Dein Fenster repräsentiert mit einem passenden Attribut und die onclick-Funktionen als Methoden definierst.
python95
User
Beiträge: 22
Registriert: Dienstag 26. April 2016, 14:30

Okay, dann werde ich es Mal mit einer Klasse versuchen.
Danke für den schnellen Tipp!
Antworten