In this video I’ll show you how to create the “Hit Me” Button for our Blackjack game for Tkinter and Python.
The hit button allows you to deal yourself another card. You can hit as many times as you want until your score becomes 21 or greater.
If you make it to 21 points you win, if you go over 21 you bust and lose.
Python Code: blackjack_4.py
(Github Code)
from tkinter import * import random from PIL import Image, ImageTk from tkinter import messagebox root = Tk() root.title('Codemy.com - Card Deck') root.iconbitmap('c:/gui/codemy.ico') root.geometry("1200x800") root.configure(background="green") # Test for blackjack on shuffle def blackjack_shuffle(player): global player_total, dealer_total # Keep track of score totals player_total = 0 dealer_total = 0 if player == "dealer": if len(dealer_score) == 2: if dealer_score[0] + dealer_score[1] == 21: # Update status blackjack_status["dealer"] = "yes" if player == "player": if len(player_score) == 2: if player_score[0] + player_score[1] == 21: # Update status blackjack_status["player"] = "yes" else: # Loop thru player score list and add up cards for score in player_score: # Add up score player_total += score if player_total == 21: blackjack_status["player"] = "yes" elif player_total > 21: blackjack_status["player"] = "bust" if len(dealer_score) == 2 and len(player_score) == 2: # Check For Push/Tie if blackjack_status["dealer"] == "yes" and blackjack_status["player"] == "yes": # It's a push - tie messagebox.showinfo("Push!", "It's a Tie!") card_button.config(state="disabled") stand_button.config(state="disabled") # Check for Dealer Win elif blackjack_status["dealer"] == "yes": messagebox.showinfo("Dealer Wins!", "Blackjack! Dealer Wins!") # Disable buttons card_button.config(state="disabled") stand_button.config(state="disabled") # Check For Player Win elif blackjack_status["player"] == "yes": messagebox.showinfo("Player Wins!", "Blackjack! Player Wins!") # Disable buttons card_button.config(state="disabled") stand_button.config(state="disabled") # Check for 21 during the game else: # Check For Push/Tie if blackjack_status["dealer"] == "yes" and blackjack_status["player"] == "yes": # It's a push - tie messagebox.showinfo("Push!", "It's a Tie!") card_button.config(state="disabled") stand_button.config(state="disabled") # Check for Dealer Win elif blackjack_status["dealer"] == "yes": messagebox.showinfo("Dealer Wins!", "21! Dealer Wins!") # Disable buttons card_button.config(state="disabled") stand_button.config(state="disabled") # Check For Player Win elif blackjack_status["player"] == "yes": messagebox.showinfo("Player Wins!", "21! Player Wins!") # Disable buttons card_button.config(state="disabled") stand_button.config(state="disabled") # Check for player bust if blackjack_status["player"] == "bust": messagebox.showinfo("Player Busts!", f"Player Loses! {player_total}") # Disable buttons card_button.config(state="disabled") stand_button.config(state="disabled") # Resize Cards def resize_cards(card): # Open the image our_card_img = Image.open(card) # Resize The Image our_card_resize_image = our_card_img.resize((150, 218)) # output the card global our_card_image our_card_image = ImageTk.PhotoImage(our_card_resize_image) # Return that card return our_card_image # Shuffle The Cards def shuffle(): # Keep track of winning global blackjack_status, player_total, dealer_total # Keep track of score totals player_total = 0 dealer_total = 0 blackjack_status = {"dealer":"no", "player":"no"} # Enable buttons card_button.config(state="normal") stand_button.config(state="normal") # Clear all the old cards from previous games dealer_label_1.config(image='') dealer_label_2.config(image='') dealer_label_3.config(image='') dealer_label_4.config(image='') dealer_label_5.config(image='') player_label_1.config(image='') player_label_2.config(image='') player_label_3.config(image='') player_label_4.config(image='') player_label_5.config(image='') # Define Our Deck suits = ["diamonds", "clubs", "hearts", "spades"] values = range(2, 15) # 11 = Jack, 12=Queen, 13=King, 14 = Ace global deck deck =[] for suit in suits: for value in values: deck.append(f'{value}_of_{suit}') # Create our players global dealer, player, dealer_spot, player_spot, dealer_score, player_score dealer = [] player = [] dealer_score = [] player_score = [] dealer_spot = 0 player_spot = 0 # Shuffle Two Cards for player and dealer dealer_hit() dealer_hit() player_hit() player_hit() # Put number of remaining cards in title bar root.title(f'Codemy.com - {len(deck)} Cards Left') def dealer_hit(): global dealer_spot if dealer_spot < 5: try: # Get the player Card dealer_card = random.choice(deck) # Remove Card From Deck deck.remove(dealer_card) # Append Card To Dealer List dealer.append(dealer_card) # Append to dealer score list and convert facecards to 10 or 11 dcard = int(dealer_card.split("_", 1)[0]) if dcard == 14: dealer_score.append(11) elif dcard == 11 or dcard == 12 or dcard == 13: dealer_score.append(10) else: dealer_score.append(dcard) # Output Card To Screen global dealer_image1, dealer_image2, dealer_image3, dealer_image4, dealer_image5 if dealer_spot == 0: # Resize Card dealer_image1 = resize_cards(f'images/cards/{dealer_card}.png') # Output Card To Screen dealer_label_1.config(image=dealer_image1) # Increment our player spot counter dealer_spot += 1 elif dealer_spot == 1: # Resize Card dealer_image2 = resize_cards(f'images/cards/{dealer_card}.png') # Output Card To Screen dealer_label_2.config(image=dealer_image2) # Increment our player spot counter dealer_spot += 1 elif dealer_spot == 2: # Resize Card dealer_image3 = resize_cards(f'images/cards/{dealer_card}.png') # Output Card To Screen dealer_label_3.config(image=dealer_image3) # Increment our player spot counter dealer_spot += 1 elif dealer_spot == 3: # Resize Card dealer_image4 = resize_cards(f'images/cards/{dealer_card}.png') # Output Card To Screen dealer_label_4.config(image=dealer_image4) # Increment our player spot counter dealer_spot += 1 elif dealer_spot == 4: # Resize Card dealer_image5 = resize_cards(f'images/cards/{dealer_card}.png') # Output Card To Screen dealer_label_5.config(image=dealer_image5) # Increment our player spot counter dealer_spot += 1 # Put number of remaining cards in title bar root.title(f'Codemy.com - {len(deck)} Cards Left') except: root.title(f'Codemy.com - No Cards In Deck') # Check for blackjack blackjack_shuffle("dealer") def player_hit(): global player_spot if player_spot < 5: try: # Get the player Card player_card = random.choice(deck) # Remove Card From Deck deck.remove(player_card) # Append Card To Dealer List player.append(player_card) # Append to dealer score list and convert facecards to 10 or 11 pcard = int(player_card.split("_", 1)[0]) if pcard == 14: player_score.append(11) elif pcard == 11 or pcard == 12 or pcard == 13: player_score.append(10) else: player_score.append(pcard) # Output Card To Screen global player_image1, player_image2, player_image3, player_image4, player_image5 if player_spot == 0: # Resize Card player_image1 = resize_cards(f'images/cards/{player_card}.png') # Output Card To Screen player_label_1.config(image=player_image1) # Increment our player spot counter player_spot += 1 elif player_spot == 1: # Resize Card player_image2 = resize_cards(f'images/cards/{player_card}.png') # Output Card To Screen player_label_2.config(image=player_image2) # Increment our player spot counter player_spot += 1 elif player_spot == 2: # Resize Card player_image3 = resize_cards(f'images/cards/{player_card}.png') # Output Card To Screen player_label_3.config(image=player_image3) # Increment our player spot counter player_spot += 1 elif player_spot == 3: # Resize Card player_image4 = resize_cards(f'images/cards/{player_card}.png') # Output Card To Screen player_label_4.config(image=player_image4) # Increment our player spot counter player_spot += 1 elif player_spot == 4: # Resize Card player_image5 = resize_cards(f'images/cards/{player_card}.png') # Output Card To Screen player_label_5.config(image=player_image5) # Increment our player spot counter player_spot += 1 # Put number of remaining cards in title bar root.title(f'Codemy.com - {len(deck)} Cards Left') except: root.title(f'Codemy.com - No Cards In Deck') # Check for blackjack blackjack_shuffle("player") # Deal Out Cards def deal_cards(): try: # Get the deler Card card = random.choice(deck) # Remove Card From Deck deck.remove(card) # Append Card To Dealer List dealer.append(card) # Output Card To Screen global dealer_image dealer_image = resize_cards(f'images/cards/{card}.png') dealer_label.config(image=dealer_image) #dealer_label.config(text=card) # Get the player Card card = random.choice(deck) # Remove Card From Deck deck.remove(card) # Append Card To Dealer List player.append(card) # Output Card To Screen global player_image player_image = resize_cards(f'images/cards/{card}.png') player_label.config(image=player_image) #player_label.config(text=card) # Put number of remaining cards in title bar root.title(f'Codemy.com - {len(deck)} Cards Left') except: root.title(f'Codemy.com - No Cards In Deck') my_frame = Frame(root, bg="green") my_frame.pack(pady=20) # Create Frames For Cards dealer_frame = LabelFrame(my_frame, text="Dealer", bd=0) dealer_frame.pack(padx=20, ipadx=20) player_frame = LabelFrame(my_frame, text="Player", bd=0) player_frame.pack(ipadx=20, pady=10) # Put Dealer cards in frames dealer_label_1 = Label(dealer_frame, text='') dealer_label_1.grid(row=0, column=0, pady=20, padx=20) dealer_label_2 = Label(dealer_frame, text='') dealer_label_2.grid(row=0, column=1, pady=20, padx=20) dealer_label_3 = Label(dealer_frame, text='') dealer_label_3.grid(row=0, column=2, pady=20, padx=20) dealer_label_4 = Label(dealer_frame, text='') dealer_label_4.grid(row=0, column=3, pady=20, padx=20) dealer_label_5 = Label(dealer_frame, text='') dealer_label_5.grid(row=0, column=4, pady=20, padx=20) # Put Player cards in frames player_label_1 = Label(player_frame, text='') player_label_1.grid(row=1, column=0, pady=20, padx=20) player_label_2 = Label(player_frame, text='') player_label_2.grid(row=1, column=1, pady=20, padx=20) player_label_3 = Label(player_frame, text='') player_label_3.grid(row=1, column=2, pady=20, padx=20) player_label_4 = Label(player_frame, text='') player_label_4.grid(row=1, column=3, pady=20, padx=20) player_label_5 = Label(player_frame, text='') player_label_5.grid(row=1, column=4, pady=20, padx=20) # Create Button Frame button_frame = Frame(root, bg="green") button_frame.pack(pady=20) # Create a couple buttons shuffle_button = Button(button_frame, text="Shuffle Deck", font=("Helvetica", 14), command=shuffle) shuffle_button.grid(row=0, column=0) card_button = Button(button_frame, text="Hit Me!", font=("Helvetica", 14), command=player_hit) card_button.grid(row=0, column=1, padx=10) stand_button = Button(button_frame, text="Stand!", font=("Helvetica", 14)) stand_button.grid(row=0, column=2) # Shuffle Deck On Start shuffle() root.mainloop()
When I use this code it tells me line 318 & line 330 player_label and dealer_abel are not defined. How did your program work around this?
Thank you for your time!!
I didn’t…you have that error because you did something wrong in the code.