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