J'essaie de créer une interface graphique à l'aide de tkinter. Dans cette interface graphique, l'utilisateur doit deviner la phrase brouillée. Le problème est que la liste présente dans la fonction startgame ne renvoie que le dernier élément. De plus, au lieu d'obtenir différentes phrases brouillées à chaque fois sur une supposition correcte, je continue à obtenir la même phrase brouillée avec juste l'ordre dans lequel elle est brouillée.

Voici le code complet.

 #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()    
0
Nikhil Verma 18 mars 2019 à 19:25

2 réponses

Meilleure réponse

Le problème avec votre code est que <RETURN> est lié à start_game(), donc pendant que vous croyez parcourir les suppositions et les réponses, le fait est que chaque fois que l'utilisateur frappe <RETURN> sur sa réponse , une nouvelle instance de start_game() commence! Nous devons plutôt séparer la configuration du nouveau mot (aka start_game() de l'événement <RETURN> (aka score_game()).

J'ai retravaillé votre code dans ce sens ci-dessous - pour plus de simplicité, j'ai jeté le code de synchronisation tout à fait car il était cassé et ne faisait pas partie de votre question:

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()

Vous devrez ajouter à nouveau dans le scénario de fin de partie. Vous pouvez limiter le nombre de tours en tronquant jumble_list.

1
cdlane 18 mars 2019 à 17:59

Cette partie:

    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)

Votre boucle for ne vous attendra pas pour terminer la supposition. Il termine toujours la boucle et configure votre widget word 10 fois jusqu'à ce qu'il atteigne le dernier. Vous pouvez vous débarrasser de la boucle for et avancer la base d'index de liste sur le score actuel:

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 18 mars 2019 à 16:59