Mit Button Aktion wiederholen lassen

Fragen zu Tkinter.
Antworten
jannikjunior
User
Beiträge: 8
Registriert: Samstag 14. März 2020, 20:53

Hi,
Ich habe gerade erst angefangen Python zu lernen und habe einen Lotto Simulator programmiert. Ich möchte gerne, dass wenn ich einen Button drücke, dass er neue Lottozahlen auslost.

Geht das irgendwie?

Schon mal danke für die Antworten.

LG
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Klar geht das.
Womit hast du denn Schwierigkeiten?
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Was hast Du schon probiert? Zeige Deinen Code und wo Du nicht weiter kommst.
jannikjunior
User
Beiträge: 8
Registriert: Samstag 14. März 2020, 20:53

Code: Alles auswählen

import random
from tkinter import *

def button_action():
    ????? 
   
fenster = Tk()
fenster.title("Lotto")

lottozahlen_alle = []
lottozahlen_alle.extend(range(1,50))

lottozahlen_richtig = random.sample(lottozahlen_alle, 6)
lottozahlen_richtig.sort()

button1 = Button(fenster, text = "neue Zahlen", command=button_action)

label1 = Label(fenster, text = lottozahlen_richtig) 

label1.pack()
button1.pack()
Ich weiß nicht wie ich die button_action definieren soll um die lottozahlen_richtig neu zu losen
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst zwei Sachen machen:

- die gesamte Berechnung der 6 aus 49 gehört IN die button action.
- die button action muss das Label kennen, damit sie dessen Text mit der configure-Methode neu setzen kann. Das kann man zb mit einem lambda oder der Verwendung von functools.partial erreichen.

Code: Alles auswählen

def action(label):
    ...

label = ...
button.configure(command=lambda: action(label))
jannikjunior
User
Beiträge: 8
Registriert: Samstag 14. März 2020, 20:53

Kann sein, dass ich blöd bin, aber ich checks nicht ganz

Code: Alles auswählen

import random
from tkinter import *

fenster = Tk()
fenster.title("Lotto")

lottozahlen_alle = []
lottozahlen_alle.extend(range(1,50))

lottozahlen_richtig = random.sample(lottozahlen_alle, 6)
lottozahlen_richtig.sort()

label1 = Label(fenster, text = lottozahlen_richtig)

def button_action(label1):
    lottozahlen_richtig = random.sample(lottozahlen_alle, 6)
    lottozahlen_richtig.sort()

button1 = Button(fenster, text = "neue Zahlen", command=button_action(label1))
button1.configure(command=lambda: button_action(label1))


label1.pack()
button1.pack()
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Da fehlt noch das setzen der errechnet werdet mit label1.configure.
jannikjunior
User
Beiträge: 8
Registriert: Samstag 14. März 2020, 20:53

In der Button Action?
Und was muss ins configure rein?
Benutzeravatar
sparrow
User
Beiträge: 4540
Registriert: Freitag 17. April 2009, 10:28

Das, was _in_ der Funktion steht, wird ausgeführt, wenn der Button gedrückt wird.
Also musst du darin auch den Code schreiben, der den Text auf dem Label ändert, sonst nützt das erzeugen der neuen Zahlen ja nichts, weil sie nirgends angezeigt werden.
Deshalb hat __deets__ dir gezeigt, wie du die Instanz des Labels an die Funktion übergibst.

Nun musst du in der Funktion den Text des Labels ändern.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Natuerlich in der Button-action, das ist doch der Moment, in dem du neue Ergebnisse hast. Und der configure-Aufruf ist gut beschrieben in der Dokumentaton. Damit kannst du Eigenschaften einens Widgets nachtraeglich aendern, unter anderem *trommelwirbel* den Text.
jannikjunior
User
Beiträge: 8
Registriert: Samstag 14. März 2020, 20:53

Also label1.configure(fenster, text = lottozahlen_richtig)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Jein. Warum denkst du kommt da fenster zu Beginn? Das ist das umliegende Widget, und wird nur gebraucht, wenn man das Label *anlegt*.
jannikjunior
User
Beiträge: 8
Registriert: Samstag 14. März 2020, 20:53

Danke Danke klappt endlich
Antworten