Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法冻结我的窗口(Tkinter Python 3)_Python_Tkinter - Fatal编程技术网

方法冻结我的窗口(Tkinter Python 3)

方法冻结我的窗口(Tkinter Python 3),python,tkinter,Python,Tkinter,我正在为学校的作业编写一个刽子手GUI。我对编码是新手,所以我对许多模块没有太多的了解,所以我的代码可能会过长。我在我的窗口底部放了一个状态栏,告诉用户他们的猜测是否太长或者已经猜到了。2秒钟后,文本应恢复为“一切正常:)”,但窗口在2秒钟内无响应,标签不会通知用户无效猜测。 注意:我是编程新手,请尽可能简单地解释。 非常感谢 问题出在最后一个函数中 代码如下: from tkinter import * from winsound import * import random root =

我正在为学校的作业编写一个刽子手GUI。我对编码是新手,所以我对许多模块没有太多的了解,所以我的代码可能会过长。我在我的窗口底部放了一个状态栏,告诉用户他们的猜测是否太长或者已经猜到了。2秒钟后,文本应恢复为
“一切正常:)”
,但窗口在2秒钟内无响应,标签不会通知用户无效猜测。
注意:我是编程新手,请尽可能简单地解释。
非常感谢
问题出在最后一个函数中

代码如下:

from tkinter import *
from winsound import *
import random

root = Tk()
root.resizable(0, 0)

# Game Settings
word_choices = ["python", "flower", "lollipop", "umbrella",
                "brain", "wrist", "wheel", "dress",
                "caterpillar", "window", "penguin",
                "belt", "forehead", "earthquake", "dolphin",
                "magazine", "pillow", "computer"
                ]
word = (random.choice(word_choices))
turns = 8
guesses = []
clean_guesses = "Letters you have guessed:\t\n"
letters_shown = " _ " * len(word)

# Photos used
stage0 = PhotoImage(file="Stage 0.png")
stage1 = PhotoImage(file="Stage 1.png")
stage2 = PhotoImage(file="Stage 2.png")
stage3 = PhotoImage(file="Stage 3.png")
stage4 = PhotoImage(file="Stage 4.png")
stage5 = PhotoImage(file="Stage 5.png")
stage6 = PhotoImage(file="Stage 6.png")
stage7 = PhotoImage(file="Stage 7.png")
stage8 = PhotoImage(file="Stage 8.png")
win = PhotoImage(file="Win!.png")

# List containing all of the photos
stages = [stage0,
          stage1,
          stage2,
          stage3,
          stage4,
          stage5,
          stage6,
          stage7,
          stage8]

hangman_stage = stages[0]


def adding_letters():
    global letters_shown, guesses, clean_guesses
    if len(guess_box.get()) != 1:
        statusBar.config(text="Make sure you have only guessed one letter!")
        guess_box.delete(0, END)
        update_status_bar()
        return
    elif guess_box.get() in guesses:
        statusBar.config(text="You have already guessed this!")
        guess_box.delete(0, END)
        update_status_bar()
        return
    guesses.append((guess_box.get()).lower())
    clean_guesses = "Letters you have guessed:\t\n"
    x = 0
    for char in sorted(set(guesses)):
        clean_guesses += char + ", "
        x += 1
        if x >= 9:
            clean_guesses += "\n"
            x = 0
    status_label.config(text=clean_guesses)
    letters_shown = ""
    failed = 0
    letters_on_screen.config(text=letters_shown)
    for char in word:
        if char in guesses:
            letters_shown += " {} ".format(char)
        else:

            letters_shown += " _ "
            failed += 1
    letters_on_screen.config(text=letters_shown)
    if failed == 0:
        winning()
    letters_on_screen.config(text=letters_shown)
    guessing_mechanic()


def guessing_mechanic():
    global turns, hangman_stage
    global guesses
    global letters_shown
    global word
    guesses.append(guess_box.get())
    letters_on_screen.config(text=letters_shown)
    if guess_box.get() not in word:
        turns -= 1
        letters_on_screen.config(text=letters_shown)
        next_stage()
    if guess_box.get() in word:
        letters_on_screen.config(text=letters_shown)
    if hangman_stage == stage8:
        title.config(text="YOU LOST! :(")
        guess_box.grid_forget()
        status_label.config(text="The word was {}.".format(word))
    letters_on_screen.config(text=letters_shown)
    guess_box.delete(0, END)


def next_stage():
    global hangman_stage, stages
    hangman_stage = stages[stages.index(hangman_stage) + 1]
    hangman_pic.config(image=hangman_stage)
    letters_on_screen.config(text=letters_shown)


def winning():
    title.config(text="YOU WON!!!!!")
    guess_box.grid_forget()
    guess_confirm.grid_forget()
    hangman_pic.config(image=win)
    PlaySound('Wow SFX.wav', SND_FILENAME)


def update_status_bar():
    root.after(2000, statusBar.config(text="Everything's fine :)"))


title = Label(root, text="Welcome to Hangman!", font="Helvetica 28 bold italic", fg="light blue", bg="dark blue")
letters_on_screen = Label(root, text=letters_shown, font="Helvetica 22 bold", fg="black")
guess_box = Entry(root)
hangman_pic = Label(root, image=hangman_stage)
guess_confirm = Button(root, text="Press to submit guess", font="Helvetica 14",
                       command=adding_letters)
status_label = Label(root, text=clean_guesses, font="Helvetica 14 bold", fg="dark blue")
statusBar = Label(root, text="Nothing wrong so far", bd=1, relief=SUNKEN, anchor=W)

title.grid(columnspan=4, rowspan=1, sticky=N + E + S + W)
hangman_pic.grid(column=3, row=1, rowspan=3)
letters_on_screen.grid(row=1, column=0, columnspan=3, sticky=S)
guess_box.grid(row=2, column=0)
guess_confirm.grid(row=2, column=1, columnspan=2)
status_label.grid(row=3, columnspan=2)
statusBar.grid(row=4, columnspan=3, sticky=E + W)

root.mainloop()

root.after调用需要一个可调用函数作为其参数,因此statusBar.config事件将在2秒内调用,而不是立即调用。如果您这样做,它将使GUI响应

root.after(2000, lambda: statusBar.config(text="Everything's fine :)"))

你能把你的代码缩减到相关的部分吗?如果问题在一行中,那么读100多行就没有意义了。非常抱歉。我包括了整个代码,因为之前没有问题,但过了一段时间问题出现了,“需要一个lambda”不是很正确。它需要一个可调用的函数,可以是函数,也可以使用
lambda
functools.partial
等等。谢谢!!你是个英雄!!顺便问一下,lambda和def之间有什么区别?