Search code examples
pythontkinter

Variable not defined after using "global" keyword


I am trying to make rock paper scissors with a Tkinter GUI, but for some reason in my "run" function (unfinished) player_number is undefined,

def run():
    result.grid(column=3, row=1)
    if player_number == "1":
        rock.grid(column=2, row=2)


add_fillers()
choose_player_number()
run()

even though I defined it in these two functions (triggered by buttons) further up in the code:

def oneplayer():
    title.configure(text = "One player")
    title.grid(column=3, row=0)
    global player_number
    player_number = "1"
    one_player.destroy()
    two_players.destroy()


def twoplayers():
    title.configure(text = "Two players")
    title.grid(column=3, row=0)
    global player_number
    player_number = "2"
    one_player.destroy()
    two_players.destroy()

I tried setting the variables to global but that didn't work. Here's all my code:

import random
from random import randint
import tkinter as tk
from tkinter import *

window = tk.Tk()
window.geometry("1400x860")
window.title = "Rock paper scissors"

result = Label(window, text= "result will appear here", bg="green")

def oneplayer():
    title.configure(text = "One player")
    title.grid(column=3, row=0)
    global player_number
    player_number = "1"
    one_player.destroy()
    two_players.destroy()


def twoplayers():
    title.configure(text = "Two players")
    title.grid(column=3, row=0)
    global player_number
    player_number = "2"
    one_player.destroy()
    two_players.destroy()

one_player = Button(window, text = "One Player", command = oneplayer)
two_players = Button(window, text= "Two players", command = twoplayers)

title = Label(window, text = "Rock paper scissors" , bg= "blue", fg = "white", font= "Times")
title.grid(column=3, row=0)


def add_fillers():
    filler = Label(window, text = "                                                                   ")
    filler.grid(column=1, row=0)
    filler2 = Label(window, text = "                                                                   ")
    filler2.grid(column=0, row=0)
    filler3 = Label(window, text = "                                       ")
    filler3.grid(column=2, row=0)

def choose_player_number():
    one_player.grid(column= 2, row=1)
    two_players.grid(column= 4, row=1)
    
computer_input = ""

def computer_choice():
    computer_input = randint("1", "2", "3")
    if computer_input == "1":
        computer_value = "Rock"
    elif computer_input == "2":
        computer_value = "paper"
    else:
        computer_value = "scissors"
    computer_result = Label(window, text= "the computer's choice was:" + computer_value)

    return computer_input

def win():
    result.configure(text= "You Win")

def loose():
    result.configure(text= "You loose")

def draw():
    result.configure(text= "Draw")

def evaluate_rock():
    computer_choice()
    if computer_input == "3":
        win()
    elif computer_input == "2":
        loose()
    elif computer_input == "1":
        draw()
    else:
        print ("error")

rock = Button(window, text="Rock", command= evaluate_rock, fg="green", bg="blue")


def run():
    result.grid(column=3, row=1)
    if player_number == "1":
        rock.grid(column=2, row=2)


add_fillers()
choose_player_number()
run()

window.mainloop()


Solution

  • I am trying to make rock paper scissors with a Tkinter GUI, but for some reason in my "run" function (unfinished) player_number is undefined,

    The problem can be fixed.

    Just add the parameter player_number to the run() function.

    Snippet:

    def run(player_number):
        result.grid(column=3, row=1)
        if player_number == "1":
            rock.grid(column=2, row=2)
    
    
    add_fillers()
    choose_player_number()
    run(1)
    

    Screenshot:

    enter image description here