Skip to content
Advertisement

Why is my Tkinter button not executing my function?

from tkinter import *
import random
from collections import Counter

root = Tk()
root.title("Random")
root.geometry("600x400")
root.resizable(False, False)


def open_saw():
    saw_wn = Tk()
    saw_wn.title("Random App - Spin a Wheel")
    saw_wn.geometry("600x400")
    saw_wn.resizable(False, False)

    saw_wn.mainloop()


def open_coin():
    c_wn = Tk()
    c_wn.title("Random App - Flip a Coin")
    c_wn.geometry("600x400")
    c_wn.resizable(False, False)

    Label(c_wn, text="                                                                                ").grid(row=0,
                                                                                                              column=0)
    Label(c_wn, text="Flip the coin below!", font=("Yu Gothic UI", 12)).grid(row=0, column=1)

    Label(c_wn, text='                    ').grid(row=1, column=1)

    coin_values = ["Heads", "Tails"]
    coin_face = random.choice(coin_values)

    def flip():
        if coin_face == "Heads":
            Label(c_wn, text="Coin: Heads").place(anchor='s')
        else:
            Label(c_wn, text="Coin: Tails").place(anchor='s')
    coin = Button(c_wn, text='coin', padx=100, pady=90, command=flip)
    coin.place(relx=0.5, rely=0.5, anchor=CENTER)

    c_wn.mainloop()


def open_average():
    avg_wn = Tk()
    avg_wn.title("Random App - Averages")
    avg_wn.geometry("840x300")

    Label(avg_wn, text="              ").grid(row=0, column=0)
    avg_instruct = Label(avg_wn, text="Enter your values below to get the averages in mean, median, and mode(put a "
                                      "space between commas")
    avg_instruct.config(font=("Yu Gothic UI", 10))
    avg_instruct.grid(row=0, column=1)

    Label(avg_wn, text="                                     ").grid(row=1, column=0)
    entry = Entry(avg_wn)
    entry.grid(row=2, column=1)

    def calculate():
        list_data = entry.get().split(', ')
        list_data = [float(i) for i in list_data]
        mean = sum(list_data) / len(list_data)
        Label(avg_wn, text='Mean').grid(row=5, column=0)
        Label(avg_wn, text=str(mean)).grid(row=6, column=0)

        list_data_len = len(list_data)
        list_data.sort()

        if list_data_len % 2 == 0:
            median1 = list_data[list_data_len // 2]
            median2 = list_data[list_data_len // 2 - 1]
            median = (median1 + median2) / 2
        else:
            median = list_data[list_data_len // 2]
        Label(avg_wn, text='Median: ' + str(median)).grid(row=5, column=1)
        Label(avg_wn, text=median).grid(row=6, column=1)
        list_data_for_mode = Counter(list_data)
        get_mode = dict(list_data_for_mode)
        mode = [k for k, v in get_mode.items() if v == max(list(list_data_for_mode.values()))]

        if len(mode) == list_data_len:
            get_mode = ["No mode found"]
        else:
            get_mode = [str(i) for i in mode]

        Label(avg_wn, text="Mode: ").grid(row=5, column=2)
        Label(avg_wn, text=get_mode[0]).grid(row=6, column=2)

    Label(avg_wn, text="                                     ").grid(row=3, column=0)

    Button(avg_wn, text='Enter', command=calculate).grid(row=4, column=1)


Label(root, text="                                                          ").grid(row=0, column=0)

title = Label(root, text="Welcome to Random")
title.config(font=("Yu Gothic UI", 24))
title.grid(row=0, column=1)

button1 = Button(root, text="             Spin a wheel             ", padx=80, pady=25, command=open_saw)
button1.place(x=2.25, y=100)

button2 = Button(root, text="Calculate mean, mode, median, and range", padx=20, pady=25, command=open_average)
button2.place(x=325, y=100)

button3 = Button(root, text="Flip a Coin", padx=125, pady=25, command=open_coin)
button3.place(x=2.25, y=200)

button4 = Button(root, text="Generate a number", padx=82, pady=25)
button4.place(x=325, y=200)

root.mainloop()

I want the function to display heads or tails(randomly). Instead, the function displays nothing and ignores the function. I have also tried printing the value instead of displaying it on tkinter, but it only shows heads and not tails. If any additional details are needed to solve my issue please comment and I will provide additional details.

Advertisement

Answer

In the function open_coin, when the button coin is clicked, you are creating the label but not specifying the x and y coordinates in place , and that too creating everytime the button is pressed. So, create a label to display the result and keep changing its text using config.

And the random function is called only once, so keep it inside the flip function to call everytime in order to get a new random coin value.

    .
    .
    CoinLabel = Label(c_wn, text="")  #will be used to display the result
    CoinLabel.place(relx=0.5, rely=0.2, anchor='s')
    
    def flip():
        coin_values = ["Heads", "Tails"]
        coin_face = random.choice(coin_values)
        print(coin_face)
        if coin_face == "Heads":
            CoinLabel.config(text="Coin: Heads")
        else:
            CoinLabel.config(text="Coin: Tails")
    coin = Button(c_wn, text='coin', padx=100, pady=90, command=flip)
    coin.place(relx=0.5, rely=0.5, anchor=CENTER)
    .
    .
User contributions licensed under: CC BY-SA
4 People found this is helpful
Advertisement