在 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_())
只要它自动启动一个文件对话框并绘制所选的时间序列,它就可以工作。但是,我更愿意执行以下操作:
- 在我的 window 中有一个“打开文件”按钮来启动文件对话框。
- 在我的 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()
输出:
点击按钮后:
选择文件后:
我正在努力从 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_())
只要它自动启动一个文件对话框并绘制所选的时间序列,它就可以工作。但是,我更愿意执行以下操作:
- 在我的 window 中有一个“打开文件”按钮来启动文件对话框。
- 在我的 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()
输出:
点击按钮后:
选择文件后: