Python Forum
[PyQt] main GUI is not shown
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
[PyQt] main GUI is not shown
#1
Dear community,

the main GUI of my application is not shown - I don't know why...
I'm using PyCharm, but the debugger doesn't start. (In the past I was able to set breakpoints and check for errors...)

It would be great, if you could tell me, why the main GUI doesn't appear...

Thank you so much...

main.py
from main_window import MainWindow
from PyQt6.QtWidgets import QApplication
from pathlib import Path
import sys


def main():
    app = QApplication(sys.argv)
    app.setStyleSheet(Path("stylesheet.qss").read_text())
    win = MainWindow()
    win.load_paths()
    win.show()
    app.exec()

if __name__ == '__main__':
    main()
main_window.py:
import subprocess
from adjustments_window import AdjustmentsWindow
from merge_convert_window import MergeConvertWindow
from PyQt6.QtGui import QFont
from PyQt6.QtWidgets import (
    QLabel,
    QMainWindow,
    QPushButton,
    QHBoxLayout,
    QVBoxLayout,
    QWidget,
    QGroupBox,
    QListWidget,
    QListWidgetItem,
    QCheckBox,
    QInputDialog,
    QMessageBox,
    )

class MainWindow(QMainWindow):
    def __init__(self, parent=None):
        # No additional window yet
        self.u = None
        super(MainWindow, self).__init__(parent)
        # specific color for background
        #self.setStyleSheet("background-color: #37b600;")
        self.setWindowTitle("simplex feeder tool")
        self.resize(400, 500)
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        # center MainWindow to screen
        qr = self.frameGeometry()
        cp = self.screen().availableGeometry().center()
        qr.moveCenter(cp)
        self.move(qr.topLeft())
        # --------------------- groupbox_have ---------------------
        self.groupbox_have = QGroupBox("what do you have?")
        self.groupbox_have.setFont(QFont('Times', 12))
        self.groupbox_have.font().setBold(True)
        self.groupbox_have_layout = QVBoxLayout()
        self.listbox_medium = QListWidget()
        self.listbox_medium.setFont(QFont('Times', 12))
        self.listbox_medium.setFixedHeight(28)
        self.listbox_medium2 = QListWidget()
        self.listbox_medium2.setFont(QFont('Times', 12))
        self.listbox_medium2.setFixedHeight(28)
        self.checkbox = QCheckBox("paper stack contains patchTpages")
        self.checkbox.setFont(QFont('Times', 12))
        self.groupbox_profile = QGroupBox("for paper: which profile should be used?")
        self.groupbox_profile.setFont(QFont('Times', 12))
        self.groupbox_profile.font().setBold(True)
        self.listbox_profile = QListWidget()
        self.listbox_profile.setFont(QFont('Times', 12))
        self.listbox_profile.setFixedHeight(28)
        self.button_add_profile = QPushButton("add profile")
        self.button_add_profile.setFont(QFont('Times', 12))
        self.button_clear_profile = QPushButton("clear profile")
        self.button_clear_profile.setFont(QFont('Times', 12))
        self.groupbox_profile_intern_layout = QHBoxLayout()
        for x in [self.button_add_profile, self.button_clear_profile]:
            self.groupbox_profile_intern_layout.addWidget(x)
        self.groupbox_profile_layout = QVBoxLayout()
        self.groupbox_profile_layout.addWidget(self.listbox_profile)
        self.groupbox_profile_layout.addLayout(self.groupbox_profile_intern_layout)
        self.groupbox_profile.setLayout(self.groupbox_profile_layout)
        for h in [self.listbox_medium, self.listbox_medium2, self.checkbox, self.groupbox_profile]:
            self.groupbox_have_layout.addWidget(h)
        self.groupbox_have.setLayout(self.groupbox_have_layout)
        # --------------------- groupbox_receive ---------------------
        self.groupbox_receive = QGroupBox("what would you like to receive?")
        self.groupbox_receive.setFont(QFont('Times', 12))
        self.groupbox_receive.font().setBold(True)
        self.groupbox_receive_layout = QVBoxLayout()
        self.listbox_target = QListWidget()
        self.listbox_target.setFont(QFont('Times', 12))
        self.listbox_target.setFixedHeight(28)
        self.listbox_extension = QListWidget()
        self.listbox_extension.setFont(QFont('Times', 12))
        self.listbox_extension.setFixedHeight(28)
        self.groupbox_move = QGroupBox("move scan(s) to")
        self.groupbox_move.setFont(QFont('Times', 12))
        self.groupbox_move.font().setBold(True)
        self.checkbox_move_to = QCheckBox("onedrive")
        self.checkbox_move_to.setFont(QFont('Times', 12))
        self.groupbox_move_layout = QVBoxLayout()
        self.groupbox_move_layout.addWidget(self.checkbox_move_to)
        self.groupbox_move.setLayout(self.groupbox_move_layout)
        self.groupbox_receive_layout = QVBoxLayout()
        for y in [self.listbox_extension, self.listbox_target, self.groupbox_move]:
            self.groupbox_receive_layout.addWidget(y)
        self.groupbox_receive.setLayout(self.groupbox_receive_layout)
        # --------------------------------------------------------------
        self.button_apply_selection = QPushButton("apply selection")
        self.button_apply_selection.setFont(QFont('Times', 12))
        self.button_adjustments = QPushButton("adjustments")
        self.button_adjustments.setFont(QFont('Times', 12))
        self.label = QLabel("abc")
        self.label.setFont(QFont('Times', 12))
        self.layout_base = QVBoxLayout()
        for c in [self.label, self.groupbox_have, self.groupbox_receive, self.button_apply_selection, self.button_adjustments]:
            self.layout_base.addWidget(c)
        self.central_widget.setLayout(self.layout_base)
        # clear listboxes
        self.listbox_medium.clear()
        self.listbox_medium2.clear()
        self.listbox_extension.clear()
        self.listbox_target.clear()
        self.listbox_profile.clear()
        # fill some listboxes
        self.listbox_medium.insertItem(0, "paper")
        self.listbox_medium.item(0).setForeground(QColor("blue"))
        self.listbox_medium.insertItem(1, "file(s)")
        self.listbox_medium.item(1).setForeground(QColor("green"))
        self.listbox_medium2.insertItem(0, "printed onesided")
        self.listbox_medium2.item(0).setForeground(QColor("blue"))
        self.listbox_medium2.insertItem(1, "printed bothsided")
        self.listbox_medium2.item(1).setForeground(QColor("blue"))
        self.listbox_medium2.insertItem(2, "file(s)")
        self.listbox_medium2.item(2).setForeground(QColor("green"))
        self.listbox_target.insertItem(0, "1 file/page")
        self.listbox_target.item(0).setForeground(QColor("blue"))
        self.listbox_target.insertItem(1, "merge pages")
        self.listbox_target.item(1).setForeground(QColor("blue"))
        self.listbox_target.insertItem(2, "merge/convert")
        self.listbox_target.item(2).setForeground(QColor("green"))
        self.listbox_target.insertItem(3, "export specific page(s)")
        self.listbox_target.item(3).setForeground(QColor("green"))
        self.listbox_target.insertItem(4, "export page range(s)")
        self.listbox_target.item(4).setForeground(QColor("green"))
        self.listbox_target.insertItem(5, "export all pages individually")
        self.listbox_target.item(5).setForeground(QColor("green"))
        # no color
        self.listbox_extension.insertItem(0, "pdf")
        self.listbox_extension.insertItem(1, "bmp")
        self.listbox_extension.insertItem(2, "jpg")
        self.listbox_extension.insertItem(3, "jpeg")
        self.listbox_extension.insertItem(4, "png")
        self.listbox_extension.insertItem(5, "tif")
        self.listbox_extension.insertItem(6, "tiff")
        self.button_add_profile.clicked.connect(self.button_add_profile_clicked)
        self.button_clear_profile.clicked.connect(self.button_clear_profile_clicked)
        self.button_apply_selection.clicked.connect(self.button_apply_selection_clicked)
        self.button_adjustments.clicked.connect(self.button_adjustments_clicked)

    def load_paths(self):
        with open(Path("path_created_files.txt"), "r") as f1:
            self.path_created_files = f1.read()
        if self.path_created_files == "":
            QMessageBox.about(self, "Go to adjustments", "Please adjust created files path")
        with open(Path("path_files_to_convert.txt"), "r") as f2:
            self.path_files_to_convert = f2.read()
        if self.path_files_to_convert == "":
            QMessageBox.about(self, "Go to adjustments", "Please adjust files to convert path")
        # load profiles
        with open(Path("profiles.txt"), "r") as f3:
            lines = f3.readlines()
        if lines == "":
            QMessageBox.about(self, "Hint", "Please enter profiles")
        else:
            for line in lines:
                self.listbox_profile.insertItem(0, line)

    def button_add_profile_clicked(self):
        profile_name, ok = QInputDialog.getText(self, 'Add Profile', 'Please enter a profile name:')
        if ok:
            with open(Path("profiles.txt"), "a") as f:
                f.write(f"{profile_name}\n")
            # add to listbox
            self.listbox_profile.addItem(QListWidgetItem(profile_name))

    def button_clear_profile_clicked(self):
        amount_of_selected_items = len(self.listbox_profile.selectedItems())
        if amount_of_selected_items > 0:
            # clear selected item in list_widget
            current_row = self.listbox_profile.currentRow()
            profile_name = self.listbox_profile.currentItem().text()
            if current_row >= 0:
                current_item = self.listbox_profile.takeItem(current_row)
                del current_item
            # clear row which holds selected profile
            content = profile_name
            with open("profiles.txt", "r") as f3:
                lines = f3.readlines()
            new_lines = []
            for line in lines:
                if content not in line.strip():
                    new_lines.append(line)
            f3.close()
            with open("profiles.txt", "w") as f3:
                f3.writelines(new_lines)
            f3.close()
        else:
            QMessageBox.about(self, "Hint", "No profile was selected.")

    def button_adjustments_clicked(self):
        self.u = AdjustmentsWindow()
        self.u.show()

    def count_files(self, path):
        amount_of_files = 0
        for entry in os.scandir(path):
            if entry.is_file():
                amount_of_files += 1
        return amount_of_files

    def create_file_str(self, path):
        filestr = ""
        i = 0
        amount_files = self.count_files(path)
        if amount_files == 0:
            QMessageBox.about(self, "Hint", "No files in Folder.")
            quit
        else:
            for entry in os.scandir(path):
                if i < amount_files:
                    filestr = filestr + path + "/" + entry.name + ";"
                else:
                    filestr = filestr + path + "/" + entry.name
                i += 1
        return filestr

    def merge_pdfs(self, path):
        filestr = self.create_file_str(path)
        subprocess.run(['C:/Program Files/NAPS2/naps2.console.exe', '-i', filestr, '-n', '0', '--output', self.path_created_files + '/' + 'merged.pdf'], shell=False)

    def split_pdf(self, fileName):
        subprocess.run(['C:/Program Files/NAPS2/naps2.console.exe', '-i', self.path_files_to_convert + '/' + fileName, '-n', '0', '--split', '--output', self.path_created_files + '/' + '$(n).pdf'], shell=False)

    def readin_fileName(self, path):
        amount_pdfs = 0
        for fileName in os.listdir(path):
            d = os.path.join(path, fileName)
            if os.path.isdir(d):
                QMessageBox.about(self, "Hint", "Please place no directories in 'files to convert-folder'!")
                quit()
            if not fileName.endswith(".pdf"):
                QMessageBox.about(self, "Hint", "Please place 1 pdf in 'files to convert-folder'!")
                quit()
            if fileName.endswith(".pdf"):
                amount_pdfs += 1
            if amount_pdfs > 1:
                QMessageBox.about(self, "Hint", "Please place just 1 pdf in 'files to convert-folder'!")
                quit()
        return fileName

    def export_specific_pages(self, fileName, a):
        subprocess.run(['C:/Program Files/NAPS2/naps2.console.exe', '-i', self.path_files_to_convert + '/' + fileName + '[' + str(a) + ']', '-n', '0', '--output', self.path_created_files + '/' + str(a + 1) + '.pdf'], shell=False)

    def add_zero(self, path):
        listextension = []
        list = []
        listlen = []
        for entry in os.scandir(path):
            splitup = os.path.splitext(entry.name)
            extension = splitup[1]
            listextension.append(extension)
        # compare if all extensions are equal
        first_element = listextension[0]
        # Compares all elements with the first element
        for k in listextension:
            if first_element != k:
                QMessageBox.about(self, "Hint", "different extensions")
                quit()
        QMessageBox.about(self, "Hint", "equal extensions")
        for entry in os.scandir(path):
            if entry.is_file():
                g = entry.name.split(".")
                if g[0].isnumeric:
                    list.append(g[0])
        for i in list:
            listlen.append(len(i))
        max_length = max(listlen)
        for entry in os.scandir(path):
            g = entry.name.split(".")
            h = g[0]
            if len(h) != max_length:
                while True:
                    h = "0" + h
                    if len(h) == max_length:
                        break
                os.rename(path + "/" + entry.name, path + "/" + h + extension)
        os.scandir(path).close()

    def finput(self, text, fileName):
        c = text.split("-")
        for i in range(int(c[0])-1, int(c[1])):
            self.export_specific_pages(fileName, i)
        self.add_zero(self.path_created_files)
        self.merge_pdf(self.path_created_files)
        os.rename(self.path_created_files + "/merged.pdf", self.path_created_files + "/page_range(" + str(c[0]) + "-" + str(c[1]) + ").pdf")
        for entry in os.scandir(self.path_created_files):
            if "page_range" not in entry.name:
                os.remove(self.path_created_files + "/" + entry.name)

    def button_apply_selection_clicked(self):
        if not self.listbox_medium.selectedItems() or not self.listbox_medium2.selectedItems() or not self.listbox_target.selectedItems():
            QMessageBox.about(self, "Hint", "Not all ListWidgets were clicked.")
        if self.listbox_medium.currentItem().foreground().color() == self.listbox_medium2.currentItem().foreground().color() == self.listbox_target.currentItem().foreground().color():
        #------------------------files---------------------------------------------------------------------------------------------------------------
            if self.listbox_medium.currentItem().text() == "file(s)" and self.listbox_medium2.currentItem().text() == "file(s)":
                # export specific pages
                if self.listbox_target.currentItem().text() == "export specific page(s)":
                    fileName = self.readin_fileName(self.path_files_to_convert)
                    text_input, ok = QInputDialog.getText(self, "export from pdf", "export specific page(s)")
                    if text_input != "":
                        text_input = text_input.replace(" ", "")
                    else:
                        QMessageBox.about(self, "Hint", "No entry was made.")
                        quit()
                    if (",") in text_input:
                        b = text_input.split(",")
                        amount_exported_pages = len(b)
                        for x in range(0, amount_exported_pages):
                            self.export_specific_pages(fileName, int(b[x]) - 1)
                    else:
                        b = text_input
                        self.export_specific_pages(fileName, b)

                # export page range(s)
                if self.listbox_target.currentItem().text() == "export page range(s)":
                    fileName = self.readin_fileName(self.path_files_to_convert)
                    text_input2, ok = QInputDialog.getText(self, "export from pdf", "export page range(s)")
                    if text_input2 != "" and ok:
                        text_input2 = text_input2.replace(" ", "")
                    else:
                        QMessageBox.about(self, "Hint", "No entry was made.")
                        quit()
                    if "," in text_input2:
                        # counts amount of commas in input
                        amount_commas = text_input2.count(",")
                        b = text_input2.split(",")
                        for x in range(0, amount_commas + 1):
                            self.finput(b[x], fileName)
                    else:
                        self.finput(text_input2, fileName)
                # export all pages individually
                if self.listbox_target.currentItem().text() == "export all pages individually":
                    fileName = self.readin_fileName(self.path_files_to_convert)
                    self.split_pdf(fileName)
                if self.listbox_target.currentItem().text() == "merge/convert":
                    # show merge_convert_window
                    self.u = MergeConvertWindow
                    self.u.listbox_merge_convert.clear()
                    if self.listbox_extension.currentItem().text() == "pdf":
                        self.u.listbox_merge_convert.insertItem(0, "merge pdfs")
                    else:
                        self.u.listbox_merge_convert.insertItem(0, "convert file(s)")
                    self.u.show()
                if self.listbox_target.currentItem().text() == "merge pdfs":
                    # merge pdfs
                    if self.count_files(self.path_created_files) != 0:
                        QMessageBox.about(self, "Hint", "path_created_files is Not empty.")
                        quit()
                    if self.count_files(self.path_files_to_convert) == 0:
                        QMessageBox.about(self, "Hint", "path_files_to_convert is empty.")
                        quit()
                    self.merge_pdfs(self.path_files_to_convert)
                    # convert files

        # ------------------------paper--------------------------------------------------------------------------------------------------------------
        else:
            QMessageBox.about(self, "Hint", "All selections - except the file formats and the profiles - must have the same color (blue=paper, or green=files).")
            quit
