Есть ли способ исправить мою программу, так как она не добавляется должным образом? - PullRequest
0 голосов
/ 21 января 2020

Я написал этот код только сегодня, поэтому может быть много ошибок. Числа, обрабатываемые во второй функции номеров классов, добавляются неправильно. Я не знаю, почему. Для получения дополнительной информации я использую python IDLE версии 3.8. Пожалуйста, не раздавайте ответ и объясните мне, почему это не работает. Я предполагаю, что это связано с использованием .value слишком много или неуместно. Пример изображения: [1]: https://i.stack.imgur.com/GXyre.png Новое изображение: [2]: https://i.stack.imgur.com/Ayjqw.png Код:

from tkinter import *
from random import randint
#number assignments
class nums:
    def __init__(self):
        self.value=randint(1,100)
    def assignnewnums(master,oldnum1,oldnum2,lbltxt,lbl,answer):
        getans = answer.get()
        if(int(getans)==(oldnum1.value+oldnum2.value)):
           oldnum1=nums()
           oldnum2=nums()
           display = Label(master,text="Correct",bg="black",fg="red").pack(side=RIGHT)
           lbltxt="What is {} + {}".format(oldnum1.value,oldnum2.value)
           lbl.config(text=lbltxt)
        else:
            display = Label(master,text="Incorrect",bg="black",fg="red").pack(side=RIGHT)
            lbltxt="What is {} + {}".format(oldnum1.value,oldnum2.value)
            lbl.config(text=lbltxt)
a = nums()
b = nums()
#GUI startup
root = Tk()
#Label
title = Label(root, text="AddPrac", fg="dark blue")
title.pack()
#Question
questxt = "What is {} + {}".format(a.value,b.value)
ques = Label(root,text=questxt,fg="red")
ques.pack()
#UserAnswer
ans = Entry(root)
ans.pack()
#SubmitButton
enter = Button(root,text="Submit Answer!",fg="yellow",command=lambda: nums.assignnewnums(root,a,b,questxt,ques,ans))
enter.pack()
#GUI continued startup
root.mainloop()







Ответы [ 2 ]

2 голосов
/ 21 января 2020

Вы создаете a и b и никогда не обновляете их. В python аргументы передаются по присваиванию. Некоторые типы данных являются изменяемыми, а другие нет. Если переданный аргумент является изменяемым, то метод получает ссылку на объект.

С помощью ссылки метод может изменить атрибут объекта nums (то есть oldnum1.value и oldnum2.value). Однако, если ссылка когда-либо возвращается к чему-то другому (то есть oldnum1 = nums () и oldnum2), внешняя область не будет знать об этом изменении, и внешняя ссылка все еще будет указывать на старые значения (a и b) после функции заканчивается.

Вместо того, чтобы связывать здесь целые объекты nums

oldnum1=nums()
oldnum2=nums()

вы можете изменить атрибуты значений этих объектов.

oldnum1.value = randint(1,100)
oldnum2.value = randint(1,100)

Это приведет к мутированию a и b по ссылке вместо повторного связывания ссылки и ее потери в методе assignnewnums.

1 голос
/ 21 января 2020

a и b не обновляются. Ваша функция обновляет метку новыми значениями для oldnum1 и oldnum2, но ваша кнопка отправки принимает a и b в качестве аргументов. Бьюсь об заклад, если вы отправите тот же ответ во второй и третий раз, как и в первый раз, он скажет, что вы правы.

Обновление:

Класс определенно усложняет ситуацию, но экспериментирует это хорошо. Вот пример вашего класса, который работает:

class nums:
    def __init__(self):
        self.assignnewnums()
    def check(master,oldnum1,oldnum2,lbltxt,lbl,answer):
        getans = answer.get()
        if(int(getans)==(oldnum1.value+oldnum2.value)):
           oldnum1.assignnewnums()
           oldnum2.assignnewnums()
           display = Label(master,text="Correct",bg="black",fg="red").pack(side=RIGHT)
           lbltxt="What is {} + {}".format(oldnum1.value,oldnum2.value)
           lbl.config(text=lbltxt)
        else:
            display = Label(master,text="Incorrect",bg="black",fg="red").pack(side=RIGHT)
            lbltxt="What is {} + {}".format(oldnum1.value,oldnum2.value)
            lbl.config(text=lbltxt)
    def assignnewnums(self):
        self.value=randint(1,100)

assignnewnums теперь изменяет атрибут значения объекта nums. Вы заметите, что вместо создания новых объектов nums в функции проверки мы используем assignnewnums для сохранения этих объектов, а просто присваиваем им новые значения.

Убедитесь, что вы изменили команду Button на nums.check (args ) вместо nums.assignnewnums (args)

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