wie kann ich das so programmieren, damit das befehle ausführt?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Pineapple.x16
User
Beiträge: 38
Registriert: Donnerstag 4. Juni 2020, 20:55

Freitag 19. März 2021, 20:15

Code: Alles auswählen

import random
from tkinter import *

def zuruecksetzen():
    checkbutton0.config(state='active')
    checkbutton1.config(state='active')
    checkbutton2.config(state='active')
    checkbutton3.config(state='active')
    checkbutton4.config(state='active')
    labelW1.config(text=str(random.randint(1,6)))
    labelW2.config(text=str(random.randint(1,6)))
    labelW3.config(text=str(random.randint(1,6)))
    labelW4.config(text=str(random.randint(1,6)))
    labelW5.config(text=str(random.randint(1,6)))
    labelWurf.config(text="1. Wurf")
    labelAuswertung.config(text=" ")
    labelEintragen.config(text=" ")
    summieren()

def auswahlClick():
    pass

def buttonWuerfelnClick():
    pass

def buttonFertigClick():
    pass


# Fenster
tkFenster = Tk()
tkFenster.title('Kniffel')
tkFenster.geometry('220x390')

# Frames
frameWuerfel = Frame(master=tkFenster, bg="white")
frameWuerfel.place(x=10, y=10, width=210, height=80)
frameAuswahl = Frame(master=tkFenster, bg="white")
frameAuswahl.place(x=10, y=100, width=210, height=170)
frameAuswertung = Frame(master=tkFenster, bg="white")
frameAuswertung.place(x=10, y=280, width=210, height=100)


# Label
labelWurf = Label (master=frameWuerfel, text="1. Wurf")
labelWurf.place(x=10, y=10, width=100, height=20)
labelW1 = Label(master=frameWuerfel, bg="gray", text=str(random.randint(1,6)))
labelW1.place(x=10, y=40, width=30, height=30)
labelW2 = Label(master=frameWuerfel, bg="gray", text=str(random.randint(1,6)))
labelW2.place(x=50, y=40, width=30, height=30)
labelW3 = Label(master=frameWuerfel, bg="gray", text=str(random.randint(1,6)))
labelW3.place(x=90, y=40, width=30, height=30)
labelW4 = Label(master=frameWuerfel, bg="gray", text=str(random.randint(1,6)))
labelW4.place(x=130, y=40, width=30, height=30)
labelW5 = Label(master=frameWuerfel, bg="gray", text=str(random.randint(1,6)))
labelW5.place(x=170, y=40, width=30, height=30)

labelFrage = Label (master=frameAuswahl, text="Welche Würfel sollen\n neu gewürfelt werden?")
labelFrage.place(x=10, y=10, width=190, height=50)

labelErgebnis = Label(master=frameAuswertung, text="Würfelergebnis:")
labelErgebnis.place(x=10, y=10, width=190, height=20)
labelAuswertung = Label(master=frameAuswertung, text="")
labelAuswertung.place(x=10, y=30, width=190, height=20)
labelEintragen = Label(master=frameAuswertung, text="")
labelEintragen.place(x=10, y=50, width=190, height=40)



# Kontrollvariablen
wert0 = IntVar()
wert1 = IntVar()
wert2 = IntVar()
wert3 = IntVar()
wert4 = IntVar()

# Checkbutton
checkbutton0 = Checkbutton(master=frameAuswahl, bg="white", anchor='w', offvalue=0, onvalue=1, variable=wert0, command=auswahlClick)
checkbutton0.place(x=15, y=65, width=20, height=20)
checkbutton1 = Checkbutton(master=frameAuswahl, bg="white", anchor='w', offvalue=0, onvalue=1, variable=wert1, command=auswahlClick)
checkbutton1.place(x=55, y=65, width=20, height=20)
checkbutton2 = Checkbutton(master=frameAuswahl, bg="white", anchor='w', offvalue=0, onvalue=1, variable=wert2, command=auswahlClick)
checkbutton2.place(x=95, y=65, width=20, height=20)
checkbutton3 = Checkbutton(master=frameAuswahl, bg="white", anchor='w', offvalue=0, onvalue=1, variable=wert3, command=auswahlClick)
checkbutton3.place(x=135, y=65, width=20, height=20)
checkbutton4 = Checkbutton(master=frameAuswahl, bg="white", anchor='w', offvalue=0, onvalue=1, variable=wert4, command=auswahlClick)
checkbutton4.place(x=175, y=65, width=20, height=20)

