#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 прокручивает область просмотра до точек карты.