Python Forum
BlackJack with tkinter - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: General (https://python-forum.io/forum-1.html)
+--- Forum: Code sharing (https://python-forum.io/forum-5.html)
+--- Thread: BlackJack with tkinter (/thread-38114.html)



BlackJack with tkinter - menator01 - Sep-05-2022

This is my go at BlackJack. It's far from finished and I will rewrite and clean the code up when everything is working.
Just wanted to share the current project.


I took some code snippets and smushed them together and added tkinter frame work. I feel I should give credit where credit is due and list the references. At some point I will optimize and cleanup the code adding my own style.

The Card class:
https://slott56.github.io/building-skills-oo-design-book/build/html/blackjack/card_deck_shoe.html

The Deck class:
from deanhystad
https://python-forum.io/thread-35860-post-151315.html#pid151315

The check_hand function:
https://pythonalgos.com/level-1-python-blackjack/



I did not see a rumble in the video widget so, I posted the link. Hope that's ok.
Video Link:
https://rumble.com/v1ipib0-tkinter-python-and-blackjack.html

import random as rnd
from dataclasses import dataclass
import tkinter as tk

class CheckCards:
    def winner(self, player, dealer):
        if player > 21:
            msg = 'Player Busted! Dealer Wins'
        elif dealer > 21 and player < 21:
            msg = 'Dealer Busted! Player Wins'
        elif player > dealer:
            msg = 'Player Wins!'
        elif dealer > player:
            msg = 'Dealer Wins!'
        else:
            msg = 'Tie Game'
        return msg

    def get_hand(self, hand):
            val = 0
            for card in hand:
                if card[1] in Card.face_cards.keys():
                    val += 10
                else:
                    val += card[1]
                if card[0] in [chr(0x1F0A1), chr(0x1F0B1), chr(0x1F0C1), chr(0x1F0D1)]:
                    val -= 1
                    if val + 11 > 21:
                        val +=1
                    else:
                        val += 11
            return val

# @dataclass
class Card:
    Clubs = u'\N{BLACK CLUB SUIT}'
    Diamonds = u'\N{BLACK DIAMOND SUIT}'
    Hearts = u'\N{BLACK HEART SUIT}'
    Spades = u'\N{BLACK SPADE SUIT}'
    Jack = 11
    Queen = 12
    King = 13
    Ace = 1
    Card_back = chr(0x1f0a0)

    face_cards = {
        11: 'Jack',
        12: 'Queen',
        13: 'King',
    }

    def __init__(self, rank: int, suit: str) -> None:
        assert suit in (Card.Clubs, Card.Diamonds, Card.Hearts, Card.Spades)
        assert 1 <= rank < 14
        self.rank = rank
        self.suit = suit
        self.order = rank

    @property
    def image(self) -> str:
        suit = {
            Card.Spades: 0x1F0A0,
            Card.Hearts: 0x1F0B0,
            Card.Diamonds: 0x1F0C0,
            Card.Clubs: 0x1F0D0,
        }[self.suit]
        rank = self.rank if self.rank < 12 else self.rank + 1
        return chr(suit+rank)

class Deck(Card):
    def __init__(self, shuffle=False):
        suits = [Card.Clubs, Card.Spades, Card.Hearts, Card.Diamonds]
        self.cards = [(Card(i, suit).image,i) for i in range(1, 14) for suit in suits]
        if shuffle:
            rnd.shuffle(self.cards)

    def __len__(self):
        return len(self.cards)

    def deal(self, count):
        cards = self.cards[:count]
        self.cards = self.cards[count:]
        return cards
class View:
    def __init__(self, parent):
        parent.columnconfigure(0, weight=1)
        parent.rowconfigure(0, weight=1)

        container = tk.Frame(parent)
        container.grid(column=0, row=0, sticky='news')
        container.grid_columnconfigure(0, weight=3)

        self.player_container = tk.Frame(container, height=50)
        self.player_container['borderwidth'] = 0
        self.player_container['highlightcolor'] = 'black'
        self.player_container['highlightbackground'] = 'black'
        self.player_container['highlightthickness'] = 1
        self.player_container.grid(column=0, row=1, sticky='news', padx=5, pady=5)

        label = tk.Label(container, pady=12, relief='ridge')
        label['text'] = f'BlackJack {Card(1, Card.Hearts).image} {Card(11,Card.Spades).image}'
        label['font'] = (None, 25, 'bold')
        label['bg'] = 'antiquewhite'
        label.grid(column=0, row=0, sticky='new', padx=5, pady=5)

        player = tk.Label(self.player_container, text='Player', bg='lightsteelblue', pady=5)
        player['font'] = (None, 16, 'bold')
        player.grid(column=0, row=0, sticky='new', pady=5, ipadx=100)

        dealer = tk.Label(self.player_container, text='Dealer', bg='gray', pady=5)
        dealer['font'] = (None, 16, 'bold')
        dealer.grid(column=0, row=1, sticky='new', pady=5, ipadx=100)

        self.player_card_frame = tk.Frame(self.player_container)
        self.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5)

        self.dealer_card_frame = tk.Frame(self.player_container)
        self.dealer_card_frame.grid(column=1, row=1, sticky='new', padx=5, pady=5)

        btn_container = tk.Frame(container)
        btn_container.grid(column=0, row=2, sticky='new', padx=5, pady=5)
        for i in range(3):
            btn_container.grid_columnconfigure(i, weight=3, uniform='button')

        self.deal_btn = tk.Button(btn_container, text='Deal')
        self.deal_btn.grid(column=0, row=0, sticky='new', padx=(2,1))

        self.hit_btn = tk.Button(btn_container, text='Hit Me')
        self.hit_btn.grid(column=1, row=0, sticky='new', padx=1)

        self.call_btn = tk.Button(btn_container, text='Call')
        self.call_btn.grid(column=2, row=0, sticky='new', padx=(1,2))





class Controller:
    def __init__(self, deck, check, view):
        self.deck = deck
        self.check = check
        self.view = view

        # Buttons
        self.view.deal_btn['command'] = self.deal
        self.view.hit_btn['command'] = self.hitme
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['command'] = self.call
        self.view.call_btn['state'] = 'disabled'

    def hitme(self):
        self.player.append(*self.deck.deal(1))
        self.player_cards = [card[0] for card in self.player]

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 18, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)


    def call(self):
        self.view.deal_btn['state'] = 'normal'
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['state'] = 'disabled'

    def deal(self):
        self.view.player_card_frame.destroy()
        self.view.player_card_frame = tk.Frame(self.view.player_container)
        self.view.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5)

        self.view.deal_btn['state'] = 'disabled'
        self.view.hit_btn['state'] = 'normal'
        self.view.call_btn['state'] = 'normal'

        self.player = self.deck.deal(2)
        dealer = self.deck.deal(2)
        self.player_cards = [card[0] for card in self.player]
        dealer_cards = [card[0] for card in dealer]

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 18, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)

        for i, card in enumerate(dealer_cards):
            label = tk.Label(self.view.dealer_card_frame)
            label['text'] = card
            label['font'] = (None, 18, 'bold')
            label.grid(column=i, row=1, sticky='news', padx=2, pady=2)


if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('800x300+300+300')
    Controller(Deck(True), CheckCards(), View(root))
    root.mainloop()



RE: BlackJack with tkinter - rob101 - Sep-06-2022

I've tried to run your app, as I've also built a Blackjack game and wanted to see how your code and game compared. I can't run your app, because of this error:

Error:
_tkinter.TclError: character U+1f0b1 is above the range (U+0000-U+FFFF) allowed by Tcl
It throws this at line 103:

Output:
line 103, in __init__ label['text'] = f'BlackJack {Card(1, Card.Hearts).image} {Card(11,Card.Spades).image}'



RE: BlackJack with tkinter - menator01 - Sep-06-2022

It works on mine. I'm using ubuntu system. Not tried on a windows if that what you using.

This is what I have now. Can't seem to get the ace to do correct. If the total with ace as 11 if below 21 and 1 if the total would be above 21.

import random as rnd
import tkinter as tk

class CheckCards:
    def winner(self, player, dealer):
        if player > 21:
            msg = 'Player Busted!'
        elif dealer > 21:
            msg = 'Dealer Busted!'
        elif player > dealer:
            msg = 'Player Wins!'
        elif dealer > player:
            msg = 'Dealer Wins!'
        else:
            msg = 'Tie Game'
        return msg

    def get_hand(self, hand):
        val = 0
        for card in hand:
            if card[1] in Card.face_cards.keys():
                val += 10
            else:
                val += card[1]

            if card[0] in [chr(0x1F0A1), chr(0x1F0B1), chr(0x1F0C1), chr(0x1F0D1)]:
                val -= 1
                if val + 11 > 21:
                    val += 1
                else:
                    val += 11
        print(val)
        return val


