Использование Python для обновления меток Tkinter - PullRequest
0 голосов
/ 30 мая 2018

Я нахожусь в процессе создания игры типа Hangman.До сих пор я написал CLI-версию, которая работает хорошо, я просто портирую ее для создания графического интерфейса.

Я застрял :-(. Программа не завершена, и есть еще кое-что дляно у меня есть две проблемы: первая - это обновление метки.

Когда буква выбрана, она создает достаточно тире для буквы и помещает ее в метку с именем «буква».

Когда пользователь вводит букву, он заменяет тире, однако затем он добавляет новую метку рядом со старой меткой, вместо этого я хотел бы заменить эту метку. Я пытался использовать .set (), но это некажется, работает.

Моя вторая проблема, и это скорее логическая ошибка (я думаю), это то, что я хотел отслеживать введенные буквы, чтобы я мог сравнить это с вновь введенными буквами и предупредитьпользователя. Это работает хорошо, однако, когда буква введена, она предупредит пользователя, даже если она набрана впервые.

Вот код:

import tkinter
from tkinter import *
from tkinter import messagebox
import random

guesses = 8

def play():
    print("play game")

    wordList = ["talking", "dollar","choice", "famous", "define", "features"]

    wordChoice = random.choice(wordList)

    print(wordChoice)
    wordLength = (len(wordChoice))
    print(wordLength)
    guessedLetters = []
    dashes = []

    def enterLetter():
        print("Guess")
        global guesses

        print(guessedLetters)

        while guesses != 0:
            guess = entry.get().lower()

            if len(guess) >1:
                messagebox.showinfo("Error","Sorry, only one letter at a time")
                entry.delete("0","end")
                return
            elif guess.isalpha() == False:
                messagebox.showinfo("Error","Letters only please")
                entry.delete("0","end")
                return
            elif guess in guessedLetters:
                messagebox.showinfo("Error","You have already used the letter")
                entry.delete("0","end")
                return

            guessedLetters.append(guess)
            print(guessedLetters)
            print(guesses)
            count = 0


            for i in range(wordLength):
                if wordChoice[i] == guess:
                    dashes[i] = guess
                    count = count +1
                    letter = Label(play, text = dashes, font = ("Arial",20)).grid(row = 2, column = i+1,padx = 10, pady =10)

            if count == 0:
                guesses -= 1

            if guesses == 0:
                print("You have ran out of guesses!")
                print("The word was:",wordChoice)

    ######  Play Game GUI


    play = Toplevel()
    play.title("Play Hangman!")

    label = Label(play, text="HANGMAN", font = ("Arial",16)).grid(row = 0)
    label = Label(play, text="Enter your guess >").grid(row = 3, column = 0)

    for i in range(wordLength):
        dashes.append("-")

    letter = Label(play, text = dashes, font = ("Arial",20)).grid(row = 2, column = i+1,padx = 10, pady =10)


    entry = Entry(play)
    entry.grid(row = 3, column = 1, columnspan = wordLength) 
    enterButton = Button(play, text = "Enter Guess", width = 15, command = enterLetter).grid(row = 3, column = (wordLength+2))
    label = Label(play, text = "Letter used: ").grid(row = 4, columnspan = 2)
    label = Label(play, text = "").grid(row= 4, columnspan = 6)



def scores():
    print("check scores")

def howToPlay():
    print("how to play")



####### Main Menu

root = Tk()
root.geometry("500x300")                                                                    
root.title("HANGMAN")
label = Label(root, text="HANGMAN", font = ("Arial",30)).grid(row = 0, columnspan = 3)
label = Label(root, text = "Option 1 :", font = ("Arial",12)).grid(row = 1, column = 1)    
playButton = Button(root, text = "Play Game", width = 15, command = play).grid(row = 1, column = 2) 
label = Label(root, text = "Option 2 :", font = ("Arial",12)).grid(row = 2, column = 1)
instructionsButton = Button(root, text = "How to play", width = 15, command = howToPlay).grid(row = 2, column = 2) 
label = Label(root, text = "Option 3 :", font = ("Arial",12)).grid(row = 3, column = 1) 
scoresButton = Button(root, text = "View Scores", width = 15, command = scores).grid(row = 3, column = 2) 
label = Label(root, text = "Option 4 :", font = ("Arial",12)).grid(row = 4, column = 1)
exitButton = Button(root, text = "Exit", width = 15, command = exit).grid(row = 4, column = 2)


root.mainloop()

Ответы [ 2 ]

0 голосов
/ 30 мая 2018
  1. Вам необходимо настроить метку, а не воссоздать ее.
  2. Почему вы используете цикл while в enter_letter?Он просто запускается при нажатии кнопки, он должен быть if guesses > 0:
  3. Ваша программа не завершилась, когда было введено правильное слово;Я добавил это.

Код:

import tkinter
from tkinter import *
from tkinter import messagebox
import random

guesses = 8

letter = None

def play():
    global letter

    print("play game")

    wordList = ["talking", "dollar","choice", "famous", "define", "features"]

    wordChoice = random.choice(wordList)

    print(wordChoice)
    wordLength = (len(wordChoice))
    print(wordLength)
    guessedLetters = []
    dashes = []


    play = Toplevel()
    play.title("Play Hangman!")

    label = Label(play, text="HANGMAN", font = ("Arial",16)).grid(row = 0)
    label = Label(play, text="Enter your guess >").grid(row = 3, column = 0)

    for i in range(wordLength):
        dashes.append("-")

    letter = Label(play, text = dashes, font = ("Arial",20))
    letter.grid(row = 2, column = i+1,padx = 10, pady =10)
    print(letter)

    def enterLetter():
        print("Guess")
        global guesses, letter

        print(guessedLetters)

        if guesses != 0:
            guess = entry.get().lower()

            if len(guess) >1:
                messagebox.showinfo("Error","Sorry, only one letter at a time")
                return
            elif guess.isalpha() == False:
                messagebox.showinfo("Error","Letters only please")
                return
            elif guess in guessedLetters:
                messagebox.showinfo("Error","You have already used the letter")
                return
            entry.delete("0","end")
            guessedLetters.append(guess)
            #print(guessedLetters)
            #print(guesses)
            print(dashes)
            count = 0


            for i in range(wordLength):
                if wordChoice[i] == guess:
                    dashes[i] = guess
                    count += 1
                    letter.configure(text = dashes)


            if count == 0:
                guesses -= 1

            if "".join(dashes) == wordChoice:
                print("succsess!")
                play.destroy()
                return

            if guesses == 0:
                print("You have ran out of guesses!")
                print("The word was:",wordChoice)

    ######  Play Game GUI


    entry = Entry(play)
    entry.grid(row = 3, column = 1, columnspan = wordLength) 
    enterButton = Button(play, text = "Enter Guess", width = 15, command = enterLetter).grid(row = 3, column = (wordLength+2))
    label = Label(play, text = "Letter used: ").grid(row = 4, columnspan = 2)
    label = Label(play, text = "").grid(row= 4, columnspan = 6)



def scores():
    print("check scores")

def howToPlay():
    print("how to play")



####### Main Menu

root = Tk()
root.geometry("500x300")                                                                    
root.title("HANGMAN")
label = Label(root, text="HANGMAN", font = ("Arial",30)).grid(row = 0, columnspan = 3)
label = Label(root, text = "Option 1 :", font = ("Arial",12)).grid(row = 1, column = 1)    
playButton = Button(root, text = "Play Game", width = 15, command = play).grid(row = 1, column = 2) 
label = Label(root, text = "Option 2 :", font = ("Arial",12)).grid(row = 2, column = 1)
instructionsButton = Button(root, text = "How to play", width = 15, command = howToPlay).grid(row = 2, column = 2) 
label = Label(root, text = "Option 3 :", font = ("Arial",12)).grid(row = 3, column = 1) 
scoresButton = Button(root, text = "View Scores", width = 15, command = scores).grid(row = 3, column = 2) 
label = Label(root, text = "Option 4 :", font = ("Arial",12)).grid(row = 4, column = 1)
exitButton = Button(root, text = "Exit", width = 15, command = exit).grid(row = 4, column = 2)


root.mainloop()

Надеюсь, это поможет вам.

0 голосов
/ 30 мая 2018

Причина, по которой вы не можете обновить ярлык, заключается в том, что вы не сохранили его ни в одной переменной.Функции grid, pack и place объекта Label и всех других виджетов возвращают None, поэтому при вызове:

letter = Label(play, text = dashes, font = ("Arial",20)).grid(row = 2, column = i+1,padx = 10, pady =10)

ваша метка не может быть доступна по переменной букве.Чтобы исправить это, вы должны разделить его следующим образом:

letter = Label(play, text = dashes, font = ("Arial",20))
letter.grid(row = 2, column = i+1,padx = 10, pady =10)

Чтобы обновить текст этого ярлыка, вы можете вызвать .configure(text = 'new text') на нем.

# letter = Label(play, text = dashes, font = ("Arial",20)).grid(row = 2, column = i+1,padx = 10, pady =10)    # 

letter.configure(text = dashes)

Что касается вашей второй проблемы,я думаю, что вы перепутали while цикл и if оператор в функции enterLetter.Он вызывается один раз за клик, и вам нужно только один раз проверить, закончились ли у игрока догадки.

if guesses != 0:
    ...

elif guesses == 0:
    ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...