Seite 1 von 1

Klick auf den Button der Wert wird um 1 erhöht

Verfasst: Samstag 30. Januar 2021, 13:12
von michi-monster
Hallo, ich bin Python Anfängerin. Ich überlege wie ich es hinbekomme etwas immer wieder bei einem Klick auf einen Button ausführen kann. Es soll jedes Mal beim Klick auf den Button der Wert um 1 erhöht werden.

Code: Alles auswählen

import tkinter as tk
from tkinter import *


def einlesen():
        print  (eingabe.get())
def ausgabe():
        print("Masche wurde hinzugefügt")
                        

def aktionSF():
        label = tk.Label(window, text="Masche wurde hinzugeügt", bg="yellow")
        beginn=int(eingabefeld.get())
        maschen=beginn+1
        label=tk.Label(window,text=maschen)
        label.pack()

window = tk.Tk()
window.geometry('400x200')
window.title("Maschenzähler")

label = tk.Label(window, fg="red")
label.pack(expand=1)

w = Label(window, text="Willkommen zum Maschenzaehler,\n bitte die Maschenzahl zu Beginn eingeben")
w.pack()

#bild1 = tk.PhotoImage(file="kuscheltiere.png")
#label2 = tk.Label(root, image=bild1).pack(side="right")


button=Button(window, text="+ 1 Masche", width=10, height=2, command=aktionSF)
button.pack(side='bottom')
button=Button(window,text='EXIT',width=10,height=2, command=window.destroy)
button.pack(side='bottom')
print ("Biite die Maschenzahl zu Beginn eingeben")
eingabefeld=Entry() #Erzeugt ein Eingabefenster
eingabefeld.pack()

window.mainloop()


Re: Klick auf den Button der Wert wird um 1 erhöht

Verfasst: Samstag 30. Januar 2021, 13:42
von __deets__
Wenn man so etwas machen will, muss man auf objektorientierte Programmierung setzen. Und bei Eingaben empfiehlt sich die *Var-objekte von tkinter zu benutzen:

Code: Alles auswählen

import tkinter as tk


class Maschenzaehler:

    def __init__(self):
        self._maschen = 0

    def hochzaehlen(self, beginn):
        self._maschen = beginn + 1
        return self._maschen


def main():
    maschen_zaehler = Maschenzaehler()

    window = tk.Tk()
    beginn = tk.IntVar(0)
    eingabefeld = tk.Entry(window, textvariable=beginn)
    eingabefeld.pack()

    maschen = tk.IntVar(0)
    maschen_label = tk.Label(window, textvariable=maschen)
    maschen_label.pack()

    def hochzaehlen_callback():
        neue_maschen_anzahl = maschen_zaehler.hochzaehlen(beginn.get())
        maschen.set(neue_maschen_anzahl)

    button = tk.Button(
        window,
        text="+ 1 Masche",
        width=10,
        height=2,
        command=hochzaehlen_callback
    )
    button.pack(side='bottom')
    window.mainloop()


if __name__ == '__main__':
    main()
Und zu guter letzt: in deinem Code finden sich eine Meeeeng Dinge, die man unterlassen sollte. Sternchenimporte, dynamisch erzeugte Labels, feste Aufloesungen. Such mal ein paar Posts von __blackjack__, der erklaert ja regelmaessig, was man so falsch machen kann.

Re: Klick auf den Button der Wert wird um 1 erhöht

Verfasst: Samstag 30. Januar 2021, 14:14
von Sirius3
@__deets__: die Klasse ist total überflüssig, weil das einzige, was die Klasse tut, ist einen übergebenen Wert um 1 zu erhöhen.
Dagegen fehlt bei hochzaehlen_callback alle Argumente. Man verschachtelt keine Funktionen in anderen Funktionen.

Code: Alles auswählen

import tkinter as tk
from functools import partial

def hochzaehlen_callback(beginn, maschen):
    neue_maschen_anzahl = beginn.get() + 1
    maschen.set(neue_maschen_anzahl)


def main():
    window = tk.Tk()
    beginn = tk.IntVar(0)
    eingabefeld = tk.Entry(window, textvariable=beginn)
    eingabefeld.pack()

    maschen = tk.IntVar(0)
    maschen_label = tk.Label(window, textvariable=maschen)
    maschen_label.pack()

    button = tk.Button(
        window,
        text="+ 1 Masche",
        width=10,
        height=2,
        command=partial(hochzaehlen_callback, beginn, maschen)
    )
    button.pack(side='bottom')
    window.mainloop()


if __name__ == '__main__':
    main()
Aber ich glaube, es sind gar nicht zwei Variablen nötig:

Code: Alles auswählen

import tkinter as tk
from functools import partial

def hochzaehlen_callback(maschen):
    maschen.set(maschen.get() + 1)

def main():
    window = tk.Tk()
    maschen = tk.IntVar(0)
    eingabefeld = tk.Entry(window, textvariable=maschen)
    eingabefeld.pack()

    tk.Button(
        window,
        text="+ 1 Masche",
        width=10,
        height=2,
        command=partial(hochzaehlen_callback, maschen)
    ).pack(side='bottom')
    window.mainloop()


if __name__ == '__main__':
    main()

Re: Klick auf den Button der Wert wird um 1 erhöht

Verfasst: Samstag 30. Januar 2021, 14:36
von __deets__
Mit ist klar, das meine Klasse nicht viel mehr macht, als eine IntVar schon tut. Ich denke aber es ist besser, sich für die Modellierung der Anwendungslogik genau nicht auf tkinter-Objekte zu verlassen. Und ein Vorgehen zu illustrieren, das auch Skalierbarer ist. Auch wenn der momentane Zustand das Strenggenommen nicht rechtfertigt.

Und ich mag closures. Wenn der einzige Zweck einer freistehenden Funktion darin besteht, mit Partial zusammen GUI-Code zu verkleben, ist das kein Gewinn zb für Testbarkeit. Darum stimme ich dir da nicht zu.