【发布时间】: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