如何在强化学习环境中显示tkinter画布

时间:2019-10-02 14:40:21

标签: python tkinter reinforcement-learning tkinter-canvas

我正在创建自定义的 强化学习环境 。到目前为止,环境仅仅是3 x 3的网格。我想创建一个自定义环境,这就是为什么我不使用OpenAI Gym的原因。最终目标是DQN代理找到一条合适的路径以最大化可能的报酬并到达网格上的目的地(例如,目标是到达坐标为[2 | 2]的字段)。

我已经为环境创建了一个示例类(Env类)。 网格的“体系结构”在功能 build_canvas(self)中进行了描述。可见,我使用了 tkinter.canvas 来定义网格系统。不幸的是,当我尝试实例化 Env 类型的对象时,不显示网格。

    class Env(tk.Tk):

        def __init__(self):
            super(Env, self).__init__()
            print("This is the standard constructor of our 
                   environment class.")
            self.build_canvas()

        def build_canvas(self):
            canvas = tk.Canvas(self, bg='green', height=HEIGHT, 
            width=WIDTH)

           ## Create grid with 3x3 (3 rows with 3 columns)
            for c in range(0, WIDTH, 60):
                 x1, y1, x2, y2 = c, 0, c, HEIGHT
                 canvas.create_line(x1, y1, x2, y2)
            for r in range(0, HEIGHT, 60):
                 x1, y1, x2, y2 = 0, r, HEIGHT, r
                 canvas.create_line(x1, y1, x2, y2)

            canvas.pack()
            return canvas


        def render(self):
            print("This renders the environment to the screen.")

        def reset(self):
            print("This resets the environment.")

       def step(self, action):
            print("This takes an action and the environment.")


   if __name__ == "__main__":
           env = Env()

它只是将字符串输出到控制台,但是,网格根本没有加载。有人有建议吗?

1 个答案:

答案 0 :(得分:0)

1-您需要在根目录(此处为mainloop())上调用env
2-您必须保留画布的引用(self.canvas
3-在python 3中,您可以这样调用super:super().__init__(),不带参数。
4-在画线的循环中,WIDTHHEIGHT之间有些混乱。

import tkinter as tk


HEIGHT, WIDTH = 500, 500


class Env(tk.Tk):

    def __init__(self):
        super().__init__()
        print("This is the standard constructor of ourenvironment class.")
        self.canvas = self.build_canvas()
        self.canvas.pack()

    def build_canvas(self):
        canvas = tk.Canvas(self, bg='green', height=HEIGHT, width=WIDTH)

       ## Create grid with 3x3 (3 rows with 3 columns)
        for c in range(0, WIDTH, 60):
            x1, y1, x2, y2 = c, 0, c, HEIGHT
            canvas.create_line(x1, y1, x2, y2)
        for r in range(0, HEIGHT, 60):
            x1, y1, x2, y2 = 0, r, WIDTH, r
            canvas.create_line(x1, y1, x2, y2)

        return canvas


    def render(self):
        print("This renders the environment to the screen.")

    def reset(self):
        print("This resets the environment.")

    def step(self, action):
         print("This takes an action and the environment.")


if __name__ == "__main__":
    env = Env()
    env.mainloop()