Почему мои локальные переменные не меняются в значении, несмотря на то, что их вызывают в моих функциях? - PullRequest
0 голосов
/ 14 февраля 2019

В программе, которую я пытаюсь создать, я использую Turtle для создания 12-часового цифрового будильника, где каждое число (чч: мм) меняется так, как если бы часы проходили через 24-часовой день.Однако некоторые переменные, которые я использую для установки числа для минут и часовой стрелки, не меняются в значении, даже если я настроил их для добавления их при соблюдении определенных условий.

Итак, я установил черепах, чтобы нарисовать стол, а корпус и циферблат часов на этом столе.Но что еще более важно, я сделал 6 черепах, одну для точек между номерами часов и минут, одну для AM / PM и одну для каждого из чисел.Все они нарисованы отдельными функциями для каждой из черепах, которые я описал выше.У меня есть отдельный документ .txt, строки которого состоят из 5 битов, соответствующих точкам, где каждая цифра должна была измениться.С помощью функции AM / PM и функции десятичного числа часов я установил базовый оператор if и else, где, если бы бит, соответствующий этой конкретной функции, получился как 0, то место десятки должно было бы выйти как 0,или если бит получен как 1, он получится как 1. Однако для остальных чисел, если бит вышел как 0, соответствующая функция будет повторять последний сделанный рисунок, который будет сохранен в своем собственномфункция.Если бит получен как 1, он будет сохранен в переменной, которая затем будет использоваться в операции модуля с другой переменной, которая выдаст число, соответствующее следующему номеру цикла или вращения.Например, для своей минутной стрелки числа, которые могут появиться, равны 0, 1, 2, 3, 4, 5, 6, 7, 8 и 9. Если операция модуля получается 3, то число будетбыть 3. Кроме того, 3 будет сохранен в переменной, так что, когда бит выйдет как 0, функция может показывать число раньше.Кроме того, если операция модуля получилась как 0, то вторая переменная, которую я описал в функции модуля, будет добавляться с определенным числом каждый раз.В случае с минутной стрелкой это число равно 10. Вот и все.Мой код ниже:

#Program Setup
import turtle
import time
num = turtle.Turtle()
num2 = turtle.Turtle()
num3 = turtle.Turtle()
num4 = turtle.Turtle()
text = turtle.Turtle()
binlist = []
com = 12
com1 = 6
com2 = 10
bits = 0
bits1 = 0
bits2 = 0
#Function Setup
def hour1(bit1,g):
    if int(bit1) == 0:
        num.clear()
        g = num.write("0",False,"center",("alarm clock",100,"normal"))
    else:
        num.clear()
        g = num.write("1",False,"center",("alarm clock",100,"normal"))
