在Tkinter中销毁窗口内的所有内容
在下面的代码中,我想在按下GameButton按钮时清空窗口里的所有东西。不过,我还想让其他事情发生,所以唯一的办法就是让这个按钮运行一个函数。当我在主类外部执行self.destroy时,什么都没有被删除,有没有什么办法可以解决这个问题?
from PIL import Image, ImageTk
from Tkinter import Tk, Label, BOTH,W, N, E, S, Entry, Text, INSERT, Toplevel
from ttk import Frame, Style, Button, Label
import Tkinter
import Callingwordlist
difficulty = ""
class MainMenuUI(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Type!")
self.pack(fill=BOTH, expand=1)
style = Style()
style.configure("TFrame", background="black")
Logo = Image.open("Type!.png")
TypeLogo = ImageTk.PhotoImage(Logo)
label1 = Label(self, image=TypeLogo)
label1.image = TypeLogo
label1.place(x=342,y=80)
label1.pack()
self.pack(fill=BOTH, expand=1)
GameButton = Button(self, text="Main Game", command=lambda: main2(self.parent,self))
GameButton.pack()
GameButton.place(x=344,y=200,height = 80,width = 176)
TutorialButton = Button(self,text="Tutorial Level")
TutorialButton.pack()
TutorialButton.place(x=344, y=300 ,height = 80,width = 176)
quitbutton = Button(self, text= "Quit",command=self.parent.destroy)
quitbutton.place(x=344, y=400,height = 80,width = 176)
def main2(root,self):
self.destroy
app = MainGameUI(root)
root.mainloop()
class MainGameUI(root):
....
def main():
root = Tk()
root.geometry("860x640+300+300")
app = MainMenuUI(root)
root.mainloop()
if __name__ == '__main__':
main()
1 个回答
0
你在你的函数里其实并没有真正销毁任何东西。看看这段代码:
def main2(root,self):
self.destroy
app = MainGameUI(root)
root.mainloop()
注意函数的第一行,你试图销毁所有东西。你的代码是 self.destroy
- 注意这里没有括号。你并没有真正调用这个函数,而只是引用了它。加上括号来调用它:self.destroy()
。
你还有另一个问题,就是你在调用一个会销毁调用这个函数的控件的函数。不过,这个函数会进入一个无尽的循环(mainloop()
),所以按钮的命令永远不会返回。我不太确定会发生什么,你可能会遇到某种错误。总之,从按钮命令中调用 mainloop
不是个好主意。
因为你把应用程序结构设置成一个框架(而不是根窗口),所以你不需要重新启动事件循环。当你销毁 MainMenuUI
这个控件时,事件循环会继续运行。没必要重新启动它。