Python 3.x 如何修复在python中选择文件后继续重新打开的文件对话框

Python 3.x 如何修复在python中选择文件后继续重新打开的文件对话框,python-3.x,pyqt,pyqt5,Python 3.x,Pyqt,Pyqt5,我是pyqt5新手,需要帮助关闭应用程序中的文件对话框。用户界面是使用QT设计器创建的。当我选择一个文件并按下打开按钮时,文件对话框首先关闭,然后再次打开。这是我的问题。它不应该重新开放 我尝试在对话框fileDialog.close()和fileDialog.hide()上使用以下函数,但未能使其正常工作 我使用两个不同的文件,一个用于主窗口,另一个用于文件对话框。在主窗口中,我使用以下类 class Main (QtWidgets.QMainWindow): def __init__

我是pyqt5新手,需要帮助关闭应用程序中的文件对话框。用户界面是使用QT设计器创建的。当我选择一个文件并按下打开按钮时,文件对话框首先关闭,然后再次打开。这是我的问题。它不应该重新开放

我尝试在对话框
fileDialog.close()
fileDialog.hide()
上使用以下函数,但未能使其正常工作

我使用两个不同的文件,一个用于主窗口,另一个用于文件对话框。在主窗口中,我使用以下类

class Main (QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()
        uic.loadUi('MainWindow.ui', self)

        self.btnChooseFile.clicked.connect(self.chooseFile)

    def chooseFile(self):
        fileDialog = OpenFileDialog.FileDialog()
        fileDialog.openFileNameDialog()

app = QtWidgets.QApplication([])
win = Main()
win.show()
sys.exit(app.exec())
另一个类名为OpenFileDialog.py,如下所示:

class FileDialog(QWidget):

    def __init__(self):
        super(FileDialog, self).__init__()
        self.title = 'Choose image-file'
        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.openFileNamesDialog()
        self.saveFileDialog()

        self.show()

    def openFileNameDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self,"QFileDialog.getOpenFileName()", "","All Files (*);;Python Files (*.py)", options=options)
        if fileName:
            print(fileName)


    def openFileNamesDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(self,"QFileDialog.getOpenFileNames()", "","All Files (*);;Python Files (*.py)", options=options)
        if files:
            print(files)


    def saveFileDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self,"QFileDialog.getSaveFileName()","","All Files (*);;Text Files (*.txt)", options=options)
        if fileName:
            print(fileName)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = FileDialog()
    sys.exit(app.exec_()) 
UI文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>winMain</class>
 <widget class="QMainWindow" name="winMain">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>280</width>
    <height>320</height>
   </rect>
  </property>
  <property name="minimumSize">
   <size>
    <width>280</width>
    <height>320</height>
   </size>
  </property>
  <property name="maximumSize">
   <size>
    <width>280</width>
    <height>320</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>OCR</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="btnChooseFile">
    <property name="geometry">
     <rect>
      <x>80</x>
      <y>10</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="text">
     <string>Choose file</string>
    </property>
   </widget>

   <widget class="QLabel" name="lblFile">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>40</y>
      <width>31</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;File:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
   </widget>
   <widget class="QLabel" name="lblFilePath">
    <property name="geometry">
     <rect>
      <x>40</x>
      <y>60</y>
      <width>221</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;FilePath&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>280</width>
     <height>26</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

试试看:

maun.py

import sys
import os                                              # +++
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class FileDialog(QWidget):
    def __init__(self):
        super(FileDialog, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Choose image-file')
        self.setGeometry(100, 100, 640, 480)

#        self.openFileNameDialog()
#        self.openFileNamesDialog()
#        self.saveFileDialog()

    def openFileNameDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self,
                      "QFileDialog.getOpenFileName()", 
                      "",
                      "All Files (*);;Python Files (*.py)", 
                      options=options)
        if fileName:
            print("fileName->", fileName)
            return fileName                                      # +++

    def openFileNamesDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(self,
                   "QFileDialog.getOpenFileNames()", 
                   "",
                   "All Files (*);;Python Files (*.py)", 
                   options=options)
        if files:
            print("files -->>", files)
            return files                                          # +++

    def saveFileDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self,
                      "QFileDialog.getSaveFileName()",
                      "",
                      "All Files (*);;Text Files (*.txt)", 
                      options=options)
        if fileName:
            print("save fileName->", fileName)
            return fileName                                        # +++


