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