Python GUI постоянно повторяет одну и ту же фразу - PullRequest
0 голосов
/ 18 марта 2019

Я пытаюсь создать графический интерфейс, используя tkinter.В этом графическом интерфейсе пользователь должен угадать путанную фразу.Проблема в том, что список, представленный в функции startgame, возвращает только последний элемент.Кроме того, вместо того, чтобы каждый раз получать правильные смешанные фразы при правильном угадывании, я продолжаю получать одну и ту же беспорядочную фразу только с измененным порядком ее перемешивания.

Вот полный код.

 #GUI app logic
import random
from tkinter import *
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']
score = 0
user_list=[]
time= 0
for i in range(1,11,1):
    user_list.append(random.choice(tv_shows))

print(user_list)


def jumble(word):   
    jum=" "
    while word:
        pos=random.randrange(len(word))
        jum +=word[pos]
        word=word[:pos]+word[(pos + 1):]
    return jum

def sen_jumble(w):
    l=[]
    for i in w:
        new = jumble(i)
        l.append(new)
    l=" ".join(l)
    return l

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()
    if time>0:
        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)


def timetaken():
   global time
   if time>=0:
      time += 1
      timeout.config(text = "Time : "+ str(time))
      timeout.after(1000, timetaken)

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

rules = Label(main, text="Guess the correct Tv-show name for the jumbled one shown")
rules.pack()

word = Label(main)
word.pack()

score_display = Label(main)
score_display.pack()

timeout = Label(main)
timeout.pack()

guess = Entry(main)
main.bind('<Return>',start_game)
guess.pack()
guess.focus_set()

main.mainloop()    

Ответы [ 2 ]

1 голос
/ 18 марта 2019

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

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

0 голосов
/ 18 марта 2019

Эта часть:

    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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...