Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PyQt5可重用文件选择对话框_Python_Pyqt5 - Fatal编程技术网

Python PyQt5可重用文件选择对话框

Python PyQt5可重用文件选择对话框,python,pyqt5,Python,Pyqt5,我想使用GUI加载两个文件,然后对这两个文件执行python命令。我想使用一个可重用的文件选择方法来设置调用它的元素。我看到的每个教程都会设置一个特定的命名元素,而不是使用元素。如何修复此代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QDesktopWidget, QLabel, QPushButton, QInputDialog, QLineEdit, QFileDialog, QAction from

我想使用GUI加载两个文件,然后对这两个文件执行python命令。我想使用一个可重用的文件选择方法来设置调用它的元素。我看到的每个教程都会设置一个特定的命名元素,而不是使用元素。如何修复此代码

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QDesktopWidget, QLabel, QPushButton, QInputDialog, QLineEdit, QFileDialog, QAction
from PyQt5.QtGui import QIcon


class dswfGui(QMainWindow):

    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # Build the window widget
        self.setGeometry(300, 300, 550, 550)  # x, y, w, h
        self.setWindowTitle("workflow")
        self.center()

        # Add a label
        label = QLabel("workflow", self)
        label.resize(label.sizeHint())
        label.move(120, 20)

        # Select input file1
        file1_label = QLabel("file 1", self)
        file1_label.resize(file1_label.sizeHint())
        file1_label.move(20,50)
        file1_label.setToolTip('end file 1')
        self.file1 = QLineEdit("Select file", self)
        self.file1.setObjectName("file1")
        self.file1.resize(self.file1.sizeHint())
        self.file1.move(120, 50)
        self.file1.setToolTip('Select file 1')
        f1btn = QPushButton('Select file 1', self)
        f1btn.resize(f1btn.sizeHint())
        f1btn.element = self.file1
        f1btn.move(250, 46)
        f1btn.clicked.connect(self.selectFile)

        # Select input file2
        file2_label = QLabel("file 2", self)
        file2_label.resize(file2_label.sizeHint())
        file2_label.move(20,90)
        file2_label.setToolTip('end file 2')
        self.file2 = QLineEdit("Select file2", self)
        self.file2.setObjectName("file2")
        self.file2.resize(self.file2.sizeHint())
        self.file2.move(120, 90)
        self.file2.setToolTip('Select file 2')
        f2btn = QPushButton('Select file 2', self)
        f2btn.resize(f2btn.sizeHint())
        f2btn.element = self.file1
        f2btn.move(250, 86)
        # this doesn't work because self.selectFile doesn't accept an element or read an element
        f2btn.clicked.connect(self.selectFile)

        self.statusBar()

        # Show window and run
        self.show()

    def center(self):
        qr = self.frameGeometry()
        cp = QDesktopWidget().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())

    def selectFile(self):
        # I want this to be reusable, but it doesn't seem
        # to want to let me pass element in or call self.element
        self.element.setText(QFileDialog.getOpenFileName()[0])
        #this works but is not DRY
        #self.file1.setText(QFileDialog.getOpenFileName()[0])

if __name__ == "__main__":
    app = QApplication(sys.argv)
    gui = dswfGui()
    sys.exit(app.exec_())

我不知道如何使我想要的更清楚。我想在UI中选择两个文件。我想使用一种方法(selectFile)打开QFileDialog并将相应的QLineEdit设置为所选值。我不希望每个QLineEdit都有一个QFileDialog,因为它不是干的。

问题不是很清楚,如果我理解正确,您有以下选项:

使用lambda: 如果需要断开单个功能,这可能会变得很糟糕

f1btn.clicked.connect(lambda: self.selectFile(self.file1))
f2btn.clicked.connect(lambda: self.selectFile(self.file2))
定义两个回调函数 这和你试图避免的几乎是一样的

def file1_select(self):
    self.selectFile(self, self.file1)

def file2_select(self):
    self.selectFile(self, self.file2)

您可以对此进行解释或给出更好的说明,或者在此处查看QFileDialog教程中的示例:。作者在涵盖包括Qt5在内的许多窗口框架的基础知识方面做得非常好。你想同时选择还是逐个选择?你可以更好地设计你的界面,因为有些小部件是重叠的。我想单独选择它们。所以我猜python UI编程一点也不枯燥?每个元素都有自己的draw元素和click元素?@DeniseMauldin它不是关于Python UI,而是关于PyQt/Qt和OO UI,每个UI组件都是一个独立的对象(小部件),其行为是独立的,在许多其他UI框架中,你会发现同样的“问题”。