class Card:
    Clubs = u'\N{BLACK CLUB SUIT}'
    Diamonds = u'\N{BLACK DIAMOND SUIT}'
    Hearts = u'\N{BLACK HEART SUIT}'
    Spades = u'\N{BLACK SPADE SUIT}'
    Jack = 11
    Queen = 12
    King = 13
    Ace = 1
    Card_back = chr(0x1f0a0)

    face_cards = {
        11: 'Jack',
        12: 'Queen',
        13: 'King',
    }


    def __init__(self, rank: int, suit: str) -> None:
        assert suit in (Card.Clubs, Card.Diamonds, Card.Hearts, Card.Spades)
        assert 1 <= rank < 14
        self.rank = rank
        self.suit = suit
        self.order = rank

    @property
    def image(self) -> str:
        suit = {
            Card.Spades: 0x1F0A0,
            Card.Hearts: 0x1F0B0,
            Card.Diamonds: 0x1F0C0,
            Card.Clubs: 0x1F0D0,
        }[self.suit]
        rank = self.rank if self.rank < 12 else self.rank + 1
        return chr(suit+rank)


class Deck(Card):
    def __init__(self, shuffle=False):
        suits = [Card.Clubs, Card.Spades, Card.Hearts, Card.Diamonds]
        self.cards = [(Card(i, suit).image,i) for i in range(1, 14) for suit in suits]
        if shuffle:
            rnd.shuffle(self.cards)

    def __len__(self):
        return len(self.cards)

    def deal(self, count):
        cards = self.cards[:count]
        self.cards = self.cards[count:]
        return cards


class View:
    def __init__(self, parent):
        parent.columnconfigure(0, weight=1)
        parent.rowconfigure(0, weight=1)

        container = tk.Frame(parent)
        container.grid(column=0, row=0, sticky='news')
        container.grid_columnconfigure(0, weight=3)

        self.player_container = tk.Frame(container, height=50)
        self.player_container['borderwidth'] = 0
        self.player_container['highlightcolor'] = 'black'
        self.player_container['highlightbackground'] = 'black'
        self.player_container['highlightthickness'] = 1
        self.player_container.grid(column=0, row=1, sticky='news', padx=5, pady=5)

        label = tk.Label(container, pady=12, relief='ridge')
        label['text'] = f'BlackJack {Card(1, Card.Hearts).image} {Card(11,Card.Spades).image}'
        label['font'] = (None, 25, 'bold')
        label['bg'] = 'antiquewhite'
        label.grid(column=0, row=0, sticky='new', padx=5, pady=5)

        player = tk.Label(self.player_container, text='Player', bg='lightsteelblue', pady=5)
        player['font'] = (None, 16, 'bold')
        player.grid(column=0, row=0, sticky='new', pady=5, ipadx=100)

        dealer = tk.Label(self.player_container, text='Dealer', bg='gray', pady=5)
        dealer['font'] = (None, 16, 'bold')
        dealer.grid(column=0, row=1, sticky='new', pady=5, ipadx=100)

        self.player_card_frame = tk.Frame(self.player_container)
        self.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5)

        self.dealer_card_frame = tk.Frame(self.player_container)
        self.dealer_card_frame.grid(column=1, row=1, sticky='new', padx=5, pady=5)

        btn_container = tk.Frame(container)
        btn_container.grid(column=0, row=2, sticky='new', padx=5, pady=5)
        for i in range(3):
            btn_container.grid_columnconfigure(i, weight=3, uniform='button')

        self.deal_btn = tk.Button(btn_container, text='Deal', cursor='hand2')
        self.deal_btn.grid(column=0, row=0, sticky='new', padx=(2,1))

        self.hit_btn = tk.Button(btn_container, text='Hit Me', cursor='hand2')
        self.hit_btn.grid(column=1, row=0, sticky='new', padx=1)

        self.call_btn = tk.Button(btn_container, text='Call', cursor='hand2')
        self.call_btn.grid(column=2, row=0, sticky='new', padx=(1,2))

        self.msg_label = tk.Label(container, anchor='nw', padx=8)
        self.msg_label['font'] = (None, 12, 'normal')
        self.msg_label['relief'] = 'ridge'
        self.msg_label['fg'] = 'steelblue'
        self.msg_label.grid(column=0 ,row=3, sticky='new', padx=5, pady=5)


