Python Forum
[PyQt] Drag and drop converter
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt] Drag and drop converter
#1
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.
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  GUI with drag and drop functionality sayyedkamran 7 6,028 May-26-2020, 10:20 PM
Last Post: jefsummers
  Looking for Python IDE With Drag and Drop GUI Dan_PanMan 0 2,292 May-23-2020, 04:39 PM
Last Post: Dan_PanMan
  [PyQt] Drag and Move window from menubar WBPYTHON 3 4,705 Apr-03-2020, 06:15 PM
Last Post: deanhystad
  click drag olivers 1 2,896 Jan-30-2020, 01:44 AM
Last Post: Larz60+
  [PyQt] Drag items across tabs Alfalfa 5 4,685 Sep-01-2019, 11:58 PM
Last Post: Alfalfa
  [Kivy] args converter-help antonmichel 0 2,097 Feb-15-2018, 07:42 PM
Last Post: antonmichel
  Drag and Drop GUI crystallized_neuron 3 16,525 Apr-26-2017, 08:41 PM
Last Post: joe_anonimist
  Drag and drop image object vijaysagi 1 16,771 Apr-06-2017, 09:36 AM
Last Post: wuf

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020