# Button
buttonWuerfeln = Button (master=frameAuswahl, text="neu würfeln", command=buttonWuerfelnClick, state='disabled')
buttonWuerfeln.place(x=10, y=95, width=190, height=30)
buttonFertig = Button (master=frameAuswahl, text="fertig", command=buttonFertigClick)
buttonFertig.place(x=10, y=130, width=190, height=30)

# Aktivierung des Fensters
tkFenster.mainloop()



wie kann ich folgendes bei der Oberfläche ausführen, damit das Programm auch läuft
- Der Spieler wählt die Checkbuttons aller Würfel aus, mit denen er noch einmal würfeln möchte. Dadurch wird der Button "neu würfeln" aktiviert.
- Verwendet der Spieler den Button "neu würfeln",
- verändert sich das Label ganz oben zu "2. Wurf" (bzw. "3. Wurf").
- erscheinen für die ausgewählte Würfel neue Zufallszahlen, wird der Button "neu würfeln" wieder deaktivert und können im nächsten Wurf nur noch die Würfel ausgewählt werden, die im vorherigen Wurf neu gewürfelt wurden.
- Nach dem dritten Wurf können weder die Checkbuttons noch "neu würfeln" angeklickt werden.
- Der Button "fertig" und das untere Label bleiben erstmal ohne Funktion.
Sirius3
User
Beiträge: 14759
Registriert: Sonntag 21. Oktober 2012, 17:20

Samstag 20. März 2021, 18:25

Jedes nicht-triviale GUI-Programm braucht Klassendefinitionen. Du mußt Dir ja den Zustand, welche Würfel fix sind und welche Runde Du hast, etc.
Und wie schon in Deinem anderen Thread geschrieben, schreibt keinen Code, indem Du Zeilen kopierst, sondern nutze passende Datenstrukturen, hier also eine Liste für die 5 Würfel.
Benutzeravatar
__blackjack__
User
Beiträge: 8823
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Samstag 20. März 2021, 22:39

@Pineapple.x16: Sternchen-Importe sind Böse™. Da holt man sich gerade bei `tkinter` fast 200 Namen ins Modul von denen nur ein kleiner Bruchteil verwendet wird. Auch Namen die gar nicht in `tkinter` definiert werden, sondern ihrerseits von woanders importiert werden. Das macht Programme unnötig unübersichtlicher und fehleranfälliger und es besteht die Gefahr von Namenskollisionen.

Auf Modulebene sollte nur Code stehen der Konstanten, Funktionen, und Klassen definiert. Das Hauptprogramm steht üblicherweise in einer Funktion die `main()` heisst.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (PascalCase).

Namen sollte man auch nicht schreiben wie Yoda spricht. Ein Rahmenwürfel ist etwas anderes als ein Würfelrahmen.

Das gruppieren der Objekte nach Typ ist unsinnig und macht es schwerer vom Code aus zu verstehen wie die GUI am Ende aussieht. *Daran* sollte sich die Reihenfolge im Code orientieren.

Verwende kein `place()` und keine Vorgabe der Fenstergrösse. Das funktioniert nicht wirklich. Das mag bei Dir richtig aussehen, aber auf Systemen mit anderen Bildschirmgrössen/-auflösungen, Schriftarten/-einstellungen, kann das komisch bis falsch aussehen und sogar unbenutzbar werden wenn sich Elemente überlappen und nicht mehr vollständig angezeigt werden.

Beim ersten Argument beim erstellen von Widgets braucht man den Namen nicht explizit angeben, das ist immer das `master`-Argument.

Den Würfel samt Checkbox würde man besser zu einem Objekt zusammenfassen, anstatt parallele Listen mit jeweils dem `Label`, `BooleanVar`, und `Checkbox` für jeden Würfel zu führen.

Mal so als Anfang.
Q: What is the volume of a pizza of radius z and thickness a?
A: pi·z·z·a
Antworten