Python Forum

Full Version: Drag and drop converter
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Hello everyone. I've created another User Interface to Python converter (you can find the first one here, though I don't recommend it, it's ugly), this one's more simple and comfortable. Literally all you have to do is drag the *.ui file and drop it in the square, the *.py file will be generated in the directory that you choose (Desktop by default). I've attached the icon, even thought it's not necessary, and also, the program will create a "settings.txt" file, which contains the path where the generated file should be saved.

Here's the code:
from PyQt5 import QtCore, QtGui, QtWidgets
from pathlib import Path
import os

savePath = ""
settingsFilePath = Path("settings.txt")

if not settingsFilePath.is_file():
    f = open("settings.txt", "w")
    savePath = os.environ["HOMEPATH"] + "\\Desktop\\"
    f.write(savePath)
    f.close()
else:
    f = open("settings.txt", "r")
    savePath = f.readline()
    f.close()

def convertToPy(target):
    os.system('pyuic5 -o "' + savePath + '/convertedfile.py" "' + target + '"')

class Label(QtWidgets.QLabel):
    def __init__(self):
        super(Label, self).__init__()

        self.setAcceptDrops(True)

    def dragEnterEvent(self, e):
        if e.mimeData().hasFormat("text/uri-list"):
            e.accept()
        else:
            e.ignore()

    def dropEvent(self, e):
        convertToPy(e.mimeData().text()[8:])

class MainWindow(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()

        self.windowTitle = "Converter: User Interface to Python"
        self.windowSize = (438, 348)

        self.setupUi(self)

    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.setWindowTitle(self.windowTitle)
        Form.resize(self.windowSize[0], self.windowSize[1])
        self.verticalLayout_2 = QtWidgets.QVBoxLayout(Form)
        self.verticalLayout_2.setObjectName("verticalLayout_2")
        self.verticalLayout = QtWidgets.QVBoxLayout()
        self.verticalLayout.setObjectName("verticalLayout")
        self.frame = QtWidgets.QFrame(Form)
        self.frame.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame.setObjectName("frame")
        self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.frame)
        self.horizontalLayout_2.setObjectName("horizontalLayout_2")
        self.horizontalLayout = QtWidgets.QHBoxLayout()
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.labelIcon = QtWidgets.QLabel(self.frame)
        self.labelIcon.setMaximumSize(QtCore.QSize(50, 50))
        self.labelIcon.setText("")
        self.labelIcon.setPixmap(QtGui.QPixmap("info.png"))
        self.labelIcon.setScaledContents(True)
        self.labelIcon.setObjectName("labelIcon")
        self.horizontalLayout.addWidget(self.labelIcon)
        self.labelInfo = QtWidgets.QLabel(self.frame)
        self.labelInfo.setWordWrap(True)
        self.labelInfo.setObjectName("labelInfo")
        self.labelInfo.setText("Before converting, please make sure that you have PyQt5 installed. To install PyQt5, you can visit <a href='https://sourceforge.net/projects/pyqt/'>this link</a> to download it, or run the following command in <b>cmd</b>: <font face='Consolas'>pip3 install PyQt5</font>")
        self.labelInfo.setOpenExternalLinks(True)
        self.horizontalLayout.addWidget(self.labelInfo)
        self.horizontalLayout_2.addLayout(self.horizontalLayout)
        self.verticalLayout.addWidget(self.frame)
        self.frame_2 = QtWidgets.QFrame(Form)
        self.frame_2.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_2.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_2.setObjectName("frame_2")
        self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.frame_2)
        self.horizontalLayout_3.setObjectName("horizontalLayout_3")
        self.verticalLayout_5 = QtWidgets.QVBoxLayout()
        self.verticalLayout_5.setObjectName("verticalLayout_5")
        #self.labelTarget = QtWidgets.QLabel(self.frame_2) -> removed, as I'm going to use a custom Label
        self.labelTarget = Label()
        font = QtGui.QFont()
        font.setFamily("Myanmar Text")
        self.labelTarget.setFont(font)
        self.labelTarget.setAlignment(QtCore.Qt.AlignCenter)
        self.labelTarget.setObjectName("labelTarget")
        self.labelTarget.setText("Drag and drop the <b>user interface</b> (<b>*.ui</b>) file here")
        self.labelTarget.setStyleSheet("QLabel { border: 1px dotted black; }")
        self.labelTarget.setMinimumHeight(150)
        self.labelTarget.setAcceptDrops(True)
        self.verticalLayout_5.addWidget(self.labelTarget)
        self.horizontalLayout_3.addLayout(self.verticalLayout_5)
        self.verticalLayout.addWidget(self.frame_2)
        self.frame_3 = QtWidgets.QFrame(Form)
        self.frame_3.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_3.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_3.setObjectName("frame_3")
        self.verticalLayout_4 = QtWidgets.QVBoxLayout(self.frame_3)
        self.verticalLayout_4.setObjectName("verticalLayout_4")
        self.verticalLayout_3 = QtWidgets.QVBoxLayout()
        self.verticalLayout_3.setObjectName("verticalLayout_3")
        self.labelQuestion = QtWidgets.QLabel(self.frame_3)
        self.labelQuestion.setObjectName("labelQuestion")
        self.labelQuestion.setText("Where should the <b>python</b> file be saved at?")
        self.verticalLayout_3.addWidget(self.labelQuestion)
        self.frame_4 = QtWidgets.QFrame(self.frame_3)
        self.frame_4.setFrameShape(QtWidgets.QFrame.StyledPanel)
        self.frame_4.setFrameShadow(QtWidgets.QFrame.Raised)
        self.frame_4.setObjectName("frame_4")
        self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.frame_4)
        self.horizontalLayout_5.setObjectName("horizontalLayout_5")
        self.inputDirectory = QtWidgets.QLineEdit(self.frame_4)
        self.inputDirectory.setObjectName("inputDirectory")
        self.inputDirectory.setText(savePath)
        self.inputDirectory.setStyleSheet("QLineEdit { padding-bottom: 2px; padding-left: 2px; }")
        self.horizontalLayout_5.addWidget(self.inputDirectory)
        self.buttonBrowse = QtWidgets.QPushButton(self.frame_4)
        self.buttonBrowse.setObjectName("buttonBrowse")
        self.buttonBrowse.setText("Browse")
        self.horizontalLayout_5.addWidget(self.buttonBrowse)
        self.horizontalLayout_4 = QtWidgets.QHBoxLayout()
        self.horizontalLayout_4.setObjectName("horizontalLayout_4")
        self.horizontalLayout_5.addLayout(self.horizontalLayout_4)
        self.verticalLayout_3.addWidget(self.frame_4)
        self.verticalLayout_4.addLayout(self.verticalLayout_3)
        self.verticalLayout.addWidget(self.frame_3)
        self.verticalLayout_2.addLayout(self.verticalLayout)

        QtCore.QMetaObject.connectSlotsByName(Form)

        self.buttonBrowse.clicked.connect(self.browsePath)

    def browsePath(self):
        savePath = str(QtWidgets.QFileDialog.getExistingDirectory(self, "Select directory"))
        self.inputDirectory.setText(savePath)
        with open(settingsFilePath, "w") as f:
            f.write(savePath)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    hGUI = QtWidgets.QWidget()
    ui = MainWindow()
    ui.setupUi(hGUI)
    hGUI.show()
    sys.exit(app.exec_())
As always, I want to hear your opinion, did I do a good job? Please do comment on my code.

Thanks and enjoy!  Smile

Edit:

For some reason, the code is not indented, here's a gist.