簡體   English   中英

PYTHON TKINTER-破壞框架

[英]PYTHON TKINTER - destroying frames

我正在嘗試使用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()

如果代碼太長而無法閱讀,我感到很抱歉。 我已經到達了要點,在用戶猜出數字之后,可以通過按Button詢問他是否要再次玩。 我在想,當按下按鈕時,需要在命令.destroy()的幫助下刪除兩個幀( main_framesecond_frame .destroy() ,但是當按下按鈕時似乎什么也沒發生。 請告訴我我在做什么錯,以及是否有更好的方法可以做到這一點。

當您單擊new_buttonrestart_game被稱為和兩幀破壞。 它們不會出現,是因為restart_game然后調用cust_game它再現了兩個框架。

插入一些print可以幫助您理解流程:

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 ; 例如, command=self.restart_game

您可以使用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!")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM