Seite 1 von 1

Durch Knopfdruck Zufallswert aus Tabelle auswählen

Verfasst: Montag 20. April 2020, 17:42
von Benutzer_Simon
Hallo zusammen,
ich bin im Bereich Python noch relativ neu und würde mich freuen wenn ihr mir bei meinem Problem behilflich sein könntet.
Ich habe geplant ein kleines Programm mit Tkinter als Benutzeroberfläche zu schreiben um einmal ein grundlegendes Verständnis davon zu bekommen wie man Code schreibt und um meine Zeit produktiv zu nutzen.
Im großen und ganzen geht es darum, dass bei jedem Betätigen eines 'Buttons' eine neue Karte aus meiner Liste mit 52 Pokerkarten zufällig ausgewählt, und auf einem der Labels ausgegeben wird.
Es gibt 3 'Buttons' die jeweils einen Wert von +0, +1 und -1 haben. Dieser Wert wird bei jedem Betätigen des Buttons auf einem der Labels, mit den vorausgegangenen Werten entweder addiert oder subtrahiert, und ausgegeben.
Mein ,,einziges" Problem das ich habe ist, dass eine Karte zwar zufällig ausgegeben wird, dies allerdings nur ein einziges Mal wenn das Programm gestartet wird.
Könnte mir vielleicht jemand eine kleines Stück Code schicken, welches eben beschriebenes Problem löst?
Vielen Dank im voraus!

Re: Durch Knopfdruck Zufallswert aus Tabelle auswählen

Verfasst: Montag 20. April 2020, 17:48
von __deets__
Bitte zeig den Code, den du schon hast. Dabei die Code-Tags (</>-Knopf im vollstaendigen Editor) nicht vergessen.

Re: Durch Knopfdruck Zufallswert aus Tabelle auswählen

Verfasst: Montag 20. April 2020, 20:44
von Benutzer_Simon

Code: Alles auswählen

from tkinter import *
import random

root = Tk()
Zählerstand = 0

Zähler = Label(root, bg='black', fg='white', text="0", font=('Arial', 20, 'bold'), width=6, height=1)
Zähler.place(x=200, y=20)

#Create functions
def Minus():
    global Zählerstand
    Zählerstand -= 1
    Zähler.config(text=str(Zählerstand))

def Plus():
    global Zählerstand
    Zählerstand += 1
    Zähler.config(text=str(Zählerstand))

#Randomice cards
Card_Value = ['Ace', 'King', 'Queen', 'Jack', 'Ten', 'Nine', 'Eight', 'Seven', 'Six', 'Five', 'Four', 'Three', 'Two']
Card_Type = ['Hearts', 'Clubs', 'Spades', 'Diamonds']
Random_Value = random.choice(Card_Value)
Random_Type = random.choice(Card_Type)
Random_Card = Random_Value + ' of ' + Random_Type

#Define Labels and Buttons
LabelCard = Label(root, text=str(Random_Card), font=('Arial', 15), width=12, height=2, bg='black', fg='white')
LabelCard.pack()

Button_Plus = Button(root, bg='#999999', text="+ 1", font=('Arial', 12, 'bold'), command=Plus)
Button_Plus.pack()

Button_Minus = Button(root, bg='#999999', text="-1", font=('Arial', 12, 'bold'), command=Minus)
Button_Minus.pack()

Button_Zero = Button(root, bg='#999999', text='+0', font=('Arial', 12, 'bold'))
Button_Zero.pack()

Zähler = Label(root, bg='black', fg='white', text="0", font=('Arial', 20, 'bold'), width=6, height=1)
Zähler.pack()

root.mainloop()

Re: Durch Knopfdruck Zufallswert aus Tabelle auswählen

Verfasst: Montag 20. April 2020, 21:02
von __deets__
Es gibt da eine Menge Anmerkungen:

- beachte die Namenskonventionen in Python PEP8. Variablen und Funktionen werden klein_mit_unterstrich geschrieben.
- *-importe sind Boese(tm). Importiere und benutze INSBESONDERE tkinter so:

Code: Alles auswählen

import tkinter as tk
button = tk.Button(...)
- auf die oberste Modulebene gehoert kein Code der ausgefuehrt wird. Nur Konstanten, Importe, Klassen- und Funktionsdefinitionen.
- dementsprechend startet man das Programm mit Code der so aussieht, am ganz unteren Ende des Skriptes:

Code: Alles auswählen

def main():
     # gui bauen, etc.
if __name__ == "__main__": # der implizite Name eines per "python skript.py" gestarteten Programms
     main()
- globale Variablen sind noch mehr boese(tm). GUI-Programmierung erfordert oft Klassen, manchmal kann man mit functools.partial davonkommen, indem man benoetigten Zustand wie Entries etc. an einen Funktionsaufruf "anbindet".

Zu deinem Problem: wenn du etwas mehrfach machen willst, dann schreib dir eine Funktion dafuer. Der Auswahl einer der 52 Karten zB gehoert dazu.

Was mir an dieser Stelle allerdings noch wichtig ist: willst du immer eine neue Karte (also ziehen mit ruecklegen), oder muss beruecksichtig werden, welche Karten schon vorher mal gezogen worden sind? Und wo genau was in der GUI mit der neuen Karte passieren sollen, ist mir auch nach deinen Erklaerungen nicht klar geworden. Kannst du das nochmal beschreiben? + und - sind fuer mich da irgendwie keine natuerlichen Kandidaten. Und was wird da eigentlich gezaehlt?

Re: Durch Knopfdruck Zufallswert aus Tabelle auswählen

Verfasst: Dienstag 21. April 2020, 09:59
von __blackjack__
Ergänzende Anmerkungen: `place()` ist keine gute Idee und es macht auch keinen Sinn, denn da werden ja zwei Label für den Zähler erstellt, und das was da mit `place()` absolut platziert wird ist ausserhalb des sichtbaren Bereichs.

Die Breite von Labels sollte man auch nur vorgeben wenn man sicher ist, dass der Text da auch rein passt. Das ist bei den Karten bei mir nicht der Fall. Die meisten Texte werden bei mir vorne und hinten abgeschnitten.

Die Kommentare sind überflüssig. Faustregel: Ein Kommentar sagt nicht was der Code macht, denn das steht da ja bereits als Code, sondern warum der das so macht. Sofern das nicht offensichtlich ist.

An `Random_Card` ist bereits eine Zeichenkette gebunden. Es macht wenig Sinn damit `str()` aufzurufen.

Zwischenstand:

Code: Alles auswählen

#!/usr/bin/env python3
import random
import tkinter as tk
from functools import partial

CARD_VALUES = [
    "Ace",
    "King",
    "Queen",
    "Jack",
    "Ten",
    "Nine",
    "Eight",
    "Seven",
    "Six",
    "Five",
    "Four",
    "Three",
    "Two",
]
CARD_SUITES = ["Hearts", "Clubs", "Spades", "Diamonds"]


def zaehlerstand_anpassen(zaehlerstand_var, delta):
    zaehlerstand_var.set(zaehlerstand_var.get() + delta)


def main():
    root = tk.Tk()
    zaehlerstand_var = tk.IntVar(value=0)

    card = f"{random.choice(CARD_VALUES)} of {random.choice(CARD_SUITES)}"
    tk.Label(
        root, text=card, font=("Arial", 15), height=2, bg="black", fg="white"
    ).pack()

    button_config = {"bg": "#999999", "font": ("Arial", 12, "bold")}
    tk.Button(
        root,
        text="+1",
        command=partial(zaehlerstand_anpassen, zaehlerstand_var, 1),
        **button_config,
    ).pack()
    tk.Button(
        root,
        text="-1",
        command=partial(zaehlerstand_anpassen, zaehlerstand_var, -1),
        **button_config,
    ).pack()
    tk.Button(root, text="+0", **button_config).pack()

    tk.Label(
        root,
        bg="black",
        fg="white",
        textvariable=zaehlerstand_var,
        font=("Arial", 20, "bold"),
        width=6,
    ).pack()

    root.mainloop()


if __name__ == "__main__":
    main()

Re: Durch Knopfdruck Zufallswert aus Tabelle auswählen

Verfasst: Dienstag 21. April 2020, 12:42
von Benutzer_Simon
Grundsätzlich ist mir erst einmal egal ob die Karte zurückgelegt wird oder nicht. Primär reicht es mir wenn die Karten nicht zurück gelegt werden, sondern einfach zufällig bei jedem Betätigen eines Buttons(z.B. ButtonPlus, ButtonMinus und ButtonZero) auf dem Label, andem beim Programmstart der Name einer Karte steht, ausgegeben wird.
In meinem Code sollte dass, LabelCard sein, weil dort einfach der Name der Karten erscheinen soll.
Wie würde den so eine Funktion aussehen, wenn ich etwas mehrfach will?
Zu deiner Frage: Alle Spielkarten, die den Wert 2, 3, 4, 5 und 6 haben, bekommen den Wert +1 zugeteilt. Alle Karten mit den Werten Ass, König, Dame, Bube und 10 bekommen den Wert -1 zugeteilt. Mein Programm soll einfahc helfen, das Kartenzählen beim lackjack zu lernen/üben. Das hört sich vielleicht blöd an aber ich dachte das wäre etwas nicht all zu schweres um mit dem Programmieren anzufangen.
Ich hoffe das war dieses Mal etwas verständlicher.
Danke