adjustments_window.py:
from PyQt6.QtGui import QFont
from PyQt6.QtWidgets import (
    QLabel,
    QPushButton,
    QVBoxLayout,
    QWidget,
    QFileDialog,
    QMessageBox,
)


class AdjustmentsWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("simplex feeder tool")
        self.resize(300, 150)
        self.label = QLabel("adjustments")
        self.label.setFont(QFont('Times', 12))
        self.path_created_files = ""
        self.path_files_to_convert = ""
        self.button_files_to_convert = QPushButton("files to convert path")
        self.button_files_to_convert.setFont(QFont('Times', 12))
        self.button_created_files = QPushButton("created files path")
        self.button_created_files.setFont(QFont('Times', 12))
        self.button_donate = QPushButton("donate")
        self.button_donate.setFont(QFont('Times', 12))
        self.layout = QVBoxLayout()
        for k in [self.label, self.button_files_to_convert, self.button_created_files, self.button_donate]:
            self.layout.addWidget(k)
        self.setLayout(self.layout)
        self.button_created_files.clicked.connect(self.button_created_files_clicked)
        self.button_files_to_convert.clicked.connect(self.button_files_to_convert_clicked)

    def button_created_files_clicked(self):
        path_created_files = str(QFileDialog().getExistingDirectory(self, 'Select path for created files'))
        with open("path_created_files.txt", "w") as f4:
            f4.write(path_created_files)
        f4.close()

    def button_files_to_convert_clicked(self):
        path_files_to_convert = str(QFileDialog().getExistingDirectory(self, 'Select path for files to convert'))
        with open("path_files_to_convert.txt", "w") as f5:
            f5.write(path_files_to_convert)
        f5.close()
