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

Fragen zu Tkinter.
Antworten
Benutzeravatar
michi-monster
User
Beiträge: 48
Registriert: Donnerstag 7. Dezember 2017, 18:30
Kontaktdaten:

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()

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 17822
Registriert: Sonntag 21. Oktober 2012, 17:20

@__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()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Antworten