tkinter多级窗口

再写一个扫地机器人的可视化窗口,因为房间的边长、机器人数等变量需要用户输入,我的设想是先弹出窗口让用户输入相关数据,保存后在进入下一个窗口生成扫地机器人可视化的界面。但是按照别人的方法不但没有弹窗,而且还让程序陷入了死循环。

from tkinter import *
import tkinter
import tkinter.messagebox


para=[]
class InputPara(tkinter.Toplevel):
    "生成弹窗,让用户输入相关变量值"
    def __init__(self):
        super().__init__() 
        self.title("请输入!")
        self.setupUI()

    def setupUI(self):
        # 第一个数据:房间边长
        row1=tkinter.Frame(self)
        row1.pack(fill="x")
        tkinter.Label(row1,text="房间边长",width=8).pack(side=tkinter.LEFT)
        self.side_length=tkinter.IntVar()
        tkinter.Entry(row1,textvariable=self.num_room,width=20).pack(side=tkinter.LEFT)
        # 第二个数据:机器人数
        row2=tkinter.Frame(self)
        row2.pack(fill="x",ipadx=1,ipady=1)
        tkinter.Label(row2,text="机器人数",width=8).pack(side=tkinter.LEFT)
        self.num_robot=tkinter.IntVar()
        tkinter.Entry(row2,textvariable=self.num_robot,width=20).pack(side=tkinter.LEFT)
        # 第三个数据:是否有家具
        row3=tkinter.Frame(self)
        row3.pack(fill="x",ipadx=2,ipady=2)
        tkinter.Label(row3,text="是否有家具",width=8).pack(side=tkinter.LEFT)
        self.yes=tkinter.BooleanVar()
        tkinter.Checkbutton(row3,text="是",textvariable=self.yes,onvalue=True,offvalue=False).pack(side=tkinter.LEFT)
        # 确认键
        row4=tkinter.Frame(self)
        row4.pack(fill="x")
        tkinter.Button(row4, text="确定", command=self.ok).pack(side=tkinter.RIGHT)
    def ok(self):
        global para
        para = [self.side_length.get(), self.num_robot.get(),self.yes.get()] # 设置数据
        if self.side_length.get()==0 or self.num_robot.get()==0 or self.yes.get() == None:
            tkinter.messagebox.showwarning(title='系统提示',message='请输入!')
            return False
        self.quit()
        self.destroy()
        return para





class RobotVisualization:
    def __init__(self, num_robots, width, height, 
                    furniture_tiles, delay = 0.2):
        "Initializes a visualization with the specified parameters."
        # Number of seconds to pause after each frame 延迟
        self.delay = delay

        self.max_dim = max(width, height)
        self.width = width
        self.height = height
        self.num_robots = num_robots
        self.furniture_tiles = furniture_tiles

        # Initialize a drawing surface 初始化操作界面
        self.master = Tk()
        self.master.title("myRobot!")      #窗体命名

  

    def ask_userinfo(self):

        inputDialog = InputPara()
        self.wait_window(inputDialog) 
        return inputDialog.userinfo
  
    
    

 

加油

应该是这个样子:

from tkinter import *
import tkinter
import tkinter.messagebox
 
 
para=[]
class InputPara(tkinter.Toplevel):
    "生成弹窗,让用户输入相关变量值"
    def __init__(self):
        super().__init__() 
        self.title("请输入!")
        self.setupUI()
 
    def setupUI(self):
        # 第一个数据:房间边长
        row1=tkinter.Frame(self)
        row1.pack(fill="x")
        tkinter.Label(row1,text="房间边长",width=8).pack(side=tkinter.LEFT)
        self.side_length=tkinter.IntVar()
        tkinter.Entry(row1,textvariable=self.side_length,width=20).pack(side=tkinter.LEFT)
        # 第二个数据:机器人数
        row2=tkinter.Frame(self)
        row2.pack(fill="x",ipadx=1,ipady=1)
        tkinter.Label(row2,text="机器人数",width=8).pack(side=tkinter.LEFT)
        self.num_robot=tkinter.IntVar()
        tkinter.Entry(row2,textvariable=self.num_robot,width=20).pack(side=tkinter.LEFT)
        # 第三个数据:是否有家具
        row3=tkinter.Frame(self)
        row3.pack(fill="x",ipadx=2,ipady=2)
        tkinter.Label(row3,text="是否有家具",width=8).pack(side=tkinter.LEFT)
        self.yes=tkinter.BooleanVar()
        tkinter.Checkbutton(row3,text="是",textvariable=self.yes,onvalue=True,offvalue=False).pack(side=tkinter.LEFT)
        # 确认键
        row4=tkinter.Frame(self)
        row4.pack(fill="x")
        tkinter.Button(row4, text="确定", command=self.ok).pack(side=tkinter.RIGHT)
    def ok(self):
        global para
        para = [self.side_length.get(), self.num_robot.get(),self.yes.get()] # 设置数据
        if self.side_length.get()==0 or self.num_robot.get()==0 or self.yes.get() == None:
            tkinter.messagebox.showwarning(title='系统提示',message='请输入!')
            return False
        self.userinfo=para
        self.quit()
        self.destroy()
 
 
 
 
 
class RobotVisualization:
    def __init__(self, num_robots, width, height, 
                    furniture_tiles, delay = 0.2):
        "Initializes a visualization with the specified parameters."
        # Number of seconds to pause after each frame 延迟
        self.delay = delay
 
        self.max_dim = max(width, height)
        self.width = width
        self.height = height
        self.num_robots = num_robots
        self.furniture_tiles = furniture_tiles
 
        # Initialize a drawing surface 初始化操作界面
        self.master = Tk()
        self.master.title("myRobot!")      #窗体命名

    def ask_userinfo(self):
        inputDialog = InputPara()
        self.master.wait_window(inputDialog) 
        return inputDialog.userinfo

生成弹窗时,需要等待用户的输入,可以使用窗口的wait_window方法,在得到用户输出前等待。可以参考一下我的文章https://blog.csdn.net/qq_48979387/article/details/119695934?spm=1001.2014.3001.5502