首页 > 解决方案 > 刽子手游戏输入用户单词到游戏 Tkinter

问题描述

我目前正在使用 tkinter 在 python 中开发 Hangman 游戏。我的代码正在运行,现在我想改进它。我目前的游戏是从列表中选择一个随机单词。但我想改变这一点,所以在开始菜单中玩家可以选择单词。我试图附加该条目,但我无法正确完成。谢谢你的时间。

from tkinter import messagebox
from tkinter import *
import random

import string
from functools import partial


def newGame():
    global word_with_spaces
    global number_of_guesses
    number_of_guesses = 0

    the_word = random.choice(word_list)
    word_with_spaces = " ".join(the_word)
    lbl_word.set(" ".join("_"*len(the_word)))

def guess(letter):
    char_buttons[letter].config(state="disabled")
    global number_of_guesses
    if number_of_guesses < 11:
      txt = list(word_with_spaces)
      guessed = list(lbl_word.get())
      if word_with_spaces.count(letter) > 0:
        for c in range(len(txt)):
          if txt[c] == letter:
            guessed[c] = letter
          lbl_word.set("".join(guessed))
          if lbl_word.get() == word_with_spaces:
            messagebox.showinfo("Hangman", "You guessed it!")
            newGame()
      else:
          number_of_guesses += 1
          if number_of_guesses == 11:
            messagebox.showwarning("Hangman", "Game over")


def spelet():
    global window2, word_list, lbl_word, char_buttons
    window2 = Tk()
    window2.title("Hangman")
    window2.resizable(False, False)
    # Words
    word_list = ["FLAMBOYANT", "AMBIGUOUS", "AMBIVALENT", "CHARISMA"]


    lbl_word = StringVar(master=window2)
    label = Label(window2, textvariable=lbl_word, font=("Consolas 24 bold"))
    label.grid(row=0, column=1, columnspan=7, padx=10)

    all_characters = list(string.ascii_uppercase)
    all_characters.extend(("Å", "Ä", "Ö"))

    char_buttons = {}

    for i, char in enumerate(all_characters):
        command = partial(guess, char)
        button = Button(window2, text=char, bg="skyBlue", fg="Black", width=3,
                        height=1, font=("Helvetica", "20"), command=command)
        row = i//7 + 1
        column = i%7 + 1
        button.grid(row=row, column=column)

        char_buttons.update({char: button})

    button = Button(window2, text="New\nGame", command=newGame,
                  font=("Helvetica 10 bold"))
    button.grid(row=3, column=8, sticky="NSWE")

    newGame()


#Setting up the window
window = Tk()
window.title("Welcome to Hangman")
window.geometry("350x250+525+200")
# Create the "Hangman" label
lblspel = Label(window, text="Hangman", font=("Arial", "16", "bold", "italic"),
                fg="red")
lblspel.pack(side="top", anchor="center", pady=7)

# Create the entry label
Namnlbl = Label(window, text="Write the secret word: ",
                font=("Arial", "11", "bold", "italic"))
Namnlbl.pack(side="top", pady=5, padx=20)

# Create the actual entry
e = Entry(window, font=("Arial", 12), justify="center")
e.pack(side="top")

startaspelet = Button(window, text="Start the game", relief="solid",
                      font=("arial", 12, "bold"), command=spelet)

startaspelet.place(x=78, y=140)
window.mainloop()

标签: pythontkinter

解决方案


您需要从条目中传递值并将其设置为变量。使用该变量而不是word_list

您更正的代码:

from tkinter import messagebox
from tkinter import *
import random

import string
from functools import partial


def newGame():
    global word_with_spaces, number_of_guesses
    number_of_guesses = 0
    e.delete(0, 'end')
    word_with_spaces = " ".join(guess_word)
    lbl_word.set(" ".join("_"*len(guess_word)))

def guess(letter):
    char_buttons[letter].config(state="disabled")
    global number_of_guesses
    msg = ''
    if number_of_guesses < 11:
      txt = list(word_with_spaces)
      guessed = list(lbl_word.get())
      if word_with_spaces.count(letter) > 0:
        for c in range(len(txt)):
          if txt[c] == letter:
            guessed[c] = letter
          lbl_word.set("".join(guessed))
          if lbl_word.get() == word_with_spaces:
            msg = messagebox.showinfo("Hangman", "You guessed it!")
            
      else:
          number_of_guesses += 1
          if number_of_guesses == 11:
            msg = messagebox.showwarning("Hangman", "Game over")
            
    if msg:
        window2.destroy()
        newGame()
    

def spelet(word):
    global window2, word_list, lbl_word, char_buttons, guess_word
    
    window2 = Toplevel()
    window2.title("Hangman")
    window2.resizable(False, False)
    # Words
    guess_word = word.upper()


    lbl_word = StringVar(master=window2)
    label = Label(window2, textvariable=lbl_word, font=("Consolas 24 bold"))
    label.grid(row=0, column=1, columnspan=7, padx=10)

    all_characters = list(string.ascii_uppercase)
    all_characters.extend(("Å", "Ä", "Ö"))

    char_buttons = {}

    for i, char in enumerate(all_characters):
        command = partial(guess, char)
        button = Button(window2, text=char, bg="skyBlue", fg="Black", width=3,
                        height=1, font=("Helvetica", "20"), command=command)
        row = i//7 + 1
        column = i%7 + 1
        button.grid(row=row, column=column)

        char_buttons.update({char: button})

    button = Button(window2, text="New\nGame", command= newGame,
                  font=("Helvetica 10 bold"))
    button.grid(row=3, column=8, sticky="NSWE")

    newGame()


#Setting up the window
window = Tk()
window.title("Welcome to Hangman")
window.geometry("350x250+525+200")

guess_word = ""
# Create the "Hangman" label
lblspel = Label(window, text="Hangman", font=("Arial", "16", "bold", "italic"),
                fg="red")
lblspel.pack(side="top", anchor="center", pady=7)

# Create the entry label
Namnlbl = Label(window, text="Write the secret word: ",
                font=("Arial", "11", "bold", "italic"))
Namnlbl.pack(side="top", pady=5, padx=20)

# Create the actual entry
e = Entry(window, font=("Arial", 12), show='*', justify="center")
e.pack(side="top")

startaspelet = Button(window, text="Start the game", relief="solid",
                      font=("arial", 12, "bold"), command= lambda :spelet(e.get()))

startaspelet.place(x=78, y=140)
window.mainloop()


推荐阅读