在tkinter中的不同类的实例之间传递数据

loading...


2

初学者到tkinder和python的版本是3.6 .

我正在尝试为数据处理创建一个python GUI .

为不同的工作设计了不同类别的几个实例 .

当使用EMDFrame类中的函数click_emd处理数据时,应该使用matplotlib来显示数据的PreviewFrame类中绘制数据 . 但是我不知道如何在两个类之间传递数据 .

我搜索过类似的问题但他们没有用 .

现在我正在考虑两种可能的解决方案 .

一种是找到一种方法将data_processed传递给emdframe.click_emd中的previewframe.cplot .

另一个是充分利用MainPage类 . 它可以从一个类中获取data_processed并调用另一个类中的cplot来绘制 . 但是一旦生成了data_processed,MainPage怎么会被注意到呢?

感到困惑,不知道该怎么做 . 非常感谢您的耐心等待 .

有两个py代码文件 .

Mainframe.py:

import tkinter as tk
from view import *  # initiate the subframes

class MainPage():
    def __init__(self, master=None):
        self.root = master
        root.geometry('%dx%d' % (800, 600))
        self.createPage()

    def createPage(self):
        self.emdPage = EMDFrame(root)  # subframe
        self.emdPage.place(x=20, y=300)
        self.preview = PreviewFrame(root)
        self.preview.place(x=340, y=20)
        self.aboutPage = AboutFrame(root)

        menubar = Menu(root)
        menubar.add_command(label='EMD', command=self.emd)
        menubar.add_command(label='About', command=self.aboutDisp)
        root['menu'] = menubar  # set menu

    def emd(self):
        self.emdPage.place(x=20, y=300)
        self.preview.place(x=340, y=20)
        self.aboutPage.place_forget()

    def aboutDisp(self):
        self.emdPage.place_forget()
        self.preview.place_forget()
        self.aboutPage.place(x=20, y=300)

    def plot_update(self, data, t):
        self.preview.cplot(data, t)

root = tk.Tk()
root.title("Demo")
app = MainPage(root)
root.mainloop()

view.py:

from tkinter import *
from pyhht.emd import EMD
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
import numpy as np

data = []

class EMDFrame(LabelFrame):
    def __init__(self, master=None):
        LabelFrame.__init__(self, master, width=300, height=250, text='EMD')
        self.root = master
        self.createPage()

    def createPage(self):
        b = Button(self, text='EMD', width=20, height=2, command=self.click_emd)
        b.place(x=40, y=160, anchor='nw', width=80, height=40)

    def click_emd(self):
        global data
        decomposer = EMD(data)
        data_processed = decomposer.decompose()
        # Deliever data_processed to PreviewFrame's cplot function

class PreviewFrame(LabelFrame):
    def __init__(self, master=None):
        LabelFrame.__init__(self, master, width=440, height=530, text='Preview')
        self.root = master
        self.createPage()

    def cplot(self, data, t):
        f = Figure(figsize=(4, 4.8), dpi=100)
        a = f.add_subplot(111)
        a.plot(t, data)

        canvas = FigureCanvasTkAgg(f, master=self)
        canvas.draw()
        canvas.get_tk_widget().place(x=20, y=0)


    def createPage(self):
        t = np.arange(0.0, 3, 0.01)
        s = np.sin(2 * np.pi * t)
        self.cplot(s,t)

class AboutFrame(Frame):
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.root = master
        self.createPage()

    def createPage(self):
        Label(self, text='About').pack()

loading...

1回答

  • 0

    您不是在类之间传递数据,而是在两个类实例之间传递数据 .

    为了使一个实例将数据发送到类的另一个实例,它需要知道它 . 因此,在MainFrame.py中,我们将预览类的引用传递给emdPage .

    def createPage(self):
        self.preview = PreviewFrame(root)
        self.preview.place(x=340, y=20)
        self.emdPage = EMDFrame(root,self.preview)  # subframe
        self.emdPage.place(x=20, y=300)
        self.aboutPage = AboutFrame(root)
    

    然后在另一个view.py中,更新类以跟踪预览引用,然后在处理完数据后使用它 .

    class EMDFrame(LabelFrame):
        def __init__(self, preview, master=None):
            LabelFrame.__init__(self, master, width=300, height=250, text='EMD')
            self.preview = preview
            self.root = master
            self.createPage()
    
        def createPage(self):
            b = Button(self, text='EMD', width=20, height=2, command=self.click_emd)
            b.place(x=40, y=160, anchor='nw', width=80, height=40)
    
        def click_emd(self):
            global data
            decomposer = EMD(data)
            data_processed = decomposer.decompose()
            # Deliever data_processed to PreviewFrame's cplot function
            self.preview.cplot(.....)
    

    (代码示例未经测试且不完整但应显示原理)(可能有更好的方法来考虑MainPage类,但这会涉及更多的代码 . )

评论

暂时没有评论!