我正在写一个基于Python tkinter的GUI,它应该在新的窗口中显示Matplotlib图,每当我点击一个按钮。图应该是非独占的,我希望能够调出尽可能多的图,因为我想。(原来的应用程序有一个以上的按钮,我缩短了它在下面)
问题在于:当我点击其中一个按钮时,图表显示正确。当我再次关闭图表时,所用按钮的行为变得怪异:
1.在MacOS中,鼠标悬停时显示为按下
1.在Windows中,它在运行时的剩余时间内保持推送状态
在这两个操作系统上,它都能很好地工作。只有按钮的图形在第一次使用后很奇怪。我相信这与正在运行的plt.show()在某种程度上阻止了GUI框架有关,但我不能确定它。
class Simulator:
def __init__(self) -> None:
self.startGUI()
def startGUI(self):
self.window = tk.Tk()
frmCol2 = tk.Frame(pady=10, padx=10)
self.btnDraw = tk.Button(master = frmCol2, text="Draw Something", width=20)
self.btnDraw.grid(row = 1, column = 1)
self.btnDraw.bind("<Button-1>", self.drawSth)
frmCol2.grid(row=1, column=2, sticky="N")
self.window.mainloop()
def drawSth(self, event):
if self.btnDraw["state"] != "disabled":
self.visualizer.plotSth(self.scenario)
然后,绘图本身由以下类的对象可视化工具完成:
class RadarVisualizer:
def plotClutterVelocities(self, scenario):
scArray = np.array(scenario)
plt.figure()
plt.plot(scArray[:,0], scArray[:,1])
plt.title("Some Title")
plt.grid()
plt.show()
我检查了MPL后端:这是TkAGG。我还试图把绘图放在一个不同的线程中,这使得python哭了很多。它似乎希望绘图在同一个线程中开始。也许是因为我使用的后端也是基于Tkinter的。
1条答案
按热度按时间ugmeyewa1#
一个包含许多窗口但没有plt.show()的示例。示例取自here。