[英]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.