class Controller:
    def __init__(self, deck, check, view):
        self.deck = deck
        self.check = check
        self.view = view

        # Buttons
        self.view.deal_btn['command'] = self.deal
        self.view.hit_btn['command'] = self.hitme
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['command'] = self.call
        self.view.call_btn['state'] = 'disabled'

    def hitme(self):
        self.player.append(*self.deck.deal(1))
        self.player_cards = [card[0] for card in self.player]
        self.player_total = self.check.get_hand(self.player)

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 18, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)


        if self.player_total > 21:
            self.view.msg_label['text'] = f'You Busted! You have a total of {self.player_total}'
            self.view.deal_btn['state'] = 'normal'
            self.view.hit_btn['state'] = 'disabled'
            self.view.call_btn['state'] = 'disabled'


    def call(self):
        self.view.deal_btn['state'] = 'normal'
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['state'] = 'disabled'
        while self.dealer_total < 17:
            self.dealer.append(*self.deck.deal(1))
            self.dealer_total = self.check.get_hand(self.dealer)
            self.dealer_cards = [card[0] for card in self.dealer]
            for i, card in enumerate(self.dealer_cards):
                label = tk.Label(self.view.dealer_card_frame)
                label['text'] = card
                label['font'] = (None, 20, 'bold')
                label.grid(column=i, row=1, sticky='news', padx=2, pady=2)
        self.deck = Deck(True)



        self.view.msg_label['text'] = self.check.winner(self.player_total, self.dealer_total)

    def deal(self):
        self.deck = Deck(True)
        self.view.msg_label['text'] = ''

        self.view.player_card_frame.destroy()
        self.view.player_card_frame = tk.Frame(self.view.player_container)
        self.view.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5)

        self.view.dealer_card_frame.destroy()
        self.view.dealer_card_frame = tk.Frame(self.view.player_container)
        self.view.dealer_card_frame.grid(column=1, row=1, sticky='new', padx=5, pady=5)

        self.view.deal_btn['state'] = 'disabled'
        self.view.hit_btn['state'] = 'normal'
        self.view.call_btn['state'] = 'normal'

        self.player = self.deck.deal(2)
        self.dealer = self.deck.deal(2)
        self.player_cards = [card[0] for card in self.player]
        self.dealer_cards = [card[0] for card in self.dealer]

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)

        for i, card in enumerate(self.dealer_cards):
            label = tk.Label(self.view.dealer_card_frame)
            label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=1, sticky='news', padx=2, pady=2)

        self.player_total = self.check.get_hand(self.player)
        self.dealer_total = self.check.get_hand(self.dealer)



if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('800x300+300+300')
    Controller(Deck(True), CheckCards(), View(root))
    root.mainloop()


Here an example

Output:
Output:
20 12 14 24
The first ace should have drooped to a value of 1 (well any ace that would cause it to me more than 21)


RE: BlackJack with tkinter - rob101 - Sep-06-2022

(Sep-06-2022, 05:15 PM)menator01 Wrote: Not tried on a windows if that what you using.

No. I'm running a Linux Mint OS

Not a worry; I just thought you may want to know that your code may not be compatible with all systems.


RE: BlackJack with tkinter - rob101 - Sep-06-2022

(Sep-06-2022, 05:15 PM)menator01 Wrote: Can't seem to get the ace to do correct.

Yes, that was a tricky one to solve for me, also.

What I did was to have a function that assigns a value of eleven to a Ace card (in fact it assigns values to any card), then, when checking the 'hand', I take a note of how many Ace cards are held, and if the total hand is greater than 21, reduce the hand value by 10 for each Ace card held. Of course, there needs to be some code that only does that in order to try and beat the hand of the other player.

Not sure of that makes any sense to you: it's always clear to the person that's doing the explaining.


RE: BlackJack with tkinter - menator01 - Sep-06-2022

This seems to work. Now I need to hide one of the dealers card and re-do the messaging.

This seems to work. Still a few bugs though.



import random as rnd
import tkinter as tk

