通过在mainloop中运行的其他脚本更新tkinter canvas图像

时间:2020-06-30 22:27:56

标签: python oop tkinter canvas

目标:

我有两个脚本,一个用于tkinter gui,另一个在按下tkinter按钮时运行,可生成多个图像。 创建图像后,我想在运行时更新tkinter图像画布。

预期结果:

tkinter画布图像应在GraphGen.run()中for循环的每次迭代中更新

实际结果:

最初的画布图像消失了,没有显示其他图像。

到目前为止我尝试过的事情:

我发现我需要使用.itemconfig(...),但仍未更新。立即使用.pack()没有区别。 你能告诉我一些好的方法吗?对我来说,传递画布对象已经很麻烦。

tkinter gui类的代码:

class Gui:

    def __init__(self):
        self.root = Tk()
        self.root.geometry("1280x720")
        self.button = None
        self.gg = GraphGen()
        self.canvas = None
        self.img_on_canvas = None

    def build_gui(self):
        self.canvas = Canvas(self.root, width=600, height=500)
        self.canvas.pack()
        self.canvas.place(x=500, y=100)
        img = PhotoImage(file="1.png")
        self.img_on_canvas = self.canvas.create_image(1, 1, image=img, anchor='nw')
        self.button = Button(self.root, width=20, height=20, text='PRESS', command=self.button_function)
        self.button.place(x=100, y=100)
        self.root.mainloop()

    def button_function(self):
        self.gg.run(self.canvas, self.img_on_canvas)

生成脚本的代码:

class GraphGen:

    def __init__(self):
        self.x = np.arange(0, 10)
        self.y = None

    def run(self, image_canvas, image_on_canvas):
        for i in np.arange(1, 6):
            self.y = [np.sqrt(i*xc) / np.exp(i*xc - 1) for xc in self.x]
            plt.figure()
            plt.ylim(0, 1)
            plt.xlim(0, 10)
            plt.plot(self.x, self.y)
            plt.savefig(f"{i}.png")
            if image_canvas is not None:
                img = PhotoImage(file=f"{i}.png")
                image_canvas.itemconfig(image_on_canvas, image=img)
                image_canvas.pack()
            else:
                plt.show()

编辑:

我已经有一个文件“ 1.png”开始。

0 个答案:

没有答案