class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()

        uic.loadUi('MainWindow.ui', self)

        self.btnChooseFile.clicked.connect(self.chooseFile)
        self.btnChooseFile_2.clicked.connect(self.chooseFiles)     # +++
        self.btnChooseFile_3.clicked.connect(self.saveFile)        # +++

    def chooseFile(self):
#        fileDialog = OpenFileDialog.FileDialog()
        fileDialog = FileDialog()
        fileName = fileDialog.openFileNameDialog()
        self.lblFile.setText( "<b>File:</b> {}".format( os.path.basename(fileName) ))
        self.lblFilePath.setText( "<b>FilePath:</b> {}".format( os.path.dirname(fileName) ))

    def chooseFiles(self):
        fileDialog = FileDialog()
        files = fileDialog.openFileNamesDialog()
        fileNames = ", ".join([ os.path.basename(fileName) for fileName in files ])
        self.lblFile.setText( "<b>Files:</b> {}".format( os.path.basename(fileNames) ))
        self.lblFilePath.setText( "<b>FilePath:</b> {}".format( os.path.dirname(files[0]) ))    

    def saveFile(self):
        fileDialog = FileDialog()
        fileName = fileDialog.saveFileDialog()
        self.lblFile.setText( "<b>Save File:</b> {}".format( os.path.basename(fileName) ))
        self.lblFilePath.setText( "<b>FilePath:</b> {}".format( os.path.dirname(fileName) ))    


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    win = Main()
    win.show()
    sys.exit(app.exec())
