在 PyQt 中结合文件对话框和按钮

Combining a file dialog with buttons in PyQt

我正在努力从 Tkinter 过渡到更面向对象的 PyQt 方法。我的特定问题侧重于将文件对话框与按钮结合起来。在下面的例子中,有几行我承认不完全理解的代码,我使用文件对话框加载时间序列,存储为 .csv 文件,到数据帧中,然后绘制它:

import sys
import pandas as pd
from matplotlib import pyplot as plt
from PyQt5.QtWidgets import QApplication, QWidget, QFileDialog,

class App(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'Series Plotter'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 480
        self.initUI()

    def initUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)
        self.openFileNameDialog()
        self.show()

    def openFileNameDialog(self):
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self,"Choose File", "","csv (*.csv)", 
        options=options)
        df=pd.read_csv(fileName)
        df.plot()
        plt.show()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = App()
    sys.exit(app.exec_())

只要它自动启动一个文件对话框并绘制所选的时间序列,它就可以工作。但是,我更愿意执行以下操作:

  1. 在我的 window 中有一个“打开文件”按钮来启动文件对话框。
  2. 在我的 window 中有一个“绘制系列”按钮来绘制所选系列。我想在实际选择系列之前需要禁用此按钮。

尽管查看了各种教程,但我仍在努力寻找执行此操作的 pythonic 方式,我将这一事实归因于我对面向对象方法的了解有限。

您可以尝试创建一个 main window 并在其中添加 button,并将 connect 按钮单击事件添加到您初始化所创建的 class 的函数中,像这样:

from PyQt5 import QtWidgets
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.resize(300,300)
        frame =QtWidgets.QFrame()
        self.setCentralWidget(frame)
        layout = QtWidgets.QHBoxLayout()
        frame.setLayout(layout)
        self.fileOpenButton = QtWidgets.QPushButton('Click to open File Dialog',self)
        layout.addWidget(self.fileOpenButton)
        self.fileOpenButton.clicked.connect(self.buttonClicked)

    def buttonClicked(self):
        wig = App()

def main():
    app = QApplication([])
    mainWindow = MainWindow()
    mainWindow.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()

输出:

点击按钮后:

选择文件后: