Zweimaliges Verwenden von next (counter)

Fragen zu Tkinter.
Antworten
Benutzeravatar
ixaM
User
Beiträge: 13
Registriert: Samstag 9. Juli 2016, 15:32
Wohnort: Nähe München

Ich bin dumm.

Ich komme mal wieder nicht weiter... Ich wollte jetzt noch einen zweiten Button einführen, der die vorhergegangene Zahl anzeigt. Dafür habe ich aber keinen Command gefunden, deswegen habe ich es mit (next (counter) - 2) versucht, was theoretisch ja dasselbe Ergebnis haben sollte. Hat aber leider nicht ganz so geklappt, wie ich mir das vorgestellt habe...

Aber seht selbst...

Code: Alles auswählen

import tkinter as tk
from functools import partial
from itertools import count
 
 
def recruit_more_archer(button, counter):
    button["text"] = recruit_archer = next(counter)

def recruit_less_archer(button, counter):
    if (next (counter) - 2) > 0:
        button["text"] = (next (counter) - 2)
def main():
    root = tk.Tk()
    counter = count()
    more_archer_button = tk.Button(root, text=next (counter))
    more_archer_button['command'] = partial(recruit_more_archer, more_archer_button, counter)
    more_archer_button.pack()
    less_archer_button = tk.Button(root, text=(next (counter)-1))
    less_archer_button['command'] = partial(recruit_less_archer, less_archer_button, counter)
    less_archer_button.pack()
    tk.Canvas(
        root, width=1000, height=0, background="white"
    ).pack(side=tk.LEFT)
    root.mainloop()
 
 
if __name__ == '__main__':
    main()
Danke im Vorraus für Hilfe!
Zuletzt geändert von Anonymous am Dienstag 20. September 2016, 18:07, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Codebox-Tags gesetzt.
Sirius3
User
Beiträge: 17748
Registriert: Sonntag 21. Oktober 2012, 17:20

@ixaM: für das, was Du machen willst, ist ein Counter dann nicht geeignet.
BlackJack

@ixaM: `counter` ist ein Iterator über Zahlen. Jeder `next()`-Aufruf liefert die nächste Zahl vom Iterator, das heisst wenn Du ``next(counter)`` aufrufst, dann wird der interne Zähler erhöht. Um die ”vorhergehende Zahl” anzuzeigen verbrauchst Du also ein weiteres Element.

Mir ist nicht so ganz klar was Du da letztendlich machen willst. Wenn Du eine Anzahl mit zwei Schaltflächen erhöhen beziehungsweise verringern möchtest, dann nützt `itertools.count` nichts. Dann müsstest Du zum Beispiel ein Label für die Anzeige verwenden und ein `Tkinter.IntVar` für die Datenhaltung. Oder anstelle eines Labels auch ein `Entry` verbunden mit einem `IntVar`, damit der Benutzer wenn er 100 eingeben möchte, nicht tatsächlich 100× auf die [+]-Schaltfläche klicken muss, sondern die Zahl auch per Hand eingeben kann.

Warum setzt Du zwischen `next` und der Klammer des Funktionsaufrufs ein Leerzeichen? Das sieht komisch aus.
Benutzeravatar
ixaM
User
Beiträge: 13
Registriert: Samstag 9. Juli 2016, 15:32
Wohnort: Nähe München

@BlackJack

Hmm... Also das Endergebnis sollte in Etwa so aussehen:

Button 1 (verringert x um 1), hat bestenfalls gar keinen Text. Momentan ist er testweise noch drinne
Button 2 zeigt x
Button 3 erhöht x um 1, hat am Ende auch keinen Text
BlackJack

@ixaM: Ich hab's doch eigentlich alles schon beschrieben. Du müsstest ein `IntVar`-Objekt als Datenhaltung und Quelle für den Text in der mittleren Schaltfläche verwenden:

Code: Alles auswählen

from functools import partial
import tkinter as tk
 
 
def change_value(variable, amount):
    variable.set(variable.get() + amount)
 

def main():
    root = tk.Tk()
    variable = tk.IntVar(root)

    tk.Button(root, text='+', command=partial(change_value, variable, 1)).pack()
    tk.Button(root, textvariable=variable).pack()
    tk.Button(root, text='-', command=partial(change_value, variable, -1)).pack()

    tk.Canvas(root, width=1000, height=0, background='white').pack(side=tk.LEFT)
    root.mainloop()
 
 
if __name__ == '__main__':
    main()
Antworten