Home > Mobile >  How to get previous Tkinter value to delete when user clicks a button and generate a new value?
How to get previous Tkinter value to delete when user clicks a button and generate a new value?

Time:03-19

from tkinter import *
import random as r
from collections import Counter

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


def open_gn():
    gn_wn = Tk()
    gn_wn.title("Simple Mafs - Generate a number")
    gn_wn.geometry("600x400")
    gn_wn.resizable(False, False)

    Label(gn_wn, text='                                                      ').grid(row=0, column=0)
    inst_gn = Label(gn_wn, text='Enter a minimum and maximum value(below 100)')
    inst_gn.config(font=("Yu Gothic UI", 12))
    inst_gn.grid(row=0, column=1)

    Label(gn_wn, text=" Enter a minimum value: ").place(x=295, y=100)
    entry_min = Entry(gn_wn)
    entry_min.insert(0, "0")
    entry_min.place(x=450, y=100)

    Label(gn_wn, text=" Enter a maximum value: ").place(x=295, y=200)
    entry_max = Entry(gn_wn)
    entry_max.insert(0, "99")
    entry_max.place(x=450, y=200)

    Label(gn_wn, text="Random value is: ").place(x=40, y=40)

    def generate_number():
        min_ = int(entry_min.get())
        max_ = int(entry_max.get())

        random_num = r.randint(min_, max_)
        d_rn = Label(gn_wn, text=random_num)
        d_rn.config(text=random_num, font=("Yu Gothic UI", 30))
        d_rn.place(x=40, y=100)

    Button(gn_wn, text="Generate", padx=220, pady=25, command=generate_number).place(x=25, y=280)

    gn_wn.mainloop()


def open_coin():
    c_wn = Tk()
    c_wn.title("Simple Mafs - 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_label = Label(c_wn, text="")
    coin_label.place(relx=0.5, rely=0.2, anchor='s')

    def flip():
        coin_values = ["Heads", "Tails"]
        coin_face = r.choice(coin_values)
        if coin_face == "Heads":
            coin_label.config(text="Coin: Heads")
        else:
            coin_label.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)

    c_wn.mainloop()


def open_average():
    avg_wn = Tk()
    avg_wn.title("Simple Mafs - 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: ').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)


def rand_stat():
    pass


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

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

button1 = Button(root, text="Generate a random number", padx=80, pady=25, command=open_gn)
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="Calculator", padx=105, pady=25, command=rand_stat)
button4.place(x=325, y=200)

root.mainloop()

Skip to the open_gn() one because that's where the problem is. I want to make an app that can do statistics/random related stuff and in it, I want to create an app that can generate a random number. The app generates the number but the previous value stays and interferes with the current number being generated.

CodePudding user response:

You create new label whenever generate_number() is executed and put that new label on the same position which will overlay previous label.

You need to create the label once outside the function and just update its text inside the function:

def open_gn():
    ...
    Label(gn_wn, text="Random value is: ").place(x=40, y=40)
    # create label for generated random number
    d_rn = Label(gn_wn, font=("Yu Gothic UI", 30))
    d_rn.place(x=40, y=100)

    def generate_number():
        min_ = int(entry_min.get())
        max_ = int(entry_max.get())

        random_num = r.randint(min_, max_)
        d_rn.config(text=random_num) # update label

    ...
  • Related