python-tkinter-用矩形制成的网格中的矩形着色问题

python-tkinter-用矩形制成的网格中的矩形着色问题,第1张

概述我正在尝试在python中编写寻路算法.用户应该通过将鼠标悬停在字段上并按s来选择起点.现在,该字段应更改颜色.但是,我无法弄清楚我的代码出了什么问题.我只能为左上角到右下角的字段上色.在代码中,我在控制台中打印出了objectID,这表明我创建矩形的方式可能存在问题.我在Window类的draw_grid方法中创建矩形,并在select_start_nod

我正在尝试在python中编写寻路算法.用户应该通过将鼠标悬停在字段上并按s来选择起点.现在,该字段应更改颜色.

但是,我无法弄清楚我的代码出了什么问题.我只能为左上角到右下角的字段上色.在代码中,我在控制台中打印出了objectID,这表明我创建矩形的方式可能存在问题.

我在Window类的draw_grID方法中创建矩形,并在select_start_node方法中为字段着色.

import tkinter as tkclass Window:    def __init__(self):        self.height = 600        self.wIDth = 600        self.grID_List = {x for x in range(0,600)}        self.grID = []        self.grID_dict = {}        self.root = tk.Tk()        self.root.geometry("600x600")        self.root.resizable(False,False)        self.canvas = tk.Canvas(self.root,wIDth=self.wIDth,height=self.height,background="white")        self.canvas.bind("s",self.select_start_node)        self.canvas.bind("<1>",lambda event:        self.canvas.focus_set())    def draw_grID(self):        print(self.grID)        for x in self.grID_List:            if x % 30 == 0:                self.grID.append(x)            else:                pass        print(self.grID)        for x in self.grID:            for y in self.grID:                print(x,y+30)                rec = self.canvas.create_rectangle(x,x,y+30,y+30)        self.canvas.pack()    def select_start_node(self,event):        print(event.x,event.y)        x = self.canvas.canvasx(event.x)        y = self.canvas.canvasy(event.y)        item = self.canvas.find_closest(x,y)        p = self.canvas.coords(item)        print(item)        print(p)        self.canvas.create_rectangle(p[0],p[0],p[0]+30,fill="red")def main():    node_List = []    cord_List = []    window = Window()    window.draw_grID()    window.root.mainloop()if __name__ == "__main__":    main()
最佳答案我不了解您的游戏整体设计,但建议您在矩形网格方面做些不同的事情.在下面的代码中,self.grID是二维列表列表,每个条目都是Canvas矩形对象.这使得相对应地选择和更改其中之一,因为canvas.find_closest(x,y)将直接为您提供关联的矩形对象的对象ID,这使得更改其填充颜色变得微不足道.

因此,我也对其进行了更改,因此您只需单击一个矩形即可对其进行更改,而无需移动鼠标光标然后按任意键.

还要注意,我也摆脱了大部分在各处使用的硬编码数字常量,这使代码更加灵活,以防您以后决定更改其中一个.

import tkinter as tkclass Window:    def __init__(self):        self.cell_size = 30        self.height = 600        self.wIDth = 600        self.hz_cells = self.wIDth // self.cell_size  # Number of horizontal cells.        self.vt_cells = self.height // self.cell_size  # Number of vertical cells.        # Preallocate 2D grID (List-of-Lists).        self.grID = [[None for _ in range(self.hz_cells)]                                for _ in range(self.vt_cells)]        self.root = tk.Tk()        self.root.geometry("%sx%s" % (self.wIDth,self.height))        self.root.resizable(False,background="white")        self.canvas.pack()        self.canvas.bind("<1>",self.select_start_node)#        You can still do it this way if you want.#        self.canvas.bind("s",self.select_start_node)#        self.canvas.bind("<1>",lambda event: self.canvas.focus_set())        def draw_grID(self):        """ Fill Canvas with a grID of white rectangles. """        for i in range(self.hz_cells):            x = i * self.cell_size            for j in range(self.vt_cells):                y = j * self.cell_size                self.grID[i][j] = self.canvas.create_rectangle(                    x,y,x+self.cell_size,y+self.cell_size,fill="white")    def select_start_node(self,event):        """ Change the color of the rectangle closest to x,y of event. """        x = self.canvas.canvasx(event.x)        y = self.canvas.canvasy(event.y)        selected_rect = self.canvas.find_closest(x,y)        if selected_rect:            self.canvas.itemconfigure(selected_rect,fill="red")  # Change color.def main():    node_List = []    cord_List = []    window = Window()    window.draw_grID()    window.root.mainloop()if __name__ == "__main__":    main()
总结

以上是内存溢出为你收集整理的python-tkinter-用矩形制成的网格中的矩形着色问题 全部内容,希望文章能够帮你解决python-tkinter-用矩形制成的网格中的矩形着色问题 所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1199622.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存