【问题标题】:How do you combine two windows in python tkinter? Hangman Project你如何在 python tkinter 中组合两个窗口?刽子手计划
【发布时间】:2021-03-28 17:08:39
【问题描述】:

我目前正在使用 Tkinter 在 python 中进行一个 hangman 项目。我的程序正在运行,但我想创建一个开始菜单,以便当您单击开始按钮时实际游戏开始。但是当我单击开始按钮时,什么也没有发生。我尝试使用 Lamba 函数,但仍然没有。我错过了什么或做错了什么? 感谢您的宝贵时间!

from tkinter import messagebox
from tkinter import *
import random



#Setting up the window



window = Tk()
window.title("Welcome to Hangman")
window.geometry("350x250+525+200")
lblspel = Label(window, text="Hangman", font=('Arial', '16', 'bold', 'italic'), justify='center', fg='Red'
                     ).pack(side=TOP, anchor=CENTER,pady=7)

Namnlbl = Label(window, text="Write the secret word: ", font=('Arial', '11', 'bold', 'italic'), justify='center'
                     ).pack(side=TOP,pady=5 , padx=20)
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=lambda: spelet).place(x=78, y=140)


def spelet():
  window2 = Tk()
  window2.title("Hangman")
  window2.resizable(0, 0)
  #Words
  word_list = ['FLAMBOYANT','AMBIGUOUS','AMBIVALENT','CHARISMA']

  def newGame():
    global the_word_withSpaces
    global numberOfGuesses
    numberOfGuesses=0

    the_word=random.choice(word_list)
    the_word_withSpaces=" ".join(the_word)
    lblWord.set(" ".join("_"*len(the_word)))

  def guess(letter):
    global numberOfGuesses
    if numberOfGuesses<11:
      txt=list(the_word_withSpaces)
      guessed=list(lblWord.get())
      if the_word_withSpaces.count(letter)>0:
        for c in range(len(txt)):
          if txt[c]==letter:
            guessed[c]=letter
          lblWord.set("".join(guessed))
          if lblWord.get()==the_word_withSpaces:
            messagebox.showinfo("Hangman","You guessed it!")
            newGame()

      else:
          numberOfGuesses+=1
          if numberOfGuesses==11:
            messagebox.showwarning("Hangman","Game over")


  lblWord=StringVar()
  Label(window, textvariable=lblWord, font=("Consolas 24 bold")).grid(row=0, column=3, columnspan=6, padx=10)

  btn1 = Button(window2, text="A",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("A"))
  btn1.grid(column=1, row=1)
  btn2 = Button(window2, text="B",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("B"))
  btn2.grid(column=2, row=1)
  btn3 = Button(window2, text="C",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("C"))
  btn3.grid(column=3, row=1)
  btn4 = Button(window2, text="D",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("D"))
  btn4.grid(column=4, row=1)
  btn5 = Button(window2, text="E",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("E"))
  btn5.grid(column=5, row=1)
  btn6 = Button(window2, text="F",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("F"))
  btn6.grid(column=6, row=1)
  btn7 = Button(window2, text="G",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("G"))
  btn7.grid(column=7, row=1)

  btn9 = Button(window2, text="H",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("H"))
  btn9.grid(column=1, row=2)
  btn10 = Button(window2, text="I",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("I"))
  btn10.grid(column=2, row=2)
  btn11 = Button(window2, text="J",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("J"))
  btn11.grid(column=3, row=2)
  btn12 = Button(window2, text="K",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("K"))
  btn12.grid(column=4, row=2)
  btn13 = Button(window2, text="L",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("L"))
  btn13.grid(column=5, row=2)
  btn14 = Button(window2, text="M",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("M"))
  btn14.grid(column=6, row=2)
  btn15 = Button(window2, text="N",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("N"))
  btn15.grid(column=7, row=2)


  btn16 = Button(window2, text="O",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("O"))
  btn16.grid(column=1, row=3)
  btn17 = Button(window2, text="P",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("P"))
  btn17.grid(column=2, row=3)
  btn18 = Button(window2, text="Q",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Q"))
  btn18.grid(column=3, row=3)
  btn19 = Button(window2, text="R",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("R"))
  btn19.grid(column=4, row=3)
  btn20 = Button(window2, text="S",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("S"))
  btn20.grid(column=5, row=3)
  btn21 = Button(window2, text="T",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("T"))
  btn21.grid(column=6, row=3)
  btn22 = Button(window2, text="U",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("U"))
  btn22.grid(column=7, row=3)


  btn23 = Button(window2, text="V",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("V"))
  btn23.grid(column=1, row=4)
  btn24 = Button(window2, text="W",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("W"))
  btn24.grid(column=2, row=4)
  btn25 = Button(window2, text="X",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("X"))
  btn25.grid(column=3, row=4)
  btn26 = Button(window2, text="Y",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Z"))
  btn26.grid(column=4, row=4)
  btn27 = Button(window2, text="Å",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Å"))
  btn27.grid(column=5, row=4)
  btn28 = Button(window2, text="Ä",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Ä"))
  btn28.grid(column=6, row=4)
  btn29 = Button(window2, text="Ö",bg="skyBlue", fg="Black",width=3,height=1,font=('Helvetica','20'), command= lambda : guess("Ö"))
  btn29.grid(column=7, row=4)

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

  newGame()

window.mainloop()

【问题讨论】:

  • 您可能想看看如何使用 for 循环来替换 btn&lt;number&gt; = Button(...) 的所有这些行。它将使您的代码更易于阅读和调试
  • 还将lblWord=StringVar() 更改为lblWord=StringVar(master=window2) 以避免将来出现问题
  • 还将command=lambda: spelet 更改为command=spelet 在您的startaspelet = Button(...) 行中
  • @TheLizzard 您好,感谢您的回答,但它仍然无法正常工作,当我拿走 lambda 时,程序给了我红线,甚至没有启动
  • 合并两个窗口是什么意思?

标签: python tkinter button


【解决方案1】:

试试这个:

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.remove("Z") # I have no idea why you're missing "Z"
    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)
# Please don't mix geometry managers. If you want to use `.pack`, use `.pack`.
# Don't mix it with `.place`
startaspelet.place(x=78, y=140)
window.mainloop()

您的代码存在一些问题:

  • 为什么不使用 for 循环来创建按钮?它简单得多。对于functools.partial 的文档是here
  • 在 python 中,通常先声明函数,然后运行代码。另外请避免在其他函数中定义函数。
  • 避免在同一窗口/框架中混合使用 .pack.grid.place 等几何管理器
  • 当你有StringVar/IntVar/时,你必须总是传入一个master参数...如果你有超过1个Tk()
  • 在许多情况下,您拥有var = &lt;tkinter Widget&gt;(...).pack(...),但是当您这样做时,var 将是None,更多信息请阅读this
  • 大多数人使用 4 个空格进行缩进(您使用了 2 个)- 主要是偏好
  • 这也是传统的使用变量名,例如 "foo_bar" 而不是 "fooBar"(但这主要是偏好)

【讨论】:

  • 感谢您的宝贵时间。它现在正在工作,我会明确地查看您对未来编码的建议。祝你有美好的一天!
猜你喜欢
  • 2017-03-09
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2013-09-18
  • 2013-01-08
  • 1970-01-01
相关资源
最近更新 更多