PYTHON TKINTER-销毁帧

PYTHON TKINTER-销毁帧,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在尝试使用tkinter构建一个“数字猜测游戏”,您需要通过在Entry小部件中输入来猜测计算机生成的数字 代码如下: import tkinter as tk import random, sys class GameWindow(tk.Frame): def __init__(self, parent): tk.Frame.__init__(self, parent, bg="#8ECEBD") self.parent = parent

我正在尝试使用
tkinter
构建一个“数字猜测游戏”,您需要通过在
Entry
小部件中输入来猜测计算机生成的数字

代码如下:

import tkinter as tk
import random, sys


class GameWindow(tk.Frame):

    def __init__(self, parent):

        tk.Frame.__init__(self, parent, bg="#8ECEBD")
        self.parent = parent

        self.init_window()
        self.cust_game()

        self.actual_num = self.create_num()


    def init_window(self):

        self.parent.geometry("800x900+560+90")
        self.parent.title("Guess The Number!")

        self.scrollbar = tk.Scrollbar(self)
        self.scrollbar.pack(side="right", fill="y")

        exit_button = tk.Button(self, bg="#811B14", font="Helvetica 17 bold",
                                command=lambda: self.client_exit(), text="EXIT GAME!",
                                cursor="hand2", relief="groove")
        exit_button.pack(fill="x", pady=10, padx=10)

        welcome_label = tk.Label(self, bg="#8ECEBD", fg="#810007", text="Welcome to\nGUESS THE NUMBER!",
                                 font="Helvetica 25 bold")
        welcome_label.pack(pady=60)


    def cust_game(self):

        self.main_frame = tk.Frame(self, bg="#8ECEBD")
        self.main_frame.pack(fill="x")

        instructions_label = tk.Label(self.main_frame, bg="#8ECEBD", fg="#6F8100", font="Helvetica 15",
                                      text="Enter a number between 0 and 100 down here:")
        instructions_label.pack(pady=15)

        self.entry = tk.Entry(self.main_frame, width=3, font="Helvetica 13 italic")
        self.entry.pack()

        submit_button = tk.Button(self.main_frame, text="Check!", font="Helvetica 13 bold", fg="#001F4C",
                                  relief="groove", bg="#336600", activebackground="#254C00", cursor="hand2",
                                  command=lambda: self.compare_numbers())
        submit_button.pack(pady=5)

        self.second_frame = tk.Frame(self, bg="#8ECEBD")
        self.second_frame.pack(pady=30)

        label = tk.Label(self.second_frame, bg="#8ECEBD", text="YOUR RESULTS:", font="Helvetica 15", fg="blue")
        label.pack(pady=15)

        self.answersbox = tk.Listbox(self.second_frame, bg="#8ECEBD", relief="groove", bd=0, height=13, width=39,
                                yscrollcommand=self.scrollbar.set, fg="#FF4800", font="Helvetica 15")
        self.answersbox.pack()

        self.scrollbar.config(command=self.answersbox.yview)


    def compare_numbers(self):


        num = self.entry.get()

        if len(num) == 0:
            self.answersbox.insert(0, "Please enter a number!\n")
        elif int(num) > 100 or int(num) < 0 :
            self.answersbox.insert(0, "You have to enter a number between 0 and 100!\n")
        elif int(num) > self.actual_num:
            self.answersbox.insert(0, "Too HIGH!\n")
        elif int(num) < self.actual_num:
            self.answersbox.insert(0, "Too LOW!\n")
        elif int(num) == self.actual_num:
            self.answersbox.insert(0, "Congratulations! The number was {}!\n".format(self.actual_num))

            new_button = tk.Button(self.second_frame, bg="#CC8E1A", fg="#001F4C",
                                   text="PLAY AGAIN!", font="Helvetica 13 bold", activebackground="#815B14",
                                   cursor="hand2", padx=100, pady=10, relief="groove",
                                   command=lambda: self.restart_game())
            new_button.pack(pady=15)

        self.entry.delete(0, tk.END)


    def create_num(self):

        return random.randint(0, 100)


    def client_exit(self):

        sys.exit("DONE!")


    def restart_game(self):

        self.main_frame.destroy()
        self.second_frame.destroy()

        self.cust_game()


