Python如何在tkinter中清除窗口

Python如何在tkinter中清除窗口,python,tkinter,Python,Tkinter,我需要在加载新地图之前清除窗口。但菜单按钮必须保留。我正在尝试self.frame.destroy(),但它也会杀死我的菜单按钮。基本上我需要清除类Sokoban,但这个类不在类窗口中。问题出现在def map1(自我):和def map2(自我): import tkinter from tkinter import * class Window(Frame): def __init__(self, master=None): Frame.__init__(self

我需要在加载新地图之前清除窗口。但菜单按钮必须保留。我正在尝试self.frame.destroy(),但它也会杀死我的菜单按钮。基本上我需要清除类Sokoban,但这个类不在类窗口中。问题出现在def map1(自我):def map2(自我):

import tkinter
from tkinter import *

class Window(Frame):

    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.master = master
        self.init_window()

    def init_window(self):
        self.master.title('Sokoban')
        self.pack(fill = BOTH, expand = 1)
        menu = Menu(self.master)
        self.master.config(menu=menu)

        file = Menu(menu)
        file.add_command(label='Mapa1', command = self.map1)
        menu.add_cascade(label='Mapy', menu=file)

        edit = Menu(menu)
        edit.add_command(label='Mapa2', command = self.map2)
        menu.add_cascade(label='Edit', menu=edit)

    def map1(self):
        self.frame.forget()
        Sokoban('map1.txt')

    def map2(self):
        self.frame.forget()
        Sokoban('map2.txt')


class Sokoban:

    def __init__(self, subor):
        t = open(subor, 'r')
        self.pole = [None] * 8
        self.box = []
        for a in range(8):
            self.pole[a] = list(t.readline().strip())
            for b in range(len(self.pole[a])):
                if self.pole[a][b] == '$':
                    self.player = Player(a,b)
                    self.pole[a][b] = '.'
                if self.pole[a][b] == '@':
                    self.box.append(Box(a,b))
                    self.pole[a][b] = '.'
        t.close()
        self.game = self.g = tkinter.Canvas(bg = 'white', width = 650, height = 240,
                                cursor = 'cross')
        self.g.pack()
        self.farba = [['gray'],['khaki'],['#FF4500'],['yellow'],['brown']]
        stena = '*'
        policko = '.'
        player = '$'
        box = '@'
        ciel = '+'
##        self.newButt = self.g.create_rectangle(511, 0, 650, 45, fill = 'red')
##        self.newButtText = self.g.create_text(580.5, 22.5, text = 'New Game',
##                                               font = 'arial 19 italic bold',
##                                              fill = 'yellow')
##        self.map1Butt = self.g.create_rectangle(511, 46, 650, 86, fill = 'red')
##        self.map1ButtText = self.g.create_text(580.5, 66, text = 'Map - 1',
##                                               font = 'arial 19 italic bold',
##                                               fill = 'yellow')
##        self.map2Butt = self.g.create_rectangle(511, 87, 650, 127, fill = 'red')
##        self.map2ButtText = self.g.create_text(580.5, 109, text = 'Map - 2',
##                                               font = 'arial 19 italic bold',
##                                               fill = 'yellow')
##        self.map3Butt = self.g.create_rectangle(511, 128, 650, 168, fill = 'red')
##        self.map3ButtText = self.g.create_text(580.5, 148, text = 'Map - 3',
##                                               font = 'arial 19 italic bold',
##                                               fill = 'yellow')
        self.kresli()
        self.g.bind_all('<Up>', self.up)
        self.g.bind_all('<Down>', self.down)
        self.g.bind_all('<Left>', self.left)
        self.g.bind_all('<Right>', self.right)
##        self.g.bind('<1>', self.Buttons)


    def up(self, e):
        self.move(-1, 0)

    def down(self, e):
        self.move(1, 0)

    def left(self, e):
        self.move(0, -1)

    def right(self, e):
        self.move(0, 1)

##    def newGame(self):
##        self.game.pack_forget()
##        Sokoban()

##    def map1(self):
##        self.game.pack_forget()
##        Sokoban('map1.txt')
##
##    def map2(self):
##        self.game.pack_forget()
##        Sokoban('map2.txt')

##    def Buttons(self, e):
##        if '<1>' and self.newButt:
##            self.newGame()

##        if '<1>' and self.map1Butt:
##            self.map1()
##
##        if '<1>' and self.map2Butt:
##            self.map2()

    def kresli(self):
        for a in range(8):
            for b in range(17):
                x,y = b*30, a*30
                f = self.farba['*.+'.index(self.pole[a][b])]
                self.g.create_rectangle(x,y,x+30,y+30,fill=f)
        self.player.kresli(self.g, self.farba[3])
        for box in self.box:
            box.kresli(self.g, self.farba[4])

    def setBox(self, r, s):
        for a in range(len(self.box)):
            if self.box[a].r==r and self.box[a].s==s:
                return a
        return -1

    def move(self, dr, ds):
        r = self.player.r + dr
        s = self.player.s + ds
        if r<0 or r>=8 or s<0 or s>=510 or self.pole[r][s] == '*':
            return
        c = self.setBox(r, s)
        if c >= 0:
            rr = r + dr
            ss = s + ds
            if rr < 0 or rr>=8 or ss<0 or ss>=510 or self.pole[rr][ss] == '*':
                return
            if self.setBox(rr, ss) >= 0:
                return
            self.box[c].move(dr, ds)
        self.player.move(dr, ds)

        for c in self.box:
            if self.pole[c.r][c.s] != '+':
                return

class Player:

    def __init__(self, r, s):
        self.r = r
        self.s = s

    def kresli(self, g, farba):
        self.g = g
        x,y = self.s*30, self.r*30
        self.plr = tkinter.PhotoImage(file='player.png')
        self.id1 = g.create_image(x+15, y+15, image = self.plr)

    def move(self, dr, ds):
        self.r = self.r + dr
        self.s = self.s + ds
        self.g.move(self.id1, ds*30, dr*30)

class Box:

    def __init__(self, r, s):
        self.r = r
        self.s = s

    def kresli(self, g, farba):
        self.g = g
        x,y = self.s*30, self.r*30
        self.bx = tkinter.PhotoImage(file='box.png')
        self.id2 = g.create_image(x+15, y+15, image = self.bx)

    def move(self, dr, ds):
        self.r = self.r + dr
        self.s = self.s + ds
        self.g.move(self.id2, ds*30, dr*30)


root = Tk()
root.geometry('510x240')
app = Window(root)
root.mainloop()
Sokoban()
导入tkinter
从tkinter进口*
类窗口(框架):
def uuu init uuu(self,master=None):
帧。\uuuu初始化(自,主)
self.master=master
self.init_窗口()
def初始窗口(自):
self.master.title('Sokoban')
self.pack(填充=两者,扩展=1)
菜单=菜单(self.master)
self.master.config(菜单=菜单)
文件=菜单(菜单)
file.add_命令(label='Mapa1',command=self.map1)
menu.add_级联(label='Mapy',menu=file)
编辑=菜单(菜单)
edit.add_命令(label='Mapa2',command=self.map2)
menu.add_级联(label='Edit',menu=Edit)
def map1(自身):
self.frame.forget()
Sokoban('map1.txt')
def map2(自身):
self.frame.forget()
Sokoban('map2.txt')
Sokoban类:
定义初始值(自身、子对象):
t=打开(子对象“r”)
self.pole=[None]*8
self.box=[]
对于范围(8)内的a:
self.pole[a]=列表(t.readline().strip())
对于范围内的b(len(自极点[a]):
如果self.pole[a][b]='$':
self.player=玩家(a,b)
自极点[a][b]='.'
如果self.pole[a][b]='@':
self.box.append(框(a,b))
自极点[a][b]='.'
t、 关闭()
self.game=self.g=tkinter.Canvas(背景为“白色”,宽度为650,高度为240,
游标='cross')
self.g.pack()
self.farba=['gray']、['kaki']、['FF4500']、['yellow']、['brown']]
stena='*'
波利科='。'
玩家=“$”
框=“@”
ciel='+'
##self.newButt=self.g.create_矩形(511,0650,45,fill='red')
##self.newButtText=self.g.create_text(580.5,22.5,text=‘新游戏’,
##字体='arial 19斜体粗体',
##填充=‘黄色’)
##self.map1Butt=self.g.create_矩形(511,46650,86,fill='red')
##self.map1ButtText=self.g.create_text(580.5,66,text='Map-1',
##字体='arial 19斜体粗体',
##填充=‘黄色’)
##self.map2Butt=self.g.create_矩形(511、87、650、127,fill='red')
##self.map2ButtText=self.g.create_text(580.5109,text='Map-2',
##字体='arial 19斜体粗体',
##填充=‘黄色’)
##self.map3Butt=self.g.create_矩形(5111282650168,fill='red')
##self.map3ButtText=self.g.create_text(580.5148,text='Map-3',
##字体='arial 19斜体粗体',
##填充=‘黄色’)
self.kresli()
self.g.bind_all(“”,self.up)
self.g.bind_all(“”,self.down)
self.g.bind_all(“”,self.left)
self.g.bind_all(“”,self.right)
##self.g.bind(“”,self.button)
def up(自我,e):
自我移动(-1,0)
def下降(自我,e):
自我移动(1,0)
def左(自我,e):
自移(0,-1)
def右(自我,e):
自我移动(0,1)
##def新游戏(自我):
##self.game.pack_忘记()
##索科班()
##def map1(自身):
##self.game.pack_忘记()
##Sokoban('map1.txt')
##
##def map2(自身):
##self.game.pack_忘记()
##Sokoban('map2.txt')
##def按钮(自我,e):
##如果“”和self.newButt:
##self.newGame()
##如果“”和self.map1Butt:
##self.map1()
##
##如果“”和self.map2Butt:
##self.map2()
def kresli(自我):
对于范围(8)内的a:
对于范围(17)内的b:
x、 y=b*30,a*30
f=自极点法氏['*.+'.指数(自极点[a][b])]
self.g.创建矩形(x,y,x+30,y+30,fill=f)
self.player.kresli(self.g,self.farba[3])
对于self.box中的box:
box.kresli(self.g,self.farba[4])
def设置盒(自身、右侧、右侧):
对于范围内的(len(self.box)):
如果self.box[a].r==r和self.box[a].s==s:
归还
返回-1
def移动(自身、dr、ds):
r=self.player.r+dr
s=self.player.s+ds
如果r=8或s=510或自极点[r][s]='*':
返回
c=自我设定框(r,s)
如果c>=0:
rr=r+dr
ss=s+ds
如果rr<0或rr>=8或ss=510或自极点[rr][ss]='*':
返回
如果self.setBox(rr,ss)>=0:
返回
self.box[c].移动(dr,ds)
self.player.move(dr,ds)
对于self.box中的c:
如果self.pole[c.r][c.s]!='+':
返回
职业球员:
定义初始化(self,r,s):
self.r=r
self.s=s
def kresli(赛尔夫、g、法尔巴):
self.g=g
x、 y=self.s*30,self.r*30
self.plr=tkinter.PhotoImage(file='player.png')
self.id1=g.create_image(x+15,y+15,image=self.plr)
def移动(自身、dr、ds):
self.r=self.r+dr
self.s=self.s+ds
self.g.move(self.id1,ds*30,dr*30)
类框:
定义初始化(self,r,s):
self.r=r
self.s=s
def kresli(赛尔夫、g、法尔巴):
self.g=g
x、 y=self.s*30,self.r*30
self.bx=tkinter.PhotoImage(file='box.png')
self.id2=g.create_image(x+15,y+15,image=self.bx)
def移动(自身、dr、ds):
self.r=self.r+dr
赛尔夫
import tkinter as tk

root = tk.Tk()
root.geometry("300x300")

frame1 = tk.Frame(root)
frame2 = tk.Frame(frame1)
frame1.pack()
frame2.pack()
menubar = tk.Menu(frame1) 
menubar.add_command(label="Bring Back!", command=frame2.pack)
menubar.add_command(label="Quit!", command=root.destroy)

tk.Button(frame2, text="Forget only frame2", command=frame2.pack_forget).pack()
tk.Label(frame2, text="Label on frame2").pack()

root.config(menu=menubar)

root.mainloop()