Python генератор случайных чисел не работает должным образом

outcomeG = "0"
outcomeB = "0"

def roll(outcomeG, outcomeB):

    outcomeG = random.randint(1, 6)
    outcomeB = random.randint(1, 5)
    return outcomeG, outcomeB

def goodDiceRoll():

    goodDiceOptions.destroy()

    global goodDiceRoll
    goodDiceRoll = tkinter.Tk()
    goodDiceRoll.title("Green Dice roll")

    lbloutcome = tkinter.Label(goodDiceRoll, text="Press roll")
    btnRollG = tkinter.Button(goodDiceRoll, text="Roll", command=roll(outcomeG, outcomeB))

    if outcomeG == "1":
        lbloutcome.config(text="Green 1")
        goodDiceRoll.update()
        f = open("Logs.txt", "a")
        ts = time.time()
        sttime = datetime.datetime.fromtimestamp(ts).strftime('%Y%m%d_%H:%M:%S - ')
        f.write(sttime + "Green 1")
        f.close()

    elif outcomeG == "2":
        lbloutcome.config(text="Green 2")
        goodDiceRoll.update()
        f = open("Logs.txt", "a")
        ts = time.time()
        sttime = datetime.datetime.fromtimestamp(ts).strftime('%Y%m%d_%H:%M:%S - ')
        f.write(sttime + "Green 2")
        f.close()
        #rest of code

Это мой код, который позволяет вам бросать зеленые или красные кубики и затем помещать их в файл. Однако, когда я нажимаю кнопку прокрутки, которую я сделал, предполагается, что случайное число от 1 до 6 и отображает его, но то, что действительно происходит, абсолютно ничего. Как я могу это исправить? Любая помощь будет высоко ценится.

2 ответа

Решение

Если вы делаете roll(outcomeG, outcomeB) тогда не ожидайте, что эти две глобальные переменные изменятся. Они останутся 0. Это потому, что (параметр) переменные внутри roll являются локальными для этой функции. Любое присвоение этим переменным не повлияет на переменные, которые были переданы в функцию.

Если вы тогда позвоните goodDiceRoll() if блоки не будут введены, так как значения этих переменных по-прежнему равны 0, и, как следствие, ничего не записывается в файл.

Вы можете решить это, выполнив:

outcomeG, outcomeB = roll()

... и удалить параметры из roll определение.

Но, как вы не называете roll таким образом, но передайте ссылку на него через:

btnRollG = tkinter.Button(goodDiceRoll, text="Roll", command=roll)

... вы вынуждены использовать глобальные переменные. Так что измени roll как это:

def roll():
    global outcomeG, outcomeB  
    outcomeG = random.randint(1, 6)
    outcomeB = random.randint(1, 5)

Не забудьте также определить их как таковые в goodDiceRoll,

Во-вторых, это действительно плохая идея назначить goodDiceRoll, который действительно уничтожает предыдущее значение, то есть функцию, в которой вы находитесь. Это сделает функцию недоступной после первого вызова. Используйте другое имя переменной.

Если то, что вы опубликовали, является полным кодом, то вряд ли что-то будет написано, поскольку вы включаете только случаи для зеленых кубиков, бросающих "1" или "2". Вместо использования операторов if для работы с различными случаями бросков, вы должны сделать что-то вроде этого:

    f = open("Logs.txt", "a")
    ts = time.time()
    sttime = datetime.datetime.fromtimestamp(ts).strftime('%Y%m%d_%H:%M:%S - ')
    f.write(sttime + "Green " + outcomeG + ",\n")
    f.write(sttime + "Blue " + outcomeB + "\n")
    f.close()

Также вам необходимо убедиться, что при вызове функции roll вы можете получить доступ к этим данным.

Другие вопросы по тегам