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

时间:2018-12-10 10:30:00

标签: python-3.x tkinter

入门,而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()

1 个答案:

答案 0 :(得分: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类,可能有更好的方法,但这会涉及更多代码。)

相关问题