как я могу сделать переменную tkinter, установленную как случайное изменение int при переборе цикла for - PullRequest
0 голосов
/ 09 апреля 2020

Я изучаю python и пытаюсь сделать объявление ie. Он в основном функционален, но этот небольшой кусочек кода не работает должным образом.

Цель программы состоит в том, чтобы взять пользовательский ввод для числа бросаемых костей и количества граней на кости, и выводить случайные числа для каждого d ie, в пределах диапазона (количества граней)

def die_count(*args):
    x = 0
    count = int(total.get())
    faces = int(sides.get())
    for i in range(count):
        die_value.set(random.randint(1, faces))
        ttk.Label(frame, textvariable = die_value).grid(row = 3, column = x)
        x = x + 1

Я также просто изучаю tkinter, так что, возможно, есть некоторое загадочное поведение .set () , который я еще не изучил ... Я ожидал бы, что этот код будет повторяться через l oop count раз, переназначая die_value каждый раз. Он зацикливается правильно, но die_value остается неизменным в каждой метке.

пример вывода для входов total = 3 и face = 6, будет 5 5 5, а при повторном запуске 3 3 3, или любые другие числа в диапазоне повторяются «общее» количество раз.

Диапазон для выходов правильный, так как он никогда не выходит за пределы значения, введенного для сторон. Отдельные значения, тем не менее, должны отличаться друг от друга, и я не уверен, что их не должно быть.

ниже приведен весь код (я знаю, что это горячий беспорядок, но я хочу заставить его работать, а затем сделать его красивым)

import random
from tkinter import *
from tkinter import ttk

window = Tk()
window.title("die roll")
window.geometry("500x500")


def die_count(*args):
    x = 0
    count = int(total.get())
    faces = int(sides.get())
    for i in range(count):
        die_value.set(random.randint(1, faces))
        ttk.Label(frame, textvariable = die_value).grid(row = 3, column = x)
        x = x + 1

die_value = IntVar()
total = IntVar()
sides = IntVar()

ttk.Label(window, text='how many dice would \n you like to roll?',borderwidth=1).grid(row=0,column=0)

ttk.Entry(window,textvariable=total).grid(row=0,column=1)

ttk.Label(window, text='how many sides \n should the dice have?',borderwidth=1).grid(row=1,column=0)

ttk.Entry(window, textvariable=sides).grid(row=1,column=1)

ttk.Button(window, text="Roll", command = die_count).grid(row = 2,column=0)

frame = ttk.Frame(window).grid(row=2, column=1)

window.mainloop()

Ответы [ 2 ]

0 голосов
/ 09 апреля 2020

Вот код:

def die_count(*args):
    x = 0
    count = int(total.get())
    faces = int(sides.get())
    for i in range(count):
        ttk.Label(frame, text = random.randint(1, faces)).grid(row = 3, column = x)
        x += 1

Я изменил текстовую переменную на текст, потому что это «привязало бы» textvariable, поэтому каждый раз, когда вы меняли textvariable, оно меняло бы значение (именно поэтому все они закончили со значением последнего броска). С text этого не происходит.

0 голосов
/ 09 апреля 2020

Кажется, у вас есть только один экземпляр die_value. Я предполагаю, что ваши ярлыки нужны по одному:

    for i in range(count):
        die_value = IntVar()
        die_value.set(random.randint(1, faces))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...