簡體   English   中英

如何在 Tkinter 中使用頂級小部件傳遞 class

[英]How to pass a class with Toplevel widget in Tkinter

在此處輸入圖像描述

我有一個現成的游戲( 2048 ),游戲開始時沒有歡迎 window,所以,我剛剛制作了一個歡迎 window,帶有一堆按鈕,如新游戲和 AI 模式,現在當我點擊新游戲按鈕時,我希望獲得可以玩游戲的新 window。 然而,游戲顯示在主 window 的底部,而另一個應該顯示實際游戲的 window 什么也沒有顯示。

# mainwindow.py file:
from tkinter import *
from PIL import ImageTk, Image
import game_2048
 
root = Tk()
 
root.iconbitmap('unnamed.ico')
root.title('2048')
 
 
bg = ImageTk.PhotoImage(Image.open("welcome.png"))
 
my_canvas = Canvas(root, width=780, height=550)
my_canvas.grid()
 
my_canvas.create_image(0, 0, image=bg, anchor=NW)
 
button1 = Button(root, text="New Game", fg="black", bg="#ddf0d0", padx=3,
                 pady=3, font=('Helvetica', '12', 'bold'), activebackground="#94d3c3", command=lambda: game_2048.mains(root)
                 )
button2 = Button(root, text="AI Mode", fg="black", bg="#ddf0d0",
                 padx=3, pady=3, font=('Helveica', '12', 'bold'), activebackground="#94d3c3")
 
button1_window = my_canvas.create_window(10, 10, anchor=NW, window=button1)
button2_window = my_canvas.create_window(120, 10, anchor=NW, window=button2)

root.mainloop()

我曾嘗試修改 game_2048 文件,即2048游戲,如下所示:

def mains(root):
    Top = Toplevel(root)
    l1 = Button(Top, command=lambda:Game())
    l1.pack()
 
 
class Game(tkinter.Frame):
    def __init__(self):
        tkinter.Frame.__init__(self)
        self.grid()
        self.master.title('2048')
 
        self.main_grid = tkinter.Frame(
            self, bg=c.GRID_COLOR, bd=3, width=400, height=400)
        self.main_grid.grid(pady=(80, 0))
        self.make_GUI()
        self.start_game()
 
        self.master.bind("<Left>", self.left)
        self.master.bind("<Right>", self.right)
        self.master.bind("<Up>", self.up)
        self.master.bind("<Down>", self.down)
 
        self.mainloop()
 
if __name__ == "__main__":
    mains()

我很確定我在 mains() function 中犯了一些錯誤,因此我沒有得到想要的 output。 所以我的問題是我應該怎么做才能糾正這些錯誤?

以下是我對您的代碼所做的更改:

  • game_2048.py中刪除了import mainwindow ,因為它會導致循環導入調用函數兩次。

  • 您創建了一個繼承自Frame的 class ,這個框架就像任何其他 tkinter 小部件一樣,需要使用幾何管理器放置在 window 中,就像你沒有做的那樣pack() / grid() / place()

  • 在創建另一個新的root window 之前,我還銷毀了root window。 另請注意,我沒有使用Toplevel ,而是使用了Tk 完成后,關閉游戲 window 將關閉應用程序。 但是如果使用Toplevel ,您也必須關閉菜單 window 。

from tkinter import *
import tkinter
import random
import colors as c

def mains(root):
    root.destroy()
    root = Tk()
    
    def init(root):
        l1.destroy()
        game = Game(root)
        game.pack()

    l1 = Button(root, text='Start Game',command=lambda: init(root))
    l1.pack()

class Game(tkinter.Frame):
    def __init__(self, parent):
        tkinter.Frame.__init__(self, parent)
        .......

但是如果你要問我,我不會 go 這樣的結構,但這也可以在這里工作。 理解這一點,努力實現它,實現你自己的不調用多個Tk()的結構。

暫無
暫無

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

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