在tkinter中的不同类的实例之间传递数据
初学者到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()
2 years ago
您不是在类之间传递数据,而是在两个类实例之间传递数据 .
为了使一个实例将数据发送到类的另一个实例,它需要知道它 . 因此,在MainFrame.py中,我们将预览类的引用传递给emdPage .
然后在另一个view.py中,更新类以跟踪预览引用,然后在处理完数据后使用它 .
(代码示例未经测试且不完整但应显示原理)(可能有更好的方法来考虑MainPage类,但这会涉及更多的代码 . )