导入系统 导入os#+++ 从PyQt5导入QtCore、QtGui、QtWidgets、uic 从PyQt5.QtCore导入* 从PyQt5.QtGui导入* 从PyQt5.QtWidgets导入* 类文件对话框(QWidget): 定义初始化(自): super(FileDialog,self)。\uuuu init\uuuuu() self.initUI() def initUI(self): self.setWindowTitle('选择图像文件') self.setGeometry(100100640480) #self.openfilenamedilog() #self.openFileNamesDialog() #self.saveFileDialog() def OpenFileName对话框(自身): options=QFileDialog.options() 选项|=QFileDialog.DontUsenactiveDialog 文件名,QFileDialog.getOpenFileName(self, “QFileDialog.getOpenFileName()”, "", “所有文件(*);Python文件(*.py)”, 选项=选项) 如果文件名为: 打印(“文件名->”,文件名) 返回文件名#+++ def openFileNamesDialog(自): options=QFileDialog.options() 选项|=QFileDialog.DontUsenactiveDialog 文件,QFileDialog.getOpenFileName(self, “QFileDialog.getOpenFileNames()”, "", “所有文件(*);Python文件(*.py)”, 选项=选项) 如果文件: 打印(“文件-->>”,文件) 返回文件#+++ def SAVEFILE对话框(自身): options=QFileDialog.options() 选项|=QFileDialog.DontUsenactiveDialog 文件名,QFileDialog.getSaveFileName(self, “QFileDialog.getSaveFileName()”, "", “所有文件(*);文本文件(*.txt)”, 选项=选项) 如果文件名为: 打印(“保存文件名->”,文件名) 返回文件名#+++ 类Main(QtWidgets.QMainWindow): 定义初始化(自): 超级(主,自).\uuuu初始化 uic.loadUi('MainWindow.ui',self) self.btnChooseFile.clicked.connect(self.chooseFile) self.btnChooseFile_2.单击.connect(self.chooseFiles)#+++ self.btnChooseFile_3.单击.connect(self.saveFile)#+++ def chooseFile(自): #fileDialog=OpenFileDialog.fileDialog() fileDialog=fileDialog() fileName=fileDialog.openfilenamedilog() self.lblFile.setText(“文件:{}”.format(os.path.basename(fileName))) self.lblFilePath.setText(“文件路径:{}.format(os.path.dirname(fileName))) def chooseFiles(自): fileDialog=fileDialog() files=fileDialog.openFileNamesDialog() fileNames=“,”.join([os.path.basename(fileName)表示文件中的文件名]) self.lblFile.setText(“文件:{}”.format(os.path.basename(fileNames))) self.lblFilePath.setText(“文件路径:{}”.format(os.path.dirname(文件[0])) def保存文件(自身): fileDialog=fileDialog() fileName=fileDialog.saveFileDialog() self.lblFile.setText(“保存文件:{}”.format(os.path.basename(fileName))) self.lblFilePath.setText(“文件路径:{}.format(os.path.dirname(fileName))) 如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu': app=QtWidgets.QApplication([]) win=Main() win.show() sys.exit(app.exec()) main window.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>winMain</class>
 <widget class="QMainWindow" name="winMain">
  <property name="enabled">
   <bool>true</bool>
  </property>
  <property name="minimumSize">
   <size>
    <width>380</width>
    <height>380</height>
   </size>
  </property>
  <property name="maximumSize">
   <size>
    <width>380</width>
    <height>320</height>
   </size>
  </property>
  <property name="windowTitle">
   <string>OCR</string>
  </property>
  <widget class="QWidget" name="centralwidget">
   <widget class="QPushButton" name="btnChooseFile">
    <property name="geometry">
     <rect>
      <x>10</x>
      <y>10</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="text">
     <string>Choose file</string>
    </property>
   </widget>
   <widget class="QLabel" name="lblFile">
    <property name="geometry">
     <rect>
      <x>30</x>
      <y>70</y>
      <width>321</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-weight:600;&quot;&gt;File:&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
   </widget>
   <widget class="QLabel" name="lblFilePath">
    <property name="geometry">
     <rect>
      <x>30</x>
      <y>100</y>
      <width>321</width>
      <height>16</height>
     </rect>
    </property>
    <property name="text">
     <string>&lt;html&gt;&lt;head/&gt;&lt;body&gt;&lt;p&gt;&lt;span style=&quot; font-style:italic;&quot;&gt;FilePath&lt;/span&gt;&lt;/p&gt;&lt;/body&gt;&lt;/html&gt;</string>
    </property>
   </widget>
   <widget class="QPushButton" name="btnChooseFile_2">
    <property name="geometry">
     <rect>
      <x>140</x>
      <y>10</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="text">
     <string>Choose files</string>
    </property>
   </widget>
   <widget class="QPushButton" name="btnChooseFile_3">
    <property name="geometry">
     <rect>
      <x>260</x>
      <y>10</y>
      <width>93</width>
      <height>28</height>
     </rect>
    </property>
    <property name="text">
     <string>Save file</string>
    </property>
   </widget>
  </widget>
  <widget class="QMenuBar" name="menubar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>380</width>
     <height>21</height>
    </rect>
   </property>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>

温曼
真的
380
380
380
320
光学字符识别
10
10
93
28
选择文件
30
70
321
16
htmlhead/bodypspan style=“font-weight:600;”文件:/span/p/body/html
30
100
321
16
htmlhead/bodypspan style=“font-style:italic;”FilePath/span/p/body/html
140
10
93
28
选择文件
260
10
93
28
保存文件
0
0
380
21
试试看:

maun.py

import sys
import os                                              # +++
from PyQt5 import QtCore, QtGui, QtWidgets, uic
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


class FileDialog(QWidget):
    def __init__(self):
        super(FileDialog, self).__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Choose image-file')
        self.setGeometry(100, 100, 640, 480)

#        self.openFileNameDialog()
#        self.openFileNamesDialog()
#        self.saveFileDialog()

    def openFileNameDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getOpenFileName(self,
                      "QFileDialog.getOpenFileName()", 
                      "",
                      "All Files (*);;Python Files (*.py)", 
                      options=options)
        if fileName:
            print("fileName->", fileName)
            return fileName                                      # +++

    def openFileNamesDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        files, _ = QFileDialog.getOpenFileNames(self,
                   "QFileDialog.getOpenFileNames()", 
                   "",
                   "All Files (*);;Python Files (*.py)", 
                   options=options)
        if files:
            print("files -->>", files)
            return files                                          # +++

    def saveFileDialog(self):    
        options = QFileDialog.Options()
        options |= QFileDialog.DontUseNativeDialog
        fileName, _ = QFileDialog.getSaveFileName(self,
                      "QFileDialog.getSaveFileName()",
                      "",
                      "All Files (*);;Text Files (*.txt)", 
                      options=options)
        if fileName:
            print("save fileName->", fileName)
            return fileName                                        # +++


class Main(QtWidgets.QMainWindow):
    def __init__(self):
        super(Main, self).__init__()

        uic.loadUi('MainWindow.ui', self)

        self.btnChooseFile.clicked.connect(self.chooseFile)
        self.btnChooseFile_2.clicked.connect(self.chooseFiles)     # +++
        self.btnChooseFile_3.clicked.connect(self.saveFile)        # +++

    def chooseFile(self):
#        fileDialog = OpenFileDialog.FileDialog()
        fileDialog = FileDialog()
        fileName = fileDialog.openFileNameDialog()
        self.lblFile.setText( "<b>File:</b> {}".format( os.path.basename(fileName) ))
        self.lblFilePath.setText( "<b>FilePath:</b> {}".format( os.path.dirname(fileName) ))

    def chooseFiles(self):
        fileDialog = FileDialog()
        files = fileDialog.openFileNamesDialog()
        fileNames = ", ".join([ os.path.basename(fileName) for fileName in files ])
        self.lblFile.setText( "<b>Files:</b> {}".format( os.path.basename(fileNames) ))
        self.lblFilePath.setText( "<b>FilePath:</b> {}".format( os.path.dirname(files[0]) ))    

    def saveFile(self):
        fileDialog = FileDialog()
        fileName = fileDialog.saveFileDialog()
        self.lblFile.setText( "<b>Save File:</b> {}".format( os.path.basename(fileName) ))
        self.lblFilePath.setText( "<b>FilePath:</b> {}".format( os.path.dirname(fileName) ))    


if __name__ == '__main__':
    app = QtWidgets.QApplication([])
    win = Main()
    win.show()
    sys.exit(app.exec())
导入系统 导入os#+++ 从PyQt5导入QtCore、QtGui、QtWidgets、uic 从PyQt5.QtCore导入* 从PyQt5.QtGui导入* 从PyQt5.QtWidgets导入* 类文件对话框(QWidget): 定义初始化(自): super(FileDialog,self)。\uuuu init\uuuuu() self.initUI() def initUI(self): self.setWindowTitle('选择图像文件') self.setGeometry(100100640480) #self.openfilenamedilog() #self.openFileNamesDialog() #self.saveFileDialog() def OpenFileName对话框(自身): options=QFileDialog.options() 选项|=QFileDialog.DontUsenactiveDialog 文件名,QFileDialog.getOpenFileName(self, “QFileDialog.getOpenFileName()”, "",
def open_file_dialog(self):
    # Just this line will open a standard file dialog for you
    res = QFileDialog.getOpenFileName(QFileDialog(self), # parent 
                                      "Select file", # Dialog title
                                      "/some/path/to/open/by/default",
                                      "JPEG Image (*.jpeg)") # filter

    # Once you reach here - dialog will be closed
    if res == ('', ''):
        print("Cancelled")
    else:
        self.process_result(res)