Доставка данных между экземплярами разных классов в tkinter - PullRequest
0 голосов
/ 10 декабря 2018

Начинающий в tkinder и версия python 3.6.

Я пытаюсь создать графический интерфейс Python для обработки данных.

Существует несколько экземпляров разных классов, предназначенных для разных заданий.

Когда данные обрабатываются с помощью функции click_emd в классе EMDFrame, их следует рисовать в классе PreviewFrame, который использует matplotlib для отображенияданные.Однако я понятия не имею, как передавать данные между двумя классами.

Я искал похожие вопросы, но они не работали.

Теперь я думаю о двух возможных решениях.

Один - это найти способ передать data_processed в previewframe.cplot в emdframe.click_emd.

Другой - полностью использовать класс MainPage.Он может получить data_processed из одного класса и вызвать cplot в другом классе для рисования.Но как MainPage может быть замечен после генерации data_processed?

Запутался и не знает, что делать.Очень ценю за ваше терпение.

Существует два файла кода 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 голосов
/ 10 декабря 2018

Вы не передаете данные между классами, вы передаете данные между двумя экземплярами классов.

Чтобы один экземпляр отправлял данные другому экземпляру класса, он должен знать об этом.Таким образом, в 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, но это потребовало бы немного больше кода.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...