我想知道如何实现它,每当我更新绘图时,python 都不会创建新绘图。我只想要一个可以更新其内容的图。我已经在堆栈溢出、Google、ChatGPT 和 Gemini 上花了几个小时,但似乎没有提出解决方案。要么正在创建新的绘图,要么我想要的一个绘图不会自行更新。我在这里缺少什么?
我正在使用 PyCharm,我的 Paython 版本是 3.10。
这是 Visualizer 类:
import cv2
import matplotlib.pyplot as plt
from Utils import WorldModel
class Visualizer:
def __init__(self):
worldmodel = WorldModel.WorldModel()
self.field_img = cv2.imread("./Visualisation/resources/field.png")
self.fig, self.ax = plt.subplots()
self.ax.imshow(self.field_img, extent=[-5200, 5200, -3700, 3700])
self.ax.set(xlim=(-5200, 5200), ylim=(-3700, 3700), aspect='equal')
self.team1 = {} # Store robot circles as matplotlib objects
self.team2 = {}
self.ball = None # Store the ball circle
for robot in worldmodel.team1positions:
position = worldmodel.team1positions[robot]
circle = plt.Circle(position, radius=100, color='blue', alpha=0.8, zorder=2) # Adjust radius as needed
print(f"Updating team 1 robot {robot} to {position}")
self.ax.add_patch(circle)
self.team1[robot] = circle
for robot in worldmodel.team2positions:
position = worldmodel.team2positions[robot]
circle = plt.Circle(position, radius=100, color='red') # Adjust radius as needed
self.ax.add_patch(circle)
self.team2[robot] = circle
x, y = worldmodel.ballposition
self.ball = plt.Circle((x, y), radius=40, color='black')
#Here I have tried also self.fig.show(), plt.show(block=False) or just plt.show()
plt.ion()
plt.figure()
plt.show()
def update(self):
worldmodel = WorldModel.WorldModel()
plt.clf()
for robot in self.team1:
self.team1[robot].center = worldmodel.team1positions[robot]
for robot in self.team2:
self.team2[robot].center = worldmodel.team2positions[robot]
if self.ball:
self.ball.center = worldmodel.ballposition
self.ax.add_patch(self.ball)
#With this the plot is not being updated at all
self.fig.canvas.draw_idle()
self.fig.canvas.flush_events() #Having this or not doesn't seem to make a
difference
#self.fig.show() #this creates new plots the way I expect them to be
plt.pause(10e-10)
这是我的主要部分,我在其中调用更新方法
if __name__ == '__main__':
print("Initialize")
ball = Ball.Ball()
field = Field.Field(9, 6, 2.2)
team_1 = Team.Team("Team 1", Strategy1.Strategy1())
team_2 = Team.Team("Team 2", Strategy2.Strategy2())
worldModel = WorldModel.WorldModel()
worldModel.setup(ball.get_position(), team_1.get_positions(), team_2.get_positions(), field)
for robot in team_1.robots:
robot._world_model = worldModel
for robot in team_2.robots:
robot._world_model = worldModel
rules = Rules
end_condition = False
visualizer = Visualizer.Visualizer()
print("Starting simulation")
worldModel.print()
visualizer.update()
#for i in range(0,10):
while (True):
team_1.execute_next_actions()
ball.update_position()
worldModel.update(ball.get_position(), team_1.get_positions(), team_2.get_positions())
worldModel.print()
worldModel.check_collision()
visualizer.update()
我发现:代码是正确的,但是因为绘图是直接在 PyCharm 中打开的,所以它没有更新。该图必须在单独的窗口中打开。我通过转到“文件”->“设置”->“工具”->“Python 绘图”并取消选中“在工具窗口中显示绘图”框来实现此目的。