root = tk.Tk()
app = GameWindow(root)
app.pack(fill="both", expand=True)
root.mainloop()
将tkinter作为tk导入
随机导入,sys
类游戏窗口(tk.Frame):
定义初始化(自身,父级):
tk.Frame.uuu init_uuuu(self,parent,bg=“#8ECEBD”)
self.parent=parent
self.init_窗口()
self.cust_game()
self.actual_num=self.create_num()
def初始窗口(自):
自父几何体(“800x900+560+90”)
self.parent.title(“猜猜数字!”)
self.scrollbar=tk.scrollbar(self)
self.scrollbar.pack(side=“right”,fill=“y”)
退出按钮=传统按钮(self,bg=“#811B14”,font=“Helvetica 17 bold”,
command=lambda:self.client_exit(),text=“退出游戏!”,
cursor=“hand2”,relief=“groove”)
退出按钮包(fill=“x”,pady=10,padx=10)
欢迎使用\u label=tk.label(self,bg=“#8ECEBD”,fg=“#810007”,text=“欢迎使用\n请输入号码!”,
font=“Helvetica 25粗体”)
欢迎使用标签包(pady=60)
def cust_游戏(自我):
self.main_frame=tk.frame(self,bg=“#8ECEBD”)
自主框架包装(fill=“x”)
说明\u label=tk.label(self.main\u框架,bg=“#8ECEBD”,fg=“#6F8100”,font=“Helvetica 15”,
text=“在此输入一个介于0和100之间的数字:”)
标签包装说明(pady=15)
self.entry=tk.entry(self.main_框架,宽度=3,font=“Helvetica 13 italic”)
self.entry.pack()
submit_button=tk.button(self.main_框架,text=“Check!”,font=“Helvetica 13 bold”,fg=“#001F4C”,
relief=“groove”,bg=“#336600”,activebackground=“#254C00”,cursor=“hand2”,
command=lambda:self.compare_numbers())
提交按钮包(pady=5)
self.second_frame=tk.frame(self,bg=“#8ECEBD”)
自第二帧包(pady=30)
label=tk.label(self.second_帧,bg=“#8ECEBD”,text=“您的结果:”,font=“Helvetica 15”,fg=“蓝色”)
标签包装(pady=15)
self.answersbox=tk.Listbox(self.second_帧,bg=“#8ECEBD”,relief=“groove”,bd=0,高度=13,宽度=39,
yscrollcommand=self.scrollbar.set,fg=“#FF4800”,font=“Helvetica 15”)
self.answersbox.pack()
self.scrollbar.config(命令=self.answersbox.yview)
def比较_编号(自身):
num=self.entry.get()
如果len(num)==0:
self.answersbox.insert(0,“请输入数字!\n”)
elif int(num)>100或int(num)<0:
self.answersbox.insert(0,“您必须输入一个介于0和100之间的数字!\n”)
elif int(num)>self.actual_num:
self.answersbox.insert(0,“过高!\n”)
elif int(num)

很抱歉,如果代码太长,无法读取。我已经到了这样一个地步,在用户猜到数字后,通过按下
按钮
,询问他是否想再次播放。我在想,当按下按钮时,两个帧(
主帧
第二帧
)需要借助命令
.destroy()
)删除,但当按下按钮时,似乎什么也没有发生。请告诉我我做错了什么,以及是否有更好的方法来做这件事。

当你点击
新建按钮时,
重新启动游戏
,两个画面被销毁。它们看起来不是这样,因为
restart\u game
然后调用
cust\u game
,这会重新创建两个帧

插入一些
print
s可以帮助您了解流程:

def cust_game(self):
    self.main_frame = tk.Frame(self, bg="#8ECEBD")
    self.main_frame.pack(fill="x")
    print('main_frame created')  # insert this
    # ...
    self.second_frame = tk.Frame(self, bg="#8ECEBD")
    self.second_frame.pack(pady=30)
    print('second_frame created')  # insert this

def restart_game(self):
    self.main_frame.destroy()
    print('main_frame destroyed')  # insert this
    self.second_frame.destroy()
    print('second_frame destroyed')  # insert this
    self.cust_game()   # note cust_game is called
然后,当您首次启动游戏时,它会打印到控制台:

main_frame created
second_frame created
当你再次点击播放时,它会打印出来

main_frame destroyed
second_frame destroyed
main_frame created
second_frame created

顺便说一句,
command=lambda:f()
是多余的。只需执行
command=f
;e、 例如,
command=self.restart_game
当您单击
new_按钮时,
restart_game
被调用,两帧被销毁。它们看起来不是这样,因为
restart\u game
然后调用
cust\u game
,这会重新创建两个帧

插入一些
print
s可以帮助您了解流程:

def cust_game(self):
    self.main_frame = tk.Frame(self, bg="#8ECEBD")
    self.main_frame.pack(fill="x")
    print('main_frame created')  # insert this
    # ...
    self.second_frame = tk.Frame(self, bg="#8ECEBD")
    self.second_frame.pack(pady=30)
    print('second_frame created')  # insert this

def restart_game(self):
    self.main_frame.destroy()
    print('main_frame destroyed')  # insert this
    self.second_frame.destroy()
    print('second_frame destroyed')  # insert this
    self.cust_game()   # note cust_game is called
然后,当您首次启动游戏时,它会打印到控制台:

main_frame created
second_frame created
当你再次点击播放时,它会打印出来

main_frame destroyed
second_frame destroyed
main_frame created
second_frame created

顺便说一句,
command=lambda:f()
是多余的。只需执行
command=f
;e、 例如,
command=self.重新启动游戏

您可以使用
tkMessageDialog
要求用户再次玩:

import tkMessageBox
#... code

elif int(num) == self.actual_num:
    self.answersbox.insert(0, "Congratulations! The number was {}!\n".format(self.actual_num))
    if tkMessageBox.askyesno("Play", "play again?"):
        self.answersbox.delete(0, END)
    else:
        sys.exit("DONE!")

您可以使用
tkMessageDialog
要求用户再次播放:

import tkMessageBox
#... code

elif int(num) == self.actual_num:
    self.answersbox.insert(0, "Congratulations! The number was {}!\n".format(self.actual_num))
    if tkMessageBox.askyesno("Play", "play again?"):
        self.answersbox.delete(0, END)
    else:
        sys.exit("DONE!")