#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, которые, на мой взгляд, более чистые.