微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在画布上绘制的椭圆形直到我手动缩放缩放后才显示

如何解决在画布上绘制的椭圆形直到我手动缩放缩放后才显示

是python的新手,大约一年的经验。使用python 3.8.5和tkinter。

项目涉及构建GUI,而该GUI上的地图存在问题。在其中一个框架中,我有一块画布。在此画布上,我绘制了代表位置的圆圈,用户可以使用鼠标进行平移/缩放,单击圆圈以获取信息等。

问题出在地图的初始绘制期间。我运行readCSV()函数,它正确加载位置和状态(在调试时手动检查“数据”列表),然后运行draw_MapDots()函数。画布是空白的...直到我进行鼠标滚轮缩放,然后所有位置才能正确显示

从CSV中读取位置:

def readCSV():
    global maplbl

    global mapdot_maxx
    global mapdot_maxy
    global data
    global tagdic


    try:
        f=open(filedialog.askopenfilename(),'r')

        reader = csv.reader(f)
        data = list(reader)
        f.close

        ##### CSV Format ####
        ## Data stored in CSV are in the following format:
        ## [Tag ID],[x coordinate],[y coordinate],[read status]
        ##

        for point in data:
            tagdic[point[0]]= point[1:]
            mapdot_maxx = max ([float(point[1]),mapdot_maxx])
            mapdot_maxy = max ([float(point[2]),mapdot_maxy])
        
        draw_MapDots()

        #### trying random stuff to to get canvas to display
        #
        #map_canvas.scale('all',.2,.2)
        #map_canvas.xview_moveto(mapdot_maxx/2)
        #map_canvas.yview_moveto(mapdot_maxy/2)
        #map_canvas.update_idletasks()
        #MainWindow.update_idletasks()

        maplbl.forget()
        maplbl = Label(frame_mapdisplay,text = "Tag Load Complete",font = ("",24))
        maplbl.pack()

    

    except:
        data = [[]]

draw_MapDots函数在这里

def draw_MapDots():
    global map_canvas

    global mapdotsize

    global mapdot_maxx
    global mapdot_maxy
    global data
    global tagdic

    map_canvas.delete("all") #Clears Map
    origin = map_canvas.create_oval(0,.1,fill = "white",tag = "origin") #Creates (0,0) dot

    #Creates a map of dots based on tag file opened
    if len(data)>1:
        for dot in data:
            x = float(dot[1])
            y = -float(dot[2])
            oval = map_canvas.create_oval(x-mapdotsize,y-mapdotsize,x+mapdotsize,y+mapdotsize,fill = "red",activefill = "blue",tag = dot[0])
            if dot[3] == '1':
                map_canvas.itemconfigure(oval,fill = "green")
            if dot[3] == '1':
                map_canvas.itemconfigure(oval,fill = "yellow")

    map_canvas.config(scrollregion=map_canvas.bBox(ALL)) #Set bounding Box for all objects to encompas created map dots

滚轮缩放

def zoom_map(event):
    logging.debug(event)
    global mapdotsize
    scalefactor = .1
    if event.delta/120 < 0:
        map_canvas.scale('all',event.x,event.y,1-scalefactor,1-scalefactor)
        mapdotsize *= 1-scalefactor
    else:
        map_canvas.scale('all',1+scalefactor,1+scalefactor)
        mapdotsize *= 1+scalefactor
    
    map_canvas.config(scrollregion=map_canvas.bBox(ALL)) #Restricts canvas bounding Box to the map dots

map_canvas.bind("<MouseWheel>",zoom_map)

解决方法

在写出问题时,我终于意识到发生了什么事。

我的CSV数字很大(几百到几千个范围),所以当我最初绘制圆圈(mapdotsize = 18)时,它们就被绘制了出来,但实际上距离很远。拖曳鼠标并没有在紧邻的区域显示它们,所以我认为它们没有被绘制。

以某种方式,当我用鼠标缩放时,[请其他人解释实际发生的情况]它似乎是将视图“捕捉”到包含地图点的绘图区域内的合理区域;看起来就像他们“突然出现”一样。我发现此问题的方法是,将地图向左拖动的次数比以前尝试的次数多,然后突然看到了点的“右侧”边缘。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。