Как сделать так, чтобы старое сообщение от функции в кнопке исчезло, а новое появилось внутри функции

#python-3.x #tkinter

#python-3.x #tkinter

Вопрос:

Моя проблема в том, что все, что я пробовал, не работало и приводило к ошибкам. Итак, я ищу способ добавить функцию к кнопке, которая очистила бы отображаемое и снова запустила другую функцию.

 import tkinter
import random
window = tkinter.Tk()
window.title("Damp;D Stat Roller")
window.geometry("600x250")
start_label = tkinter.Label(window, text = "Welcome to Damp;D Stat Roller").pack()
d6 = [1, 2, 3, 4, 5, 6]
how_to = tkinter.Label(window, text = "Rolled stats are determined by trowing a d6 4 times and 
subtracting the lowest number.").pack()
def roll_stats():
    def rollstat():
        global stat
        stat = []
        stat.append(random.choice(d6))
        for number in stat:
            if len(stat) < 4:
                stat.append(random.choice(d6))
            if len(stat) == 4:
                break
        low = min(stat)
        global stat1
        stat1 = sum(stat) - low
    stat_value = []
    rollstat()
    stat_value.append(stat1)
    tkinter.Label(window, text = "First rolled stat: %s. Stat value: %s" % (stat, stat1)).pack()

    rollstat()
    stat_value.append(stat1)
    tkinter.Label(window, text="Second rolled stat: %s. Stat value: %s" % (stat, stat1)).pack()

    rollstat()
    stat_value.append(stat1)
    tkinter.Label(window, text="Third rolled stat: %s. Stat value: %s" % (stat, stat1)).pack()

    rollstat()
    stat_value.append(stat1)
    tkinter.Label(window, text="Fourth rolled stat: %s. Stat value: %s" % (stat, stat1)).pack()

    rollstat()
    stat_value.append(stat1)
    tkinter.Label(window, text="Fifth rolled stat: %s. Stat value: %s" % (stat, stat1)).pack()

    rollstat()
    stat_value.append(stat1)
    tkinter.Label(window, text="Sixth rolled stat: %s. Stat value: %s" % (stat, stat1)).pack()

    value = sum(stat_value)
    tkinter.Label(window, text = "Your full stat value is %s/108" % value).pack()
tkinter.Button(window, text = "ROLL!", command = roll_stats).pack()

window.mainloop()
  

Также, если кто-нибудь знает, как я мог бы еще больше уменьшить код (до того, как он был как минимум в два раза длиннее), мне было бы более чем интересно узнать, как это сделать.

Комментарии:

1. Вы пробовали config() метод? и строки f предназначены для того, чтобы облегчить вам жизнь, но выбор заполнителей здесь делает ваш код длиннее.

Ответ №1:

Здесь я использую config() метод для обновления виджетов ярлыков. Сначала вам нужно будет объявить метки и присвоить им переменную вне функции. Нравится:

 first = tkinter.Label(window) #recommended to use import tkinter as tk and then tk.Label(...)
second = tkinter.Label(window)
third = tkinter.Label(window)
fourth = tkinter.Label(window)
fifth = tkinter.Label(window)
sixth = tkinter.Label(window)
avg = tkinter.Label(window)
  

Тогда теперь внутри функции вы можете использовать config для этих переменных и pack() для них, например:

 first.config(text=f"First rolled stat: {stat}. Stat value: {stat1}") #say this to all the widgets
first.pack()

  

Я заменил все заполнители на f строки, поскольку это проще, и служит той же цели здесь.

Итак, вот весь ваш код, отформатированный более четко.

 import tkinter as tk
import random

window = tk.Tk()
window.title("Damp;D Stat Roller")
window.geometry("600x250")

start_label = tk.Label(window, text="Welcome to Damp;D Stat Roller").pack()
d6 = [1, 2, 3, 4, 5, 6]
how_to = tk.Label(window, text="""Rolled stats are determined by trowing a d6 4 times and 
subtracting the lowest number.""")
how_to.pack()


def roll_stats():
    def rollstat():
        global stat
        stat = []
        stat.append(random.choice(d6))
        for number in stat:
            if len(stat) < 4:
                stat.append(random.choice(d6))
            if len(stat) == 4:
                break
        low = min(stat)
        global stat1
        stat1 = sum(stat) - low

    stat_value = []
    rollstat()
    stat_value.append(stat1)
    first.config(text=f"First rolled stat: {stat}. Stat value: {stat1}")
    first.pack()

    rollstat()
    stat_value.append(stat1)
    second.config(text=f"Second rolled stat: {stat}. Stat value: {stat1}")
    second.pack()

    rollstat()
    stat_value.append(stat1)
    third.config(text=f"Third rolled stat: {stat}. Stat value: {stat1}")
    third.pack()

    rollstat()
    stat_value.append(stat1)
    fourth.config(text=f"Fourth rolled stat: {stat}. Stat value: {stat1}")
    fourth.pack()

    rollstat()
    stat_value.append(stat1)
    fifth.config(text=f"Fifth rolled stat: {stat}. Stat value: {stat1}")
    fifth.pack()

    rollstat()
    stat_value.append(stat1)
    sixth.config(text=f"Sixth rolled stat: {stat}. Stat value: {stat1}")
    sixth.pack()

    value = sum(stat_value)
    avg.config(text=f"Your full stat value is {value}/108")
    avg.pack()


tk.Button(window, text="ROLL!", command=roll_stats).pack()

first = tk.Label(window)
second = tk.Label(window)
third = tk.Label(window)
fourth = tk.Label(window)
fifth = tk.Label(window)
sixth = tk.Label(window)
avg = tk.Label(window)


window.mainloop()
  

Если возникнут какие-либо ошибки, дайте мне знать.

Комментарии:

1. Спасибо, это было действительно полезно, и потому что я учусь по мере того, как я иду и ищу то, что работает для меня (уничтожить и удалить не сработало, вероятно, сделал это неправильно), я играл с конфигурацией после того, как вы предложили, но у меня все еще были некоторые проблемы с тем, как их использовать в этом, но благодаря вам теперь я знаю, что я сделал не так. И я узнал f string, которые, на мой взгляд, более чистые.