我向小部件添加了静态底图(图),但我无法使小部件具有交互性(例如,向上滚动=放大,向下滚动=缩小,单击+保持=移动地图),例如一些矩形,但是当我添加图形时,小部件不能是交互式的
import tkinter as tk
import matplotlib
matplotlib.use('TkAgg')
from mpl_toolkits.basemap import Basemapca
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class Zoom_Advanced(tk.Frame):
def __init__(self, root):
tk.Frame.__init__(self, root)
self.canvas = tk.Canvas(self, width=400, height=400, background="bisque")
self.xsb = tk.Scrollbar(self, orient="horizontal", command=self.canvas.xview)
self.ysb = tk.Scrollbar(self, orient="vertical", command=self.canvas.yview)
self.canvas.configure(yscrollcommand=self.ysb.set, xscrollcommand=self.xsb.set)
self.canvas.configure(scrollregion=(0, 0, 1000, 1000))
self.xsb.grid(row=1, column=0, sticky="ew")
self.ysb.grid(row=0, column=1, sticky="ns")
self.canvas.grid(row=0, column=0, sticky="nsew")
self.grid_rowconfigure(0, weight=1)
self.grid_columnconfigure(0, weight=1)
fig = Figure()
ax1 = fig.add_subplot(111)
m = Basemap(width=12000000, height=9000000, projection='lcc',
resolution='c', lat_1=45., lat_2=55, lat_0=50, lon_0=-107.,
ax=ax1)
m.drawmapboundary(fill_color='aqua')
m.fillcontinents(color='coral', lake_color='aqua')
# This is what enables using the mouse:
self.canvas.bind("", self.move_start)
self.canvas.bind("", self.move_move)
# windows scroll
self.canvas.bind("", self.zoomer)
self.canvas = FigureCanvasTkAgg(fig, master=self)
self.canvas.get_tk_widget().grid(row=0, column=0)
#toolbar = NavigationToolbar2QT(tk, root)
#toolbar.update()
# move
def move_start(self, event):
self.canvas.scan_mark(event.x, event.y)
def move_move(self, event):
self.canvas.scan_dragto(event.x, event.y, gain=1)
#windows zoom
def zoomer(self,event):
if (event.delta > 0):
self.canvas.scale("all", event.x, event.y, 1.1, 1.1)
elif (event.delta < 0):
self.canvas.scale("all", event.x, event.y, 0.9, 0.9)
self.canvas.configure(scrollregion = self.canvas.bbox("all"))
root = tk.Tk()
app = Zoom_Advanced(root)
app.grid(row=0, column=1, sticky="ew") # we grid zoom_advanced because in zoom_advanced only canvas is grided
root.mainloop()