PyQT应用程序在哪里保存然后由其他小部件处理的数据?

2024-06-16 14:19:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个应用程序,使用PyQt4分析从我们的数据采集软件获取的数据。应用程序将由几个小部件组成:

  • 显示导入了哪些文件(以及这些文件中有哪些数据通道)的小部件;该小部件还将包含在生成数据文件时查找数据文件的文件监视程序
  • 一个小部件,在导入某些数据通道时绘制它们
  • 执行不同分析并显示分析结果的多个其他小部件

所有这些小部件都将包含在QMainWindow中

因此,基本上,主要程序是:文件生成(应用程序外部)->导入到pandas dataframe中的文件->;数据打印/分析

我不清楚的是,在应用程序中的哪个位置是实际运行导入函数的最佳位置(因此,实际的pandas数据帧将保存在哪里)。在

对我来说有意义的两个地方要么在第一个提到的小部件中(这个小部件负责监视/显示导入的内容的文件),要么是实际的QMainWindow本身。在

我知道如何告诉QMainWindow中当前的所有小部件,一个文件已经使用signals/slot导入。因此,例如,文件监视程序小部件将在每次导入文件时发出一个信号。这将连接到其他小部件中的插槽,这些小部件会告诉它们更新当前的绘图,或者运行一些分析,或者其他什么。在

但是我遇到的不确定点是如何使导入的数据对QMainWindow中当前所有的小部件都可用。这就是我问import函数应该在哪里实际运行的意思。在

希望我的要求是清楚的;如果没有请告诉我。在

编辑:

在Qt中阅读更多关于MVC设计的文章,我不清楚它在这里是否合适。我希望使应用程序的各个部分尽可能独立,所以使用MVC背后的想法非常有吸引力,但是我很难理解在我的案例中如何实现它。我所能找到的所有例子似乎都在处理更新,例如,一个树形图和一个组合框,这样当一个数据被编辑时,它与另一个的数据保持同步(即,由于数据保存在一个地方,它们都会发生变化)。在

在我的例子中,数据本身在导入之后不会被任何东西修改。分析可以在其上运行,但这将独立于每个小部件,并且不会对已导入到应用程序中的实际原始数据产生任何影响。每个小部件本质上是独立的,在该小部件中发生的任何事情都不会影响应用程序中的任何其他小部件。主应用程序中当前活动的每个小部件只需访问导入的数据,并且需要知道何时添加了新的数据(这被设想为与pandas数据帧匹配的文件名字典)

正如建议的那样,将数据保存在主应用程序中并连接到每个小部件以指示新的数据块现在可用是很简单的,所以我了解了这是如何工作的。在

我只是很不清楚去MVC路线会有什么收获。在


Tags: 文件数据函数程序应用程序编辑pandas部件
1条回答
网友
1楼 · 发布于 2024-06-16 14:19:47

实际上,只有一个事件触发,即找到的新文件,然后依次启动每个其他进程。因此,您可以将所有代码放在主窗口类中,因为您的过程至少在表面上听起来有些简单。数据将通过类变量共享,计时器用于检查文件(它是唯一的事件触发器)。这将提供一个主窗口类,其基本结构如下(伪代码):

class MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()
        self.build_ui()
        self.imported_data = {}
        timer = QTimer()
        timer.timeout.connect(check_for_files)
        timer.start(10000)  # periodically check for new files

    def build_ui(self):
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)

    def check_for_files(self):
        # check for new files here
        if new_file:
            self.import_data(file_name)
            self.ui.filename_list.addItem(file_name)  # add file name widget
            self.plot_data(file_name)             

    def import_data(self, file_name):
        # open file and read data to file_data
        self.ui.imported_data[file_name] = file_data

    def plot_data(self, file_name):
        self.ui.graph.add_plot(self.imported_data[file_name])

如果你的程序变大了,这会变得很难看,但应该可以工作。如果您想要一个更具可伸缩性的设计,其中主窗口、处理和数据都在不同的类中,您可以签出model-view-controller design并将处理放在控制器类中,将数据放在模型类中。在

相关问题 更多 >