Home > OS >  My Tkinter Label for calculating mode is returning "N." Why is this and how do I fix this?
My Tkinter Label for calculating mode is returning "N." Why is this and how do I fix this?

Time:03-12

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!").grid(row=0, column=1)

    c_wn.mainloop()


def open_average():
    avg_wn = Tk()
    avg_wn.title("Random App - Averages")
    avg_wn.geometry("800x400")
    avg_wn.resizable(False, False)

    Label(avg_wn, text="                                     ").grid(row=0, column=0)
    Label(avg_wn, text="Enter your values below to get the averages in mean, median, and mode.(put a space between "
                       "commas)").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: '   str(mean)).grid(row=5, 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)

        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=get_mode[0]).grid(row=5, 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="Roll a die", padx=107.5, pady=25)
button4.place(x=325, y=200)

root.mainloop()

I am making an application that can do simple statistics problems. I am currently working on the one that calculates mode, mean, and median. The mean and median were displayed properly in their spots, but the mode was not. It displays an "N" which I don't know why it is doing that. Please tell me how to fix it and please tell me what it is and what it means as I want to learn from it.

CodePudding user response:

It is because when len(mode) == list_data_len is True, get_mode will be assigned "No mode found". So text=get_mode[0] will assign "N" to the label. get_mode = ["No mode found"] should be used instead:

    def calculate():
        ...

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

        mode_label.config(text=get_mode[0])
  • Related