python - 刽子手游戏输入用户单词到游戏 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()
解决方案
您需要从条目中传递值并将其设置为变量。使用该变量而不是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()
推荐阅读
- python - 具有 rowid 序列的 pandas 中的 Pivot_table
- python - 字典列表 - 为另一个键值具有相同值的项目添加键值
- kubernetes - Helm chart nginx-ingress 在 minikube 中不起作用?
- android - 我在图像视图的设计中遇到问题
- c# - Php 返回与 C# 不同的 pbkdf2
- html - 用于 renderMarkdown 的 BotFramework-Webchat 中间件
- python - 如何在不覆盖先前值的情况下将循环写入数据帧
- python - 我应该做什么而不是使用全局变量?
- java - 如何将whatsapp上的图像和文本分享给特定号码?
- python-3.x - 使用 python3 和 pyautogui 自动化创建社交媒体帐户