【问题标题】:Ovals drawn on canvas do not display until I manually zoom (scale)在我手动缩放(缩放)之前,画布上绘制的椭圆不会显示
【发布时间】:2020-10-26 16:40:03
【问题描述】:

对 python 相当陌生,可能总共有大约 1 年的经验。使用 python 3.8.5 和 tkinter。

项目涉及构建 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',0,0 , .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,0,.1,.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',event.x ,event.y , 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)

【问题讨论】:

    标签: python python-3.x tkinter tkinter-canvas


    【解决方案1】:

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

    我的 CSV 数字相当大(在数百到数千范围内),所以当我最初绘制圆圈时(mapdotsize = 18),它们被绘制出来了,但距离真的很远。进行鼠标拖动并没有在直接区域显示它们,所以我认为它们没有被绘制。

    不知何故,当我用鼠标缩放时,[请其他人解释一下到底发生了什么]它似乎将视图“捕捉”到包含地图点的绘图区域内的合理区域;看起来他们“突然出现”。我通过将地图向左拖动比我之前尝试的次数更多次并突然看到我的点的“右”边缘来解决这个问题。

    【讨论】:

    • 如果您找到答案,您可以删除 Q,或者您可以在帖子中包含您的推论。
    • Tkinter 坐标是 16 位的。放大可能会使椭圆的位置超过 64K,因此它们会环绕,重新进入视野。
    • 更新滚动区域会将视口滚动到地图点。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多