class CheckCards:
    def winner(self, player, dealer):
        if player > 21:
            msg = 'Player Busted!'
        elif dealer > 21:
            msg = 'Dealer Busted!'
        elif player > dealer:
            msg = 'Player Wins!'
        elif dealer > player:
            msg = 'Dealer Wins!'
        else:
            msg = 'Tie Game'
        return msg

    def get_hand(self, hand):
        val = 0
        for card in hand:
            if card[1] in Card.face_cards.keys():
                val += 10
            else:
                val += card[1]

            if card[0] in [chr(0x1F0A1), chr(0x1F0B1), chr(0x1F0C1), chr(0x1F0D1)]:
                val -= 1
                item = list(card)
                item[1] = 11
                card = tuple(item)
                if val + card[1] > 21:
                    val += 1
                else:
                    val += card[1]
        return val


class Card:
    Clubs = u'\N{BLACK CLUB SUIT}'
    Diamonds = u'\N{BLACK DIAMOND SUIT}'
    Hearts = u'\N{BLACK HEART SUIT}'
    Spades = u'\N{BLACK SPADE SUIT}'
    Jack = 11
    Queen = 12
    King = 13
    Ace = 1
    Card_back = chr(0x1f0a0)

    face_cards = {
        11: 'Jack',
        12: 'Queen',
        13: 'King',
    }


    def __init__(self, rank: int, suit: str) -> None:
        assert suit in (Card.Clubs, Card.Diamonds, Card.Hearts, Card.Spades)
        assert 1 <= rank < 14
        self.rank = rank
        self.suit = suit
        self.order = rank

    @property
    def image(self) -> str:
        suit = {
            Card.Spades: 0x1F0A0,
            Card.Hearts: 0x1F0B0,
            Card.Diamonds: 0x1F0C0,
            Card.Clubs: 0x1F0D0,
        }[self.suit]
        rank = self.rank if self.rank < 12 else self.rank + 1
        return chr(suit+rank)


class Deck(Card):
    def __init__(self, shuffle=False):
        suits = [Card.Clubs, Card.Spades, Card.Hearts, Card.Diamonds]
        self.cards = [(Card(i, suit).image,i) for i in range(1, 14) for suit in suits]
        if shuffle:
            rnd.shuffle(self.cards)

    def __len__(self):
        return len(self.cards)

    def deal(self, count):
        cards = self.cards[:count]
        self.cards = self.cards[count:]
        return cards


class View:
    def __init__(self, parent):
        parent.columnconfigure(0, weight=1)
        parent.rowconfigure(0, weight=1)

        container = tk.Frame(parent)
        container.grid(column=0, row=0, sticky='news')
        container.grid_columnconfigure(0, weight=3)

        self.player_container = tk.Frame(container, height=50)
        self.player_container['borderwidth'] = 0
        self.player_container['highlightcolor'] = 'black'
        self.player_container['highlightbackground'] = 'black'
        self.player_container['highlightthickness'] = 1
        self.player_container.grid(column=0, row=1, sticky='news', padx=5, pady=5)

        label = tk.Label(container, pady=12, relief='ridge')
        label['text'] = f'BlackJack {Card(1, Card.Hearts).image} {Card(11,Card.Spades).image}'
        label['font'] = (None, 25, 'bold')
        label['bg'] = 'antiquewhite'
        label.grid(column=0, row=0, sticky='new', padx=5, pady=5)

        player = tk.Label(self.player_container, text='Player', bg='lightsteelblue', pady=5)
        player['font'] = (None, 16, 'bold')
        player.grid(column=0, row=0, sticky='new', pady=5, ipadx=100)

        dealer = tk.Label(self.player_container, text='Dealer', bg='gray', pady=5)
        dealer['font'] = (None, 16, 'bold')
        dealer.grid(column=0, row=1, sticky='new', pady=5, ipadx=100)

        self.player_card_frame = tk.Frame(self.player_container)
        self.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5)

        self.dealer_card_frame = tk.Frame(self.player_container)
        self.dealer_card_frame.grid(column=1, row=1, sticky='new', padx=5, pady=5)

        btn_container = tk.Frame(container)
        btn_container.grid(column=0, row=2, sticky='new', padx=5, pady=5)
        for i in range(3):
            btn_container.grid_columnconfigure(i, weight=3, uniform='button')

        self.deal_btn = tk.Button(btn_container, text='Deal', cursor='hand2')
        self.deal_btn.grid(column=0, row=0, sticky='new', padx=(2,1))

        self.hit_btn = tk.Button(btn_container, text='Hit Me', cursor='hand2')
        self.hit_btn.grid(column=1, row=0, sticky='new', padx=1)

        self.call_btn = tk.Button(btn_container, text='Call', cursor='hand2')
        self.call_btn.grid(column=2, row=0, sticky='new', padx=(1,2))

        self.msg_label = tk.Label(container, anchor='nw', padx=8)
        self.msg_label['font'] = (None, 12, 'normal')
        self.msg_label['relief'] = 'ridge'
        self.msg_label['fg'] = 'steelblue'
        self.msg_label.grid(column=0 ,row=3, sticky='new', padx=5, pady=5)


