PythonTkinter:如何创建顶级窗口并销毁以前的窗口?
我正在用tkinter制作一个测验应用程序,我希望每个问题都在一个新窗口中,但是在我创建了一个新窗口之后,我不知道如何破坏以前的窗口。下面是我的代码的粗略简化摘录:PythonTkinter:如何创建顶级窗口并销毁以前的窗口?,python,python-3.x,tkinter,Python,Python 3.x,Tkinter,我正在用tkinter制作一个测验应用程序,我希望每个问题都在一个新窗口中,但是在我创建了一个新窗口之后,我不知道如何破坏以前的窗口。下面是我的代码的粗略简化摘录: from tkinter import * class q1: def __init__(self, master): self.master = master Label(self.master, text='What is 3 + 3?').grid() self.opt
from tkinter import *
class q1:
def __init__(self, master):
self.master = master
Label(self.master, text='What is 3 + 3?').grid()
self.option_1 = Button(self.master, text='5', command = self.incorrect)
self.option_1.grid()
self.option_2 = Button(self.master, text='6', command = self.correct)
self.option_2.grid()
def correct(self):
self.option_1.config(state=DISABLED)
self.option_2.config(state=DISABLED)
Label(self.master, text='Correct').grid()
Button(self.master, text='Next Question', command = self.nextq).grid()
def incorrect(self):
self.option_1.config(state=DISABLED)
self.option_2.config(state=DISABLED)
Label(self.master, text='Incorrect').grid()
Button(self.master, text='Next Question', command = self.nextq).grid()
def nextq(self):
q2(Toplevel(self.master))
class q2:
def __init__(self, master):
self.master = master
Label(self.master, text='Question 2').grid()
def window():
root = Tk()
q1(root)
root.mainloop()
if __name__ == '__main__':
window()
更新版本
from Tkinter import *
import random
class Ask:
def __init__(self, parent,question,right,wrong):
self.answer=right
self.top=top=Toplevel(parent)
Label(self.top, text=question,width=25).grid()
a1=random.choice([right,wrong])
self.option_1 = Button(self.top, text=a1, width=25,command = lambda: self.check(1))
self.option_1.grid()
a2=right
if a1==right:
a2=wrong
self.option_2 = Button(self.top, text=a2, width=25, command = lambda: self.check(2))
self.option_2.grid()
def check(self,pressed):
if pressed==1:
ans=self.option_1['text']
else:
ans=self.option_2['text']
if ans==self.answer:
self.correct()
else:
self.incorrect()
def correct(self):
self.option_1.config(state=DISABLED)
self.option_2.config(state=DISABLED)
Label(self.top, text='Correct').grid()
Button(self.top, text='Next Question', command = self.top.destroy).grid()
def incorrect(self):
self.option_1.config(state=DISABLED)
self.option_2.config(state=DISABLED)
Label(self.top, text='Incorrect').grid()
Button(self.top, text='Next Question', command = self.top.destroy).grid()
class QUIZ:
def __init__(self, questionsdict):
self.root=Tk()
self.root.withdraw()
self.questions(questionsdict)
self.root.deiconify()
c=Button(self.root, text='Click me to exit', command=self.root.destroy, width=30).grid(row=2, sticky='ew')
Label(self.root, text='Quiz is Complete', width=30, background='red').grid(row=0, sticky='ew')
mainloop()
def questions(self,questionsdict):
for k in questionsdict.keys():
right=questionsdict[k][0]
wrong=questionsdict[k][1]
b=Ask(self.root, k, right,wrong )
self.root.wait_window(b.top)
将测验问题以以下格式放入字典:{question:[correctchoice,incorrectchoice]}并在调用问题类时将其用作参数
questions={'What is 3+3':['6','8'], 'What is the capital of Alaska': ['Juno','Anchorage']}
QUIZ(questions)
AtditError:类型对象“Q1”没有属性“破坏”Hi@ USE35000 082.如果这个答案已经解决了你的问题,请考虑点击复选标记。这向更广泛的社区表明,你已经找到了一个解决方案,并给回答者和你自己带来了一些声誉。我们没有义务这么做。虽然从技术上讲这是可行的,但它给出了一些有问题的建议。Tkinter不是设计成这样的。更好的解决方法是隐藏主窗口,而不是销毁它,然后创建并销毁
Toplevel
@Bryan Oakley的实例,使主窗口永远不会关闭/重新打开。由于没有保存或引用任何数据,也没有在窗口之间进行任何交互,也没有在代码的各个部分之间传输变量,因此似乎不需要维护静态根,因为Tk确实允许您在不进行新调用的情况下销毁/生成主窗口。但你是对的,这不是一个好办法。添加了一些内容并重新编码了我的帖子。。。