Python 使画布可在两个窗口上从鼠标滚轮滚动
我的GUI有两个弹出窗口。单击“下一步”时,鼠标滚轮上的滚动将在窗口上运行。当我单击另一个“下一步”按钮并打开另一个窗口时,在最后一个窗口上使用鼠标滚轮的滚动将停止工作,并且仅在最近打开的窗口上工作。如何使鼠标滚轮同时在选定窗口上工作Python 使画布可在两个窗口上从鼠标滚轮滚动,python,python-3.x,tkinter,tkinter-canvas,Python,Python 3.x,Tkinter,Tkinter Canvas,我的GUI有两个弹出窗口。单击“下一步”时,鼠标滚轮上的滚动将在窗口上运行。当我单击另一个“下一步”按钮并打开另一个窗口时,在最后一个窗口上使用鼠标滚轮的滚动将停止工作,并且仅在最近打开的窗口上工作。如何使鼠标滚轮同时在选定窗口上工作 import tkinter as tk import matplotlib.pyplot as plt from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationTool
import tkinter as tk
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg, NavigationToolbar2Tk
all_figures1 = []
selected_figure1 = 0
all_figures2 = []
selected_figure2 = 0
class MyClass1():
def __init__(self):
self.sheets = [[1,2,3], [3,1,2], [1,5,1]]
self.W = 2
self.L = 5
def plot_sheet(self, data):
"""plot single figure"""
fig, ax = plt.subplots(1)
ax.set_xlim([0, self.W])
ax.set_ylim([0, self.L])
ax.plot(data)
return fig
def generate_all_figures(self):
"""create all figures and keep them on list"""
global all_figures
for data in self.sheets:
fig = self.plot_sheet(data)
all_figures1.append(fig)
class MyClass2():
def __init__(self):
self.sheets = [[3,2,1], [2,5,3], [5,1,5]]
self.W = 2
self.L = 5
def plot_sheet(self, data):
"""plot single figure"""
fig, ax = plt.subplots(1)
ax.set_xlim([0, self.W])
ax.set_ylim([0, self.L])
ax.plot(data)
return fig
def generate_all_figures(self):
"""create all figures and keep them on list"""
global all_figures
for data in self.sheets:
fig = self.plot_sheet(data)
all_figures2.append(fig)
dataPlot1 = None
dataPlot2 = None
def on_window1():
def show_figure(number):
global dataPlot1
current_num = str(number+1)
total_num = str(len(all_figures1))
counter = tk.Label(top, text = current_num + "/" + total_num)
counter.grid(row=4,column=0)
# remove old canvas
if dataPlot1 is not None: # at start there is no canvas to destroy
dataPlot1.get_tk_widget().destroy()
# get figure from list
one_figure = all_figures1[number]
# display canvas with figuere
dataPlot = FigureCanvasTkAgg(one_figure, master=top)
dataPlot.draw()
dataPlot.get_tk_widget().grid(row=0, column=0)
toolbar_frame = tk.Frame(top)
toolbar_frame.grid(row=1,column=0)
toolbar = NavigationToolbar2Tk(dataPlot, toolbar_frame)
toolbar.update()
def on_prev():
global selected_figure1
# get number of previous figure
selected_figure1 -= 1
if selected_figure1 < 0:
selected_figure1 = len(all_figures1)-1
show_figure(selected_figure1)
def on_next():
global selected_figure1
# get number of next figure
selected_figure1 += 1
if selected_figure1 > len(all_figures1)-1:
selected_figure1 = 0
show_figure(selected_figure1)
top = tk.Toplevel()
top.wm_geometry("794x470")
top.title('Optimized Map 1')
selected_figure1 = 0
dataPlot = None # default value for `show_figure`
show_figure(selected_figure1)
frame = tk.Frame(top)
frame.grid(row=3, column=0)
canvas1 = tk.Canvas(top, width=400, height=280)
canvas1.grid(row=0,column=200)
for i in range(40):
l3 = tk.Label(canvas1, text="Number of Rectangles:" + str(i))
canvas1.create_window(50,21*i, window=l3, anchor=tk.NW)
myscrollbar= tk.Scrollbar(top,orient=tk.VERTICAL,command=canvas1.yview)
myscrollbar.grid(row=0,column=200, sticky=tk.NS)
canvas1.configure(yscrollcommand=myscrollbar.set)
canvas1.bind_all('<MouseWheel>', lambda event: canvas1.yview_scroll(int(-1*(event.delta/120)), "units"))
canvas1.configure(scrollregion=canvas1.bbox("all"))
#l4 = tk.Label(canvas1, text="Number of Rectangles:")
#canvas1.create_window(50,21, window=l4, anchor=tk.NW)
b1 = tk.Button(frame, text="<<", command=on_prev)
b1.grid(row=2, column=0)
b2 = tk.Button(frame, text=">>", command=on_next)
b2.grid(row=2, column=1)
b4 = tk.Button(frame, text="Save", command=save_file)
b4.grid(row=5, column=0)
def on_window2():
def show_figure(number):
global dataPlot2
current_num = str(number+1)
total_num = str(len(all_figures2))
counter = tk.Label(top, text = current_num + "/" + total_num)
counter.grid(row=4,column=0)
# remove old canvas
if dataPlot2 is not None: # at start there is no canvas to destroy
dataPlot2.get_tk_widget().destroy()
# get figure from list
one_figure = all_figures2[number]
# display canvas with figuere
dataPlot = FigureCanvasTkAgg(one_figure, master=top)
dataPlot.draw()
dataPlot.get_tk_widget().grid(row=0, column=0)
toolbar_frame = tk.Frame(top)
toolbar_frame.grid(row=1,column=0)
toolbar = NavigationToolbar2Tk(dataPlot, toolbar_frame)
toolbar.update()
def on_prev():
global selected_figure2
# get number of previous figure
selected_figure2 -= 1
if selected_figure2 < 0:
selected_figure2 = len(all_figures2)-1
show_figure(selected_figure2)
def on_next():
global selected_figure2
# get number of next figure
selected_figure2 += 1
if selected_figure2 > len(all_figures2)-1:
selected_figure2 = 0
show_figure(selected_figure2)
top = tk.Toplevel()
top.wm_geometry("794x370")
top.title('Optimized Map2')
selected_figure2 = 0
dataPlot = None # default value for `show_figure`
show_figure(selected_figure2)
frame = tk.Frame(top)
frame.grid(row=3, column=0)
canvas = tk.Canvas(top, width=400, height=280)
canvas.grid(row=0,column=200)
for i in range(40):
l3 = tk.Label(canvas, text="Number of Rectangles:" + str(i))
canvas.create_window(50,21*i, window=l3, anchor=tk.NW)
myscrollbar= tk.Scrollbar(top,orient=tk.VERTICAL,command=canvas.yview)
myscrollbar.grid(row=0,column=200, sticky=tk.NS)
canvas.configure(yscrollcommand=myscrollbar.set)
canvas.bind_all('<MouseWheel>', lambda event: canvas.yview_scroll(int(-1*(event.delta/120)), "units"))
canvas.configure(scrollregion=canvas.bbox("all"))
b1 = tk.Button(frame, text="<<", command=on_prev)
b1.grid(row=2, column=0)
b2 = tk.Button(frame, text=">>", command=on_next)
b2.grid(row=2, column=1)
window = tk.Tk()
mc1 = MyClass1()
mc1.generate_all_figures()
mc2 = MyClass2()
mc2.generate_all_figures()
b1 = tk.Button(window, text="Next", command=on_window1)
b1.grid(row=0, column=0)
b2 = tk.Button(window, text="Next", command=on_window2)
b2.grid(row=1, column=0)
window.mainloop()
将tkinter作为tk导入
将matplotlib.pyplot作为plt导入
从matplotlib.backends.backend_tkagg导入图CAVASTKAGG,导航工具栏2TK
所有图1=[]
所选\u图1=0
所有图2=[]
所选\u图2=0
类MyClass1():
定义初始化(自):
self.sheets=[[1,2,3],[3,1,2],[1,5,1]]
self.W=2
自升=5
def绘图表(自身、数据):
“绘制单个图形”
图,ax=plt子批次(1)
ax.set_xlim([0,self.W])
ax.set_ylim([0,self.L])
ax.绘图(数据)
返回图
def生成所有图形(自身):
“”“创建所有图形并将其保留在列表中”“”
全球所有数字
对于self.sheets中的数据:
图=自绘图表(数据)
所有图1.附加(图)
类MyClass2():
定义初始化(自):
self.sheets=[[3,2,1],[2,5,3],[5,1,5]]
self.W=2
自升=5
def绘图表(自身、数据):
“绘制单个图形”
图,ax=plt子批次(1)
ax.set_xlim([0,self.W])
ax.set_ylim([0,self.L])
ax.绘图(数据)
返回图
def生成所有图形(自身):
“”“创建所有图形并将其保留在列表中”“”
全球所有数字
对于self.sheets中的数据:
图=自绘图表(数据)
所有图2.附加(图)
dataPlot1=无
dataPlot2=无
窗口1()上的def:
def显示图(编号):
全局数据图1
当前_num=str(数字+1)
总数=str(len(所有图1))
计数器=tk.标签(顶部,文本=当前数量+“/”+总数)
counter.grid(行=4,列=0)
#移除旧画布
如果dataPlot1不是None:#开始时没有要销毁的画布
dataPlot1.get_tk_widget().destroy()
#从列表中获取数字
一个数字=所有数字1[数字]
#用figuere显示画布
数据图=图形CAVASTKAGG(一个图形,主图形=顶部)
dataPlot.draw()
dataPlot.get_tk_widget().grid(行=0,列=0)
工具栏\框架=传统框架(顶部)
工具栏\框架网格(行=1,列=0)
工具栏=导航工具栏2TK(数据绘图、工具栏框架)
toolbar.update()
_prev()上的定义:
全局选定的\u图1
#获取上一个数字的数字
所选图1-=1
如果选择图1<0:
选定的图1=len(所有图1)-1
显示图(所选图1)
def on_next():
全局选定的\u图1
#获取下一个数字的数字
所选_图1+=1
如果选择了图1>len(所有图1)-1:
所选\u图1=0
显示图(所选图1)
top=tk.Toplevel()
顶部。wm_几何(“794x470”)
top.title('优化地图1')
所选\u图1=0
dataPlot=None#“显示”图形的默认值`
显示图(所选图1)
框架=传统框架(顶部)
frame.grid(行=3,列=0)
画布1=tk.Canvas(顶部,宽度=400,高度=280)
canvas1.grid(行=0,列=200)
对于范围(40)内的i:
l3=tk.Label(canvas1,text=“矩形数:”+str(i))
canvas1.创建_窗口(50,21*i,窗口=l3,锚点=tk.NW)
myscrollbar=tk.Scrollbar(顶部,orient=tk.VERTICAL,command=canvas1.yview)
myscrollbar.grid(行=0,列=200,粘性=tk.NS)
canvas1.configure(yscrollcommand=myscrollbar.set)
canvas1.bind_all(“”,lambda事件:canvas1.yview_滚动条(int(-1*(event.delta/120)),“units”))
canvas1.configure(scrollregion=canvas1.bbox(“全部”))
#l4=tk.Label(canvas1,text=“矩形数:”)
#画布1.创建窗口(50,21,窗口=l4,锚=tk.NW)
b1=tk.按钮(框,文本=,命令=打开下一步)
b2.网格(行=2,列=1)
b4=tk.按钮(框,text=“Save”,command=Save\u文件)
b4.网格(行=5,列=0)
窗口2()上的def:
def显示图(编号):
全局数据图2
当前_num=str(数字+1)
总数=str(len(所有图2))
计数器=tk.标签(顶部,文本=当前数量+“/”+总数)
counter.grid(行=4,列=0)
#移除旧画布
如果dataPlot2不是None:#开始时没有要销毁的画布
dataPlot2.get_tk_widget().destroy()
#从列表中获取数字
一个数字=所有数字2[数字]
#用figuere显示画布
数据图=图形CAVASTKAGG(一个图形,主图形=顶部)
dataPlot.draw()
dataPlot.get_tk_widget().grid(行=0,列=0)
工具栏\框架=传统框架(顶部)
工具栏\框架网格(行=1,列=0)
工具栏=导航工具栏2TK(数据绘图、工具栏框架)
toolbar.update()
_prev()上的定义:
全局选定的\u图2
#获取上一个数字的数字
所选图2-=1
如果选择图2<0:
选定的图2=len(所有图2)-1
显示图(所选图2)
def on_next():
全局选定的\u图2
#获取下一个数字的数字
所选图2+=1
如果选择了\u图2>len(所有\u图2)-1:
所选\u图2=0
显示图(所选图2)
top=tk.Toplevel()
顶部。wm_几何(“794x370”)
top.title('Optimized Map2')
所选\u图2=0
dataPlot=None#“显示”图形的默认值`
显示图(所选图2)
框架=传统框架(顶部)
frame.grid(行=3,列=0)
画布=tk.canvas(顶部,宽度=400,高度=280)
canvas.grid(行=0,列=200)
对于范围(40)内的i:
l3=tk.Label(画布,text=”矩形数:“+str(i