python多个QInputDialog

时间:2019-03-05 14:17:10

标签: python pyqt5

对于一个PyQt5仪器项目,我想一个接一个的几个QInputDialog以便输入一些输入。 如果用户按下按钮“取消”,我希望程序返回到第一个对话框窗口。 这是我的代码:

def getChoice(self):

        while True:
            items = ("Make a new testfile","Open an existing one")
            item, okPressed = QInputDialog.getItem(self, "Select","You want to: ", items, 0, False)

            if not okPressed:      #close all
                sys.exit(0)

            elif okPressed and item:    
                print(item)
                if item == "Open an existing one" :
                    pathFile, ok = QFileDialog.getOpenFileName(self, "Open a file", "","All Files(*);;Python Files (*.py)")
                    print(pathFile)
                    break

                elif item == "Make a new testfile" :
                    items2 = ("New profil","Existing profil")
                    item2, okPressed2 = QInputDialog.getItem(self,"Select", "", items2, 0, False)

                    if not okPressed2:    #pass so come back to the previous inputDialog
                        pass

                    elif okPressed2 and item2:
                        print(item2)
                        if item2 == "New profil" :
                            while True:
                                name, ok = QInputDialog.getText(self, "Profil name", "Enter name:", QLineEdit.Normal)
                                if ok and name:
                                    dirName = 'Profiles/' + name
                                    if not os.path.exists(dirName):
                                        os.makedirs(dirName)
                                        break
                                    else :
                                        QMessageBox.about(self, 'Error','Profile name already taken')

                                elif ok and not name:
                                    QMessageBox.about(self, 'Error', 'Enter a name')

                                else :
                                    #here I'd like to return to the initial inputDialog if the user press cancel
                                    break


                        elif item2 == "Existing profil" :
                            pathprofil = QFileDialog.getOpenFileName(self, "Nom de profil", "","All Files(*)")
                            print(pathprofil)

                    break

使用这种方法,当第二个while循环发生时,我遇到了一个问题:当取消按钮被激活时,我想回到第一个。

我不认为这是一种打破另一种循环的方式,而且我缺乏想象力..

有关如何操作的任何想法?

1 个答案:

答案 0 :(得分:0)

尝试一下:

import os
from PyQt5.QtWidgets import (QApplication, QWidget, QLineEdit, 
                             QInputDialog, QFileDialog, QMessageBox,
                             QGridLayout, QLabel, QPushButton, QFrame)

class InputDialog(QWidget):
    def __init__(self):       
        super(InputDialog,self).__init__()

        label1 = QLabel("Make/Open file:")
        label2 = QLabel("pathFile:")
        label3 = QLabel("profil:")

        self.nameLable = QLabel()
        self.nameLable.setFrameStyle(QFrame.Panel | QFrame.Sunken)      
        self.pathFile = QLabel()
        self.pathFile.setFrameStyle(QFrame.Panel | QFrame.Sunken)
        self.profilLable = QLabel()
        self.profilLable.setFrameStyle(QFrame.Panel | QFrame.Sunken)

        nameButton = QPushButton("...")
        nameButton.clicked.connect(self.selectName)
        profilButton = QPushButton("...")
        profilButton.clicked.connect(self.selectProfil)

        mainLayout = QGridLayout()
        mainLayout.addWidget(label1,          0, 0)
        mainLayout.addWidget(self.nameLable,  0, 1)
        mainLayout.addWidget(nameButton,      0, 2)
        mainLayout.addWidget(label3,          1, 0)
        mainLayout.addWidget(self.profilLable,1, 1)
        mainLayout.addWidget(profilButton,    1, 2)
        mainLayout.addWidget(label2,          2, 0)
        mainLayout.addWidget(self.pathFile,   2, 1, 1, 2)
        mainLayout.setRowMinimumHeight(2, 40)        
        mainLayout.addWidget(QLabel(), 3, 0)        
        mainLayout.setRowStretch(3, 1)
        mainLayout.setColumnMinimumWidth(1, 200 )
        mainLayout.setSpacing(5)

        self.setLayout(mainLayout)

    def selectName(self):
        items = ("Make a new testfile", "Open an existing one")
        item, okPressed = QInputDialog.getItem(self, 
                                    "Select",
                                    "You want to: ", 
                                    items, 0, False)
        if okPressed :
            self.nameLable.setText(item)  
            if item == "Open an existing one" :
                pathFile, ok = QFileDialog.getOpenFileName(self, 
                                    "Open a file", 
                                    "",
                                    "All Files(*);;Python Files (*.py)")
                if pathFile: 
                    self.pathFile.setText(pathFile)
                    self.profilLable.setText("")
            elif item == "Make a new testfile" :
                self.selectProfil()
        else:
            sys.exit(0)

    def selectProfil(self):
        if self.nameLable.text() == "Make a new testfile" :
            self.pathFile.setText("")
            items2 = ("New profil", "Existing profil")
            item2, okPressed2 = QInputDialog.getItem(self,"Select", "", items2, 0, False)
            if not okPressed2:      #pass so come back to the previous inputDialog
                 self.selectName()   
            self.profilLable.setText(item2)
            if item2 == "New profil" :
                name, ok = QInputDialog.getText(self, 
                                     "Profil name", 
                                     "Enter file name:", 
                                     QLineEdit.Normal)
                if ok and name:
                    dirName = 'Profiles'                    #  /' + name
                    if not os.path.exists(dirName):
                        os.makedirs(dirName)

                    filepath = os.path.join(dirName, name)
                    if not os.path.isfile(filepath):                    
                        f = open(filepath, "a")
                        f.close()
                        self.pathFile.setText(os.path.abspath(filepath))
                    else :
                        QMessageBox.about(self, 'Error','Profile name already taken')
                        self.selectProfil()
                elif ok and not name:
                    QMessageBox.about(self, 'Error', 'Enter a name')

                else :
                    #here I'd like to return to the initial inputDialog if the user press cancel
                    self.selectProfil()
            elif item2 == "Existing profil" :
                pathprofil, ok = QFileDialog.getOpenFileName(self, 
                                             "Nom de profil", 
                                             "", "All Files(*)")
                self.pathFile.setText(pathprofil) 
        elif not self.nameLable.text():        
            QMessageBox.about(self, 'Error', 'Select `Make / Open file`')
            self.selectName()

if __name__=="__main__":
    import sys
    app    = QApplication(sys.argv)
    myshow = InputDialog()
    myshow.setWindowTitle("InputDialog")
    myshow.show()
    sys.exit(app.exec_())

enter image description here