【问题标题】:How to display tkinter-canvas for Reinforcement Learning environment如何为强化学习环境显示 tkinter-canvas
【发布时间】:2019-10-02 23:11:12
【问题描述】:

我正在创建一个自定义强化学习环境。到目前为止,环境只是一个 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()

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

【问题讨论】:

    标签: python tkinter reinforcement-learning tkinter-canvas


    【解决方案1】:

    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()
    

    【讨论】:

    • 感谢您的帮助和澄清,它奏效了,我很高兴继续前进! :)
    猜你喜欢
    • 2020-04-21
    • 2021-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-06
    • 1970-01-01
    • 1970-01-01
    • 2018-11-05
    相关资源
    最近更新 更多