Приращение переменной и цикл for в Python

#python #tkinter

#python #tkinter

Вопрос:

У меня есть следующий код:

 # -*- coding: utf-8 -*-

forbiddenWords=['for', 'and', 'nor', 'but', 'or', 'yet', 'so', 'not', 'a', 'the', 'an', 'of', 'in', 'to', 'for', 'with', 'on', 'at', 'from', 'by', 'about', 'as']

def clear_screen():
    button2.destroy()
    button3.destroy()
    text.destroy()
    label.destroy()

def main_page():
    var = StringVar()
    global label
    label = Label( root, textvariable=var)
    var.set("Fill in the caps: ")
    label.pack()

    global text
    text = Text(root,font=("Purisa",12))
    text.pack()

    global button
    button=Button(root, text ="Create text with caps.", command =lambda: full_function())
    button.pack()

def clear_and_main():
    clear_screen()
    main_page()

def new_sentences(sentenceList):
    global replaced_indexes
    global replaced_words
    replaced_indexes=[]
    replaced_words=[]
    global newsentences
    newsentences=[]
    for lause in sentenceList:
        import re
        from random import randint
        s6nade_arv=len(lause.split(' '))
        while True:
            asendatava_idx=randint(0,s6nade_arv-1)
            wordList = re.sub("[^w]", " ",  lause).split()
            asendatav_s6na=wordList[asendatava_idx]
            if asendatav_s6na.lower() not in forbiddenWords:
                replaced_indexes.append(asendatava_idx)
                replaced_words.append(asendatav_s6na)
                break
        uus_lause=lause.replace(asendatav_s6na, "______")
        newsentences.append(uus_lause)
    return newsentences

def IntoSentences(paragraph):
    paragraph = paragraph.decode('utf-8').replace(u'u014cu0106u014d','-')
    import nltk.data
    sent_detector = nltk.data.load('tokenizers/punkt/english.pickle')
    global sentenceList
    sentenceList = sent_detector.tokenize(paragraph.strip())
    return sentenceList

def full_function():
    global button2
    global button3
    IntoSentences(text.get(1.0,END))
    new_sentences(sentenceList)
    text.delete(1.0, END)
    button3=Button(root, text ="Main page", command=lambda: clear_and_main())
    button3.pack()
    button2=Button(root, text ="Answer", command=lambda: get_answers())
    button2.pack()
    button.destroy()
    for i in newsentences:
        text.insert(INSERT, str(i))

def get_answers():
    IntoSentences(text.get(1.0,END))
    i=0
    global correct_answers
    global false_answers
    correct_answers=0
    false_answers=0
    for lause in sentenceList:
        inserted_word=lause[replaced_indexes[i]]
        if inserted_word==replaced_words[i]:
            correct_answers=correct_answers 1
            i=i 1
        elif inserted_word!=replaced_words[i]:
            false_answers=false_answers 1
            i=i 1
    text.delete(1.0, END)
    text.insert(INSERT, "The number of correct answers: ")
    text.insert(END, correct_answers)
    text.insert(INSERT, "n")
    text.insert(INSERT, "The number of incorrect answers: ")
    text.insert(END, false_answers)


from Tkinter import *

root = Tk()

var = StringVar()
label = Label( root, textvariable=var)
var.set("Fill in the caps: ")
label.pack()

text = Text(root,font=("Purisa",12))
text.pack()

button=Button(root, text ="Create text with caps.", command =lambda: full_function())
button.pack()

root.mainloop()
  

Мое приложение работает нормально, но есть одна проблема. Проблема в функции get_answers(). Когда я вставляю текст и создаю текст с заглавными буквами, а также заполняю заглавные буквы, я получаю текст, в котором говорится, сколько у меня было правильных ответов и сколько ложных ответов. Но это всегда говорит только о последнем ответе. Например: я заполняю две заглавные буквы, первая правильная, вторая неправильная, программа выдает 0 правильных ответов, 1 неправильный. Как будто correct_answers и false_answers определены в цикле for и им присваивается значение 0 при каждом запуске функции для одного предложения. Что я должен изменить в своем коде, чтобы программа показывала правильные ответы?

Комментарии:

1. вы проверяли, перезаписывал ли он его?

2. Я только что понял, что цикл for выполняется только один раз. И вот почему он показывает такой неправильный вывод.

3. Почему вы используете global, когда у вас нет доступа к переменным вне какой-либо функции, в которой они объявлены, также вы используете newsentences и sentencelist в функциях без использования ключевого слова global .

Ответ №1:

Похоже, что ключ проблемы связан со строкой

 inserted_word=lause[replaced_indexes[i]]
  

где inserted_word — один символ, а не вставленное слово. Я полагаю, вы хотели разделить строку на отдельные слова, но эта функциональность упущена.

Комментарии:

1. Я уже решил это: code wordList = re.sub("[^w]", " ", lause).split() inserted_word=wordList[replaced_indexes[i]] но проблема в том, что программа принимает весь мой список «sentenceList» как одно предложение, и я не знаю почему. В более ранней функции new_sentences все работает нормально.

2. Я предполагаю, что другая проблема заключается в том, когда вы печатаете новый текст с подчеркиванием. Пробелы между точками предложения отсутствуют, поэтому из списка предложений: [«Foo.», «Bar.», «Zuf.»], который вы получаете, вы генерируете новый набор предложений на экране, который выглядит так ___.___.___. , что ваш код рассматривает как одно предложение, а не три.