merge_convert_window.py:
from PyQt6.QtGui import QFont, QColor
from PyQt6.QtWidgets import (
    QLabel,
    QPushButton,
    QHBoxLayout,
    QVBoxLayout,
    QWidget,
    QListWidget,
)

class MergeConvertWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("simplex feeder tool")
        self.resize(300, 200)
        self.label = QLabel("merge/convert")
        self.label.setFont(QFont('Times', 12))
        self.listbox_dragdrop = QListWidget()
        self.listbox_dragdrop.setFont(QFont('Times', 12))
        self.listbox_dragdrop.setFixedHeight(140)
        self.listbox_merge_convert = QListWidget()
        self.listbox_merge_convert.setFont(QFont('Times', 12))
        self.listbox_merge_convert.item(0).setForeground(QColor("green"))
        self.listbox_merge_convert.setFixedHeight(28)
        self.push_up = QPushButton("up")
        self.push_up.setFont(QFont('Times', 12))
        self.push_down = QPushButton("down")
        self.push_down.setFont(QFont('Times', 12))
        self.button = QPushButton("apply selection")
        self.button.setFont(QFont('Times', 12))
        self.layout = QVBoxLayout()
        for e in [self.push_up, self.push_down]:
            self.layout.addWidget(e)
        self.layout2 = QHBoxLayout()
        self.layout2.addWidget(self.listbox_dragdrop)
        self.layout2.addLayout(self.layout)
        self.mainlayout = QVBoxLayout()
        self.mainlayout.addWidget(self.label)
        self.mainlayout.addLayout(self.layout2)
        self.mainlayout.addWidget(self.listbox_merge_convert)
        self.mainlayout.addWidget(self.button)
        self.setLayout(self.mainlayout)
Reply
#2
missing imports in main_window.py ? QColor and Path

import subprocess
from adjustments_window import AdjustmentsWindow
from merge_convert_window import MergeConvertWindow
from PyQt6.QtGui import QFont, QColor
from pathlib import Path
....
Reply
#3
Hi Axel_Erfurt,

So far I haven't found the reason why the main GUI doesn't appear...

But thank you very much for the answer anyway!
Reply
#4
Hi,

I found the error...

Beside the error Axel_Erfurt mentioned, in PyCharm there was a wrong scriptpath adjusted...
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  “main thread is not in main loop” in Tkinter Long_r 1 24,331 Jun-26-2019, 11:00 PM
Last Post: metulburr
  which button should be shown gray 1 3,089 Mar-30-2017, 11:57 AM
Last Post: Larz60+
  GTK main window calling a main window DennisT 4 6,833 Oct-19-2016, 09:36 PM
Last Post: DennisT

Forum Jump:

User Panel Messages

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