使用Python更新标签Tkinter

使用Python更新标签Tkinter,python,tkinter,label,Python,Tkinter,Label,我正在制作一个类似刽子手的游戏。到目前为止,我已经编写了运行良好的CLI版本,我只是将其移植到GUI上 我被卡住了:-(。程序还没有完成,还有更多的事情要做,但我有两个问题。第一个是标签更新 当选择一个字母时,它会为该字母创建足够的破折号,并将其放置在名为“字母”的标签中 当用户输入一个字母时,它会替换虚线,但是它会在旧标签旁边添加一个新标签,我想替换这个标签。我尝试过使用.set(),但这似乎不起作用 我的第二个问题(我认为这更像是一个逻辑错误)是,我想跟踪输入的字母,以便将其与新输入的字母进

我正在制作一个类似刽子手的游戏。到目前为止,我已经编写了运行良好的CLI版本,我只是将其移植到GUI上

我被卡住了:-(。程序还没有完成,还有更多的事情要做,但我有两个问题。第一个是标签更新

当选择一个字母时,它会为该字母创建足够的破折号,并将其放置在名为“字母”的标签中

当用户输入一个字母时,它会替换虚线,但是它会在旧标签旁边添加一个新标签,我想替换这个标签。我尝试过使用.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()

无法更新标签的原因是您没有将其存储在任何变量中。标签对象和所有其他小部件的网格、打包和放置函数都不会返回任何值,因此,当您调用:

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='newtext')

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

letter.configure(text = dashes)
至于你的第二个问题,我认为你混淆了函数
enterLetter
中的
while
循环和
if
语句。它每单击一次调用一次,你只需要检查一次玩家是否猜到了

if guesses != 0:
    ...

elif guesses == 0:
    ....

无法更新标签的原因是您没有将其存储在任何变量中。标签对象和所有其他小部件的网格、打包和放置函数都不会返回任何值,因此,当您调用:

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='newtext')

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

letter.configure(text = dashes)
至于你的第二个问题,我认为你混淆了函数
enterLetter
中的
while
循环和
if
语句。它每单击一次调用一次,你只需要检查一次玩家是否猜到了

if guesses != 0:
    ...

elif guesses == 0:
    ....
  • 您需要配置标签,而不是重新创建标签
  • 为什么在enter_letter中使用while循环?单击按钮时,它会运行,如果猜测>0,则它需要是
  • 当输入正确的单词时,您的程序没有终止;我添加了这个
  • 代码:

    我希望这对你有帮助

  • 您需要配置标签,而不是重新创建标签
  • 为什么在enter_letter中使用while循环?单击按钮时,它会运行,如果猜测>0,则它需要是
  • 当输入正确的单词时,您的程序没有终止;我添加了这个
  • 代码:


    我希望这能对您有所帮助。

    感谢您提出使用.join的想法。我自己不打算使用它,但我想我现在就试试。:-)感谢您提出使用.join的想法。我本来不打算自己用,但我想我现在就试试。:-)