Овалы, нарисованные на холсте, не отображаются, пока я вручную не увеличу (масштаб)

#python #python-3.x #tkinter #tkinter-canvas

#python #python-3.x #tkinter #tkinter-canvas

Вопрос:

Довольно новичок в python, возможно, ~ 1 год опыта. Использование python 3.8.5 и tkinter.

Проект включает в себя создание графического интерфейса, проблемы с отображением на нем. В одном из фреймов у меня есть холст. На этом холсте я рисую круги для представления местоположений, пользователь может перемещать / масштабировать с помощью мыши, нажимать на круги для получения информации и т. Д.

Проблема возникает во время первоначального рисования карты. Я запускаю функцию 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)
  

Ответ №1:

При написании вопроса я наконец понял, что происходит.

Мои CSV-номера были довольно большими (в диапазоне от сотен до тысяч), и поэтому, когда я изначально рисовал круги (mapdotsize = 18), они рисовались, но были просто очень далеко. Перетаскивание мышью не показало их в непосредственной близости, поэтому я предположил, что они не рисуются.

Каким-то образом, когда я увеличил масштаб с помощью мыши, [кто-нибудь еще, пожалуйста, объясните, что происходит на самом деле], казалось, что вид «привязывается» к разумной области внутри области рисования, которая содержит точки карты; это выглядело так, как будто они «внезапно появились». Я понял это, перетащив карту влево намного больше раз, чем я пробовал раньше, и внезапно увидел «правый» край моих точек.

Комментарии:

1. Вы могли бы просто удалить вопрос, если вы нашли ответ, или вы могли бы включить свой вывод в сообщение.

2. Координаты Tkinter являются 16-разрядными. Вероятно, увеличение масштаба привело к тому, что позиции вашего овала превысили 64 КБ, поэтому они обернулись, вернулись в поле зрения.

3. Обновление scrollregion прокручивает область просмотра до точек карты.