class Controller:
    def __init__(self, deck, check, view):
        self.deck = deck
        self.check = check
        self.view = view

        # Buttons
        self.view.deal_btn['command'] = self.deal
        self.view.hit_btn['command'] = self.hitme
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['command'] = self.call
        self.view.call_btn['state'] = 'disabled'

    def hitme(self):
        self.player.append(*self.deck.deal(1))
        self.player_cards = [card[0] for card in self.player]
        self.player_total = self.check.get_hand(self.player)

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 18, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)


        if self.player_total > 21:
            self.view.deal_btn['state'] = 'normal'
            self.view.hit_btn['state'] = 'disabled'
            self.view.call_btn['state'] = 'disabled'
            self.view.msg_label['text'] = f'You Busted! You have a total of {self.player_total}'
        else:
            self.view.msg_label['text'] = f'Player has: {self.player_total}'


    def call(self):
        self.view.deal_btn['state'] = 'normal'
        self.view.hit_btn['state'] = 'disabled'
        self.view.call_btn['state'] = 'disabled'
        while self.dealer_total < 17:
            self.dealer.append(*self.deck.deal(1))
            self.dealer_total = self.check.get_hand(self.dealer)
            self.dealer_cards = [card[0] for card in self.dealer]
            
            for i, card in enumerate(self.dealer_cards):
                label = tk.Label(self.view.dealer_card_frame)
                label['text'] = card
                label['font'] = (None, 20, 'bold')
                label.grid(column=i, row=1, sticky='news', padx=2, pady=2)

        self.deck = Deck(True)
        self.view.msg_label['text'] = self.check.winner(self.player_total, self.dealer_total)

    def deal(self):
        self.deck = Deck(True)
        self.view.msg_label['text'] = ''

        self.view.player_card_frame.destroy()
        self.view.player_card_frame = tk.Frame(self.view.player_container)
        self.view.player_card_frame.grid(column=1, row=0, sticky='new', padx=5, pady=5)

        self.view.dealer_card_frame.destroy()
        self.view.dealer_card_frame = tk.Frame(self.view.player_container)
        self.view.dealer_card_frame.grid(column=1, row=1, sticky='new', padx=5, pady=5)

        self.view.deal_btn['state'] = 'disabled'
        self.view.hit_btn['state'] = 'normal'
        self.view.call_btn['state'] = 'normal'

        self.player = self.deck.deal(2)
        self.dealer = self.deck.deal(2)
        self.player_cards = [card[0] for card in self.player]
        self.dealer_cards = [card[0] for card in self.dealer]

        for i, card in enumerate(self.player_cards):
            label = tk.Label(self.view.player_card_frame)
            label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=0, sticky='news', padx=2, pady=2)

        for i, card in enumerate(self.dealer_cards):
            label = tk.Label(self.view.dealer_card_frame)
            if i == 0:
                label['text'] = chr(0x1f0a0)
            else:
                label['text'] = card
            label['font'] = (None, 20, 'bold')
            label.grid(column=i, row=1, sticky='news', padx=2, pady=2)

        self.player_total = self.check.get_hand(self.player)
        self.dealer_total = self.check.get_hand(self.dealer)
        self.view.msg_label['text'] = f'Player has: {self.player_total}'



if __name__ == '__main__':
    root = tk.Tk()
    root.geometry('800x300+300+300')
    Controller(Deck(True), CheckCards(), View(root))
    root.mainloop()



RE: BlackJack with tkinter - ndc85430 - Sep-11-2022

What is the purpose of the CheckCards class? Neither of the methods on it rely on anything in the class, so both could be free functions. Not everything needs to be in a class in Python and if you want to group related things, you can put them in the same module or package.


RE: BlackJack with tkinter - menator01 - Sep-11-2022

No real purpose. Just the way I wrote it. I usually rewrite code several times before I'm happy with it.