def hour2(bit2,g1,bits,com):
    if int(bit2) == 0:
        num2.clear()
        g1
    else:
        bits +=1
        return bits
        if int(bits) % int(com) == 1:
            num2.clear()
            g1 = num2.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 2:
            num2.clear()
            g1 = num2.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 3:
            num2.clear()
            g1 = num2.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 4:
            num2.clear()
            g1 = num2.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 5:
            num2.clear()
            g1 = num2.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 6:
            num2.clear()
            g1 = num2.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 7:
            num2.clear()
            g1 = num2.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 8:
            num2.clear()
            g1 = num2.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 9:
            num2.clear()
            g1 = num2.write("9",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 10:
            num2.clear()
            g1 = num2.write("0",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % int(com) == 11:
            num2.clear()
            g1 = num2.write("1",False,"center",("alarm clock",100,"normal"))
        else:
            num2.clear()
            g1 = num2.write("2",False,"center",("alarm clock",100,"normal"))
            com += 12
            return com
def min1(bit3,g2,bits1,com1):
    if int(bit3) == 0:
        num3.clear()
        g2
    else:
        bits1 += 1
        return bits1
        if int(bits1) % int(com1) == 1:
            num3.clear()
            g2 = num3.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 2:
            num3.clear()
            g2 = num3.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 3:
            num3.clear()
            g2 = num3.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 4:
            num3.clear()
            g2 = num3.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % int(com1) == 5:
            num3.clear()
            g2 = num3.write("5",False,"center",("alarm clock",100,"normal"))
        else:
            num3.clear()
            g2 = num3.write("0",False,"center",("alarm clock",100,"normal"))
            com1 += 6
            return com1
def min2(bit4,g3,bits2,com2):
    if int(bit4) == 0:
        g3
    else:
        bits2 += 1
        return bits2
        if int(bits2) % int(com2) == 1:
            num4.clear()
            g3 = num4.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 2:
            num4.clear()
            g3 = num4.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 3:
            num4.clear()
            g3 = num4.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 4:
            num4.clear()
            g3 = num4.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 5:
            num4.clear()
            g3 = num4.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 6:
            num4.clear()
            g3 = num4.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 7:
            num4.clear()
            g3 = num4.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 8:
            num4.clear()
            g3 = num4.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % int(com2) == 9:
            num4.clear()
            g3 = num4.write("9",False,"center",("alarm clock",100,"normal"))
        else:
            num4.clear()
            g3 = num4.write("0",False,"center",("alarm clock",100,"normal"))
            com2 += 10
            return com2
def meridiem(bit5,g4):
    if int(bit5) == 0:
        text.clear()
        g4 = text.write("AM",False,"center",("alarm clock",25,"normal"))
    else:
        text.clear()
        g4 = text.write("AM",False,"center",("alarm clock",25,"normal"))
f = open("ikeokereke.txt","r")
for line in f:
    binlist.append(line.rstrip('\n'))
for e in binlist:
    bit1 = e[0:1]
    bit2 = e[1:2]
    bit3 = e[2:3]
    bit4 = e[3:4]
    bit5 = e[4:5]
    time.sleep(.5)
    hour1(bit1,g)
    hour2(bit2,g1,bits,com)
    min1(bit3,g2,bits1,com1)
    min2(bit4,g3,bits2,com2)
    meridiem(bit5,g4)
    print(bits)
    print(bits1)
    print(bits2)
    print(com)
    print(com1)
    print(com2)

Ожидаемый результат: Нормальный, работающий цифровой будильник. Фактический результат: часовая стрелка десятки, обозначенная как 0, и минутная стрелка первой, обозначенная как 0, а другаядва числа даже не появляются.

ikeokereke.txt

https://docs.google.com/document/d/e/2PACX-1vT6O_NqKrKR0tC8IPvoItwmJL0uCgbUJsBK0xH62IHAfx_nJxD62DuKjc8Ih93YyMKsNGn0EP6Nxu6Q/pub

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Мне удалось решить проблему, увеличив переменные в циклах for вместо самих функций.Изменение в коде ниже:

#Program Setup
import turtle
import time
#...
num = turtle.Turtle()
num2 = turtle.Turtle()
num3 = turtle.Turtle()
num4 = turtle.Turtle()
circles = turtle.Turtle()
text = turtle.Turtle()
binlist = []
bits = 0
bits1 = 0
bits2 = 0
firsthour = True
#Function Setup
#...
def hour1(bit1):
    if int(bit1) == 0:
        num.clear()
        num.write("0",False,"center",("alarm clock",100,"normal"))
    else:
        num.clear()
        num.write("1",False,"center",("alarm clock",100,"normal"))
def hour2(bit2,bits,firsthour):
    if int(bit2) == 0:
        if firsthour == True:
            num2.write("2",False,"center",("alarm clock",100,"normal"))
        else:
            num2.clear()
            num2.write(,False,"center",("alarm clock",100,"normal"))
    else:
        if int(bits) % 12 == 1:
            num2.clear()
            num2.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 2:
            num2.clear()
            num2.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 3:
            num2.clear()
            num2.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 4:
            num2.clear()
            num2.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 5:
            num2.clear()
            num2.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 6:
            num2.clear()
            num2.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 7:
            num2.clear()
            g1 = num2.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 8:
            num2.clear()
            num2.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 9:
            num2.clear()
            num2.write("9",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 10:
            num2.clear()
            num2.write("0",False,"center",("alarm clock",100,"normal"))
        elif int(bits) % 12 == 11:
            num2.clear()
            num2.write("1",False,"center",("alarm clock",100,"normal"))
        else:
            num2.clear()
            num2.write("2",False,"center",("alarm clock",100,"normal"))
def min1(bit3,bits1):
    if int(bit3) == 0:
        num3.clear()
        num3.write(,False,"center",("alarm clock",100,"normal"))
    else:
        if int(bits1) % 6 == 1:
            num3.clear()
            num3.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 2:
            num3.clear()
            num3.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 3:
            num3.clear()
            num3.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 4:
            num3.clear()
            num3.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits1) % 6 == 5:
            num3.clear()
            num3.write("5",False,"center",("alarm clock",100,"normal"))
        else:
            num3.clear()
            num3.write("0",False,"center",("alarm clock",100,"normal"))
def min2(bit4,bits2):
    if int(bit4) == 0:
        num4.clear()
        num4.write(str(bits2),False,"center",("alarm clock",100,"normal"))
    else:
        if int(bits2) % 10 == 1:
            num4.clear()
            num4.write("1",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 2:
            num4.clear()
            num4.write("2",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 3:
            num4.clear()
            num4.write("3",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 4:
            num4.clear()
            num4.write("4",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 5:
            num4.clear()
            num4.write("5",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 6:
            num4.clear()
            num4.write("6",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 7:
            num4.clear()
            num4.write("7",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 8:
            num4.clear()
            num4.write("8",False,"center",("alarm clock",100,"normal"))
        elif int(bits2) % 10 == 9:
            num4.clear()
            num4.write("9",False,"center",("alarm clock",100,"normal"))
        else:
            num4.clear()
            num4.write("0",False,"center",("alarm clock",100,"normal"))
def dots():
    circles.speed(0)
    circles.dot(20,"red")
    circles.penup()
    circles.left(90)
    circles.forward(50)
    circles.pendown()
    circles.dot(20,"red")
    circles.hideturtle()
def meridiem(bit5):
    if int(bit5) == 0:
        text.clear()
        text.write("AM",False,"center",("alarm clock",25,"normal"))
    else:
        text.clear()
        text.write("PM",False,"center",("alarm clock",25,"normal"))

#Main Program
#...
f = open("ikeokereke.txt","r")
for line in f:
    binlist.append(line.rstrip('\n'))
for e in binlist:
    bit1 = e[0:1]
    bit2 = e[1:2]
    bit3 = e[2:3]
    bit4 = e[3:4]
    bit5 = e[4:5]
    time.sleep(.5)
    if int(bit2) == 1:
        bits += 1
    if int(bit3) == 1:
        bits1 += 1
    if int(bit4) == 1:
        bits2 += 1
    if int(bits) == 1:
        firsthour = False
    hour1(bit1)
    hour2(bit2,bits,firsthour)
    min1(bit3,bits1)
    min2(bit4,bits2)
    meridiem(bit5)
0 голосов
/ 14 февраля 2019

Даже этот небольшой фрагмент кода имеет много проблем:

def hour2(bit2,g1,bits,com):
    if int(bit2) == 0:
        num2.clear()
        g1
    else:
        bits +=1
        return bits
        if int(bits) % int(com) == 1:
            ...

В частности:

  • g1 никогда не определяется нигде, поэтому вызов hour2(bit2,g1,bits,com)не может работать.

  • есть ли какие-либо возможные значения для g1, которые имели бы смысл для помещения g1 в строку как часть вашего кода?

  • увеличивать bits и возвращать его не имеет смысла, поскольку ничто не смотрит на возвращаемое значение вызова hour2(), и если bits подразумевается как глобальная переменная, это не будет работатьпоскольку в функции нет оператора global.

  • тридцать или около того строк кода после оператора return bits никогда не будут выполнены, когда вы покинули функцию.

  • и bits, и com уже являются целыми числами, поэтому, вызывая int() для них снова и снова, кажется, указывает на отсутствие понимания вашего собственного дизайна.

...