2016-03-30 2 views
0

Я пытаюсь создать графический интерфейс с помощью tkinter. Это мой код:Ярлык не обновляется

from tkinter import * 
from random import randint 

B3Questions = ["How is a cactus adapted to a desert environment?", "What factors could cause a species to become extinct?"] 
B3Answers = ["It has leaves reduced to spines to cut water loss, a thick outer layer to cut down water loss and a deep-wide spreading root system to obtain as much water as possible", "Increased competition, new predators and new diseases"] 
B3Possibles = [x for x in range (len(B3Questions))] 

def loadGUI(): 

    root = Tk() #Blank Window 

    questNum = generateAndCheck() 
    questionToPrint = StringVar() 
    answer = StringVar() 

    def showQuestion(): 

     questionToPrint.set(B3Questions[questNum]) 

    def showAnswer(): 

     answer.set(B3Answers[questNum]) 

    def reloadGUI(): 

     global questNum 
     questNum = generateAndCheck() 
     return questNum 

    question = Label(root, textvariable = questionToPrint) 
    question.pack() 

    answerLabel = Label(root, textvariable = answer, wraplength = 400) 
    answerLabel.pack() 

    bottomFrame = Frame(root) 
    bottomFrame.pack() 
    revealAnswer = Button(bottomFrame, text="Reveal Answer", command=showAnswer) 
    revealAnswer.pack(side=LEFT) 
    nextQuestion = Button(bottomFrame, text="Next Question", command=reloadGUI) 
    nextQuestion.pack(side=LEFT) 

    showQuestion() 
    root.mainloop() 

def generateAndCheck(): 

    questNum = randint(0, 1) 
    print(questNum) 

    if questNum not in B3Possibles: 
     generateAndCheck() 
    else: 
     B3Possibles.remove(questNum) 
     return questNum 

В принципе, при нажатии «Следующий вопрос» метка вопроса не обновляется. Повторное нажатие «Следующий вопрос» переведет код в хороший цикл ошибок.

Я честно не могу видеть, куда я иду неправильно, но это, вероятно, из-за моего отсутствия опыта

+0

Вы на самом деле не обновляет содержимое '' StringVar' questionToPrint' при вызове 'reloadGUI()'. – RobertR

+0

Как мне это сделать? –

+1

Ошибка, которую вы получаете после нажатия Next Question во второй раз, состоит в том, что в вашем списке номеров ничего нет. Поэтому ваша функция 'reloadGUI' будет продолжать работать до тех пор, пока вы не нажмете рекурсивный предел Python. – Dzhao

ответ

0

Во-первых, короткий ответ, что вы на самом деле не обновляя содержание StringVarquestionToPrint. Я бы это исправить, изменив reloadGUI() функцию следующим образом:

def reloadGUI(): 
    global questNum 
    questNum = generateAndCheck() 
    showQuestion() 
    answer.set("") # Clear the answer for the new question 

Кроме того, как указал Джао, причина вы получаете ошибку после запуска из вопросов, потому что вам нужно поставить какую-то защиту в пределах вашей функции generateAndCheck() для предотвращения бесконечной рекурсии.

Кроме того, я бы порекомендовал вам изменить способ определения того, какой вопрос задавать, потому что то, как у вас есть это прямо сейчас, излишне сложно. Посмотрите на модуль random немного больше, особенно функцию random.choice(). Вы заметите, что он поднимает IndexError, когда список пуст, поэтому вы можете поймать эту ошибку, и это поможет решить проблему, о которой указал Джао.

+0

Это приводит к тому же эффекту, что и раньше - метка вопроса не изменяется, и возникает цикл ошибок –

0

RobertR ответил на ваш первый вопрос. Причина, по которой вы получаете сообщение об ошибке при повторном нажатии кнопки Next Question, состоит в том, что ваш список B3Possibilities имеет два номера: 0 и 1. Поэтому, когда вы дважды запускаете эту функцию, вы удаляете как один, так и нулевой из этого списка. Тогда у вас есть пустой список. Когда вы вызываете reloadGUI в третий раз, вы никогда не ударите свой оператор else, потому что генерируемый randint НИКОГДА не будет в B3Possibilites. Вызывается предложение if, и вы погружаетесь в неконкурентный рекурсивный вызов.

Решение этой проблемы может быть, чтобы иметь чек в вашей generageAndCheck функции:

if(len(B3Possibiles) == 0): 
    #run some code. Maybe restart the program? 
Смежные вопросы