Python GUI постоянно повторяет одну и ту же фразу

Для полного ответа проверьте документацию:

http://php.net/manual/en/language.variables.scope.php

0
задан Pikachu the Purple Wizard 19 March 2019 в 00:11
поделиться

2 ответа

Проблема с вашим кодом заключается в том, что <RETURN> связан с start_game(), поэтому, хотя вы считаете, что просматриваете догадки и ответы, факт заключается в том, что каждый раз, когда пользователь нажимает <RETURN> в своем ответе, новый экземпляр start_game() начинается! Вместо этого нам нужно разделить настройку нового слова (aka start_game() из события <RETURN> (aka score_game()).

Я переработал ваш код в этих строках ниже - для простоты я бросил временный код в целом, так как он был разбит и не является частью вашего вопроса:

from random import shuffle
from tkinter import *

JUMBLED, PLAINTEXT = 0, 1

tv_shows = [
    'Game of Thrones', 'Friends', 'How I Met Your Mother', 'Breaking Bad', 'Narcos', 'Flash', 'Arrow', 'Big Bang Theory',
    'Walking Dead', 'Agents Of Shield', 'Blue Planet 2', 'Legion', 'The Grand Tour', 'Band Of Brothers', 'Westworld'
    'Sherlock', 'The Punisher', 'True Detective', 'Daredevil', 'Luke Cage', 'Jessica Jones', 'Iron Fist', 'Stranger Things',
    'Rick and Morty', 'House of Cards', '13 Reasons Why', 'House MD', 'Castle', 'Doctor Who', 'Dexter', 'Suits'
]

def word_jumble(word):
    letters = list(word)

    shuffle(letters)

    return "".join(letters)

def sentence_jumble(w):
    words = w.split()

    shuffle(words)

    return " ".join(word_jumble(word) for word in words)

def start_game():
    global jumble

    guess.focus_set()

    jumble = jumble_list.pop()

    word.config(text="Jumbled Words => " + jumble[JUMBLED])

def score_game(event):
    global score

    if guess.get().lower() == jumble[PLAINTEXT].lower():
        guess.delete(0, END)

        score += 1
        score_display.config(text=str(score))

        if jumble_list:
            score_display.after(500, start_game)
        else:
            main.unbind('<Return>')

shuffle(tv_shows)

jumble_list = [(sentence_jumble(title), title) for title in tv_shows]

score = 0
jumble = None  # a tuple with (jumbled, plaintext)

main = Tk()
main.title("Guess What")
main.geometry("375x200")

Label(main, text="Guess the TV show name from the jumbled one shown").pack()

word = Label(main)
word.pack()

score_display = Label(main)
score_display.pack()
score_display.config(text=str(score))

guess = Entry(main)
guess.pack()
guess.focus_set()

main.bind('<Return>', score_game)

start_game()

main.mainloop()

Вам нужно будет добавить обратно в конце игрового сценария. Вы можете ограничить количество раундов, урезая [118 ].

0
ответ дан cdlane 19 March 2019 в 00:11
поделиться

Эта часть:

    for i in range(0,10,1):              
        word.config(text = "Jumbled Word => " + str(jumb_list[i]))

        if guess.get().lower() == user_list[i].lower():
            score += 1
            score_display.config(text = str(score))
            guess.delete(0,END)

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

def start_game(event):
    timetaken()
    jumb_list = []
    global score
    for i in user_list:
        r1 = sen_jumble(i.split())
        jumb_list.append(r1)
        guess.focus_set()
    word.config(text = "Jumbled Word => " + str(jumb_list[score]))
    if guess.get().lower() == user_list[score].lower():
        score += 1
        score_display.config(text = str(score))
        try:
            word.config(text="Jumbled Word => " + str(jumb_list[score]))
        except IndexError:
            word.config(text="You Win!")
            score = 0
        guess.delete(0,END)
0
ответ дан Henry Yik 19 March 2019 в 00:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: