Python 使画布可在两个窗口上从鼠标滚轮滚动

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

我的GUI有两个弹出窗口。单击“下一步”时,鼠标滚轮上的滚动将在窗口上运行。当我单击另一个“下一步”按钮并打开另一个窗口时,在最后一个窗口上使用鼠标滚轮的滚动将停止工作,并且仅在最近打开的窗口上工作。如何使鼠标滚轮同时在选定窗口上工作

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