Ordner inhalt mit checkbosen anzeigen klappt nicht

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Seevan
User
Beiträge: 3
Registriert: Dienstag 30. Januar 2024, 03:51

Hallo, erst einmal ich bin blutiger Anfänger!

Leider komme ich nicht mehr weiter und könnte Hilfe gebrauchen, ich bin dabei ein kleines Tool zu erstellen.
Ich müsste einen ausgewählten Ordnerinhalt anzeigen lassen, um dann die ausgewählte Datei zu verwenden.
Deswegen wollte ich die Datei liste mit checkboxen versehen, aber es klappt einfach nicht.

Entweder werden die checkboxen angezeigt, aber die Dateinamen nicht oder halt andersrum und ich habe echt schon viel getestet.

*Schaut furchtbar aus, ich weiß, aber bin halt am Experimentieren ;-)*


main.py

Code: Alles auswählen

import os
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QLabel, QPushButton, QFileDialog, \
    QListWidget, QListWidgetItem, QTabWidget, QGridLayout, QHBoxLayout, QLineEdit, QSpacerItem, QWidget, \
    QSizePolicy
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import Qt, QTimer, QSize, QPoint
from styles import get_stylesheet
from custom_menu_bar import CustomMenuBar
from process_status_widget import ProcessStatusWidget

import ctypes


class MeinFenster(QMainWindow):
    def __init__(self):
        super().__init__()
        self.init_stylesheet()
        self.setWindowTitle('Mein erstes Qt5-Fenster')
        self.setGeometry(100, 100, 800, 600)

        custom_menubar = CustomMenuBar(self)
        self.setCentralWidget(custom_menubar)

        tab_widget = QTabWidget()
        corner_widget = self.create_corner_widget()

        tab_widget.setCornerWidget(corner_widget, Qt.TopRightCorner)

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.update_progress)
        self.timer.start(1000)

        self.process_running = False

        self.moving = False

        tab1 = self.create_tab_1()
        tab_widget.addTab(tab1, 'Tab 1')
        tab_widget.addTab(QWidget(), 'Tab 2')  # Platzhalter für Tab 2
        tab_widget.addTab(QWidget(), 'Tab 3')  # Platzhalter für Tab 3

        self.setCentralWidget(tab_widget)

        if sys.platform.startswith('win'):
            self.setup_windows_frame()

    def create_corner_widget(self):
        corner_widget = QWidget()
        corner_layout = QHBoxLayout(corner_widget)

        beenden_button = QPushButton('', self)
        beenden_button.clicked.connect(self.close)
        beenden_button.setIcon(QIcon('exit_button.png'))
        beenden_button.setStyleSheet("background: transparent; bold; border: 0px solid black; padding: 5px;")
        beenden_button.setIconSize(QSize(24, 24))

        corner_layout.addWidget(beenden_button)
        corner_widget.setStyleSheet("background: transparent;")
        corner_layout.setContentsMargins(0, 0, 0, 0)
        return corner_widget

    def create_tab_1(self):
        tab1 = QWidget()
        layout1 = QVBoxLayout(tab1)

        label = QLabel('Inhalt für Tab 1')
        layout1.addWidget(label)

        cd_layout = self.create_cd_layout()
        layout1.addLayout(cd_layout)

        self.list_widget = QListWidget(tab1)
        layout1.addWidget(self.list_widget)

        output_layout = self.create_output_layout()
        layout1.addLayout(output_layout)

        self.process_status = ProcessStatusWidget()
        layout1.addWidget(self.process_status)

        buttons_layout = self.create_buttons_layout()
        layout1.addLayout(buttons_layout)

        return tab1

    def create_cd_layout(self):
        cd_layout = QGridLayout()
        spacer = QSpacerItem(10, 10, QSizePolicy.Expanding, QSizePolicy.Minimum)
        cd_layout.addItem(spacer, 0, 0)
        cd_label = QLabel('CD Image Verzeichnis')
        cd_layout.addWidget(cd_label, 0, 1)

        self.cd_path_label = QLineEdit('')
        self.cd_path_label.setFixedWidth(500)
        cd_layout.addWidget(self.cd_path_label, 0, 2)

        cd_select_button = QPushButton('Durchsuchen')
        cd_layout.addWidget(cd_select_button, 0, 3)
        cd_select_button.clicked.connect(self.select_folder)
        spacer = QSpacerItem(35, 30, QSizePolicy.Expanding, QSizePolicy.Minimum)
        cd_layout.addItem(spacer, 0, 4)

        return cd_layout

    def create_output_layout(self):
        output_layout = QGridLayout()
        spacer = QSpacerItem(10, 10, QSizePolicy.Expanding, QSizePolicy.Minimum)
        output_layout.addItem(spacer, 0, 0)
        output_label = QLabel('Ausgabe Verzeichnis')
        output_layout.addWidget(output_label, 0, 1)

        self.output_path_label = QLineEdit('')
        self.output_path_label.setFixedWidth(500)
        output_layout.addWidget(self.output_path_label, 0, 2)

        output_select_button = QPushButton('Durchsuchen')
        output_layout.addWidget(output_select_button, 0, 3)
        output_select_button.clicked.connect(self.select_output_folder)

        spacer = QSpacerItem(33, 30, QSizePolicy.Expanding, QSizePolicy.Minimum)
        output_layout.addItem(spacer, 0, 4)

        return output_layout


    def create_buttons_layout(self):
        buttons_layout = QHBoxLayout()

        buttons_layout.addStretch(1)
        start_button = QPushButton('Starten', self)
        start_button.clicked.connect(self.start_process)
        start_button.setFixedWidth(100)
        buttons_layout.addWidget(start_button)

        buttons_layout.addSpacing(10)

        cancel_button = QPushButton('Abbrechen', self)
        cancel_button.clicked.connect(self.cancel_process)
        cancel_button.setFixedWidth(100)
        buttons_layout.addWidget(cancel_button)

        spacer = QWidget()
        spacer.setFixedWidth(10)
        buttons_layout.addWidget(spacer)

        spacer_bottom = QWidget()
        spacer_bottom.setFixedHeight(40)
        buttons_layout.addWidget(spacer_bottom)

        start_button.setStyleSheet("QPushButton { border: 2px solid green; }")
        cancel_button.setStyleSheet("QPushButton { border: 2px solid green; }")

        return buttons_layout

    def setup_windows_frame(self):
        hwnd = ctypes.windll.kernel32.GetConsoleWindow()
        ctypes.windll.user32.ShowWindow(hwnd, 0)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.setGeometry(100, 100, 800, 600)

    def mousePressEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        if event.buttons() == Qt.LeftButton:
            delta = QPoint(event.globalPos() - self.oldPos)
            self.move(self.x() + delta.x(), self.y() + delta.y())
            self.oldPos = event.globalPos()

    def mouseReleaseEvent(self, event):
        pass

    def init_stylesheet(self):
        stylesheet = get_stylesheet()
        self.setStyleSheet(stylesheet)

    def update_progress(self):
        if self.process_running:
            self.process_status.update_status()

    def mouseReleaseEvent(self, event):
        if event.button() == Qt.LeftButton:
            self.moving = False

    def select_folder(self):
        folder = QFileDialog.getExistingDirectory(self, 'Ordner auswählen')
        self.list_widget.clear()
        for file_name in os.listdir(folder):
            item = QListWidgetItem(file_name)
            self.list_widget.addItem(item)
        self.cd_path_label.setText(folder)

    def select_output_folder(self):
        folder = QFileDialog.getExistingDirectory(self, 'Ausgabeordner auswählen')
        self.output_path_label.setText(folder)

    def start_process(self):
        self.process_status.update_status()
        self.process_running = True

    def cancel_process(self):
        self.process_status.set_process_complete()
        self.process_running = False


if __name__ == '__main__':
    app = QApplication(sys.argv)
    fenster = MeinFenster()
    fenster.show()
    sys.exit(app.exec_())


tab1.py

Code: Alles auswählen

import os
from PyQt5.QtWidgets import QVBoxLayout, QLabel, QPushButton, QFileDialog, \
    QListWidget, QListWidgetItem, QWidget, QGridLayout, QLineEdit, QCheckBox, QSpacerItem, QSizePolicy

class Tab1(QWidget):
    def __init__(self):
        super().__init__()

        layout = QVBoxLayout(self)

        label = QLabel('Inhalt für Tab 1')
        layout.addWidget(label)

        cd_layout = self.create_cd_layout()
        layout.addLayout(cd_layout)

        self.list_widget = QListWidget(self)
        layout.addWidget(self.list_widget)

        # Hinzugefügt: Checkboxen für Dateien
        self.file_checkbox_dict = {}
        for file_name in os.listdir('.'):
            checkbox = QCheckBox(file_name)
            item = QListWidgetItem()
            self.list_widget.addItem(item)
            self.list_widget.setItemWidget(item, checkbox)
            self.file_checkbox_dict[file_name] = checkbox

        output_layout = self.create_output_layout()
        layout.addLayout(output_layout)

    def create_cd_layout(self):
        cd_layout = QGridLayout()
        spacer = QSpacerItem(10, 10, QSizePolicy.Expanding, QSizePolicy.Minimum)
        cd_layout.addItem(spacer, 0, 0)
        cd_label = QLabel('CD Image Verzeichnis')
        cd_layout.addWidget(cd_label, 0, 1)

        self.cd_path_label = QLineEdit('')
        self.cd_path_label.setFixedWidth(500)
        cd_layout.addWidget(self.cd_path_label, 0, 2)

        cd_select_button = QPushButton('Durchsuchen')
        cd_layout.addWidget(cd_select_button, 0, 3)

        # Hier verbinde das Signal mit der Methode
        cd_select_button.clicked.connect(self.select_folder)

        spacer = QSpacerItem(35, 30, QSizePolicy.Expanding, QSizePolicy.Minimum)
        cd_layout.addItem(spacer, 0, 4)

        return cd_layout

    def create_output_layout(self):
        output_layout = QGridLayout()
        spacer = QSpacerItem(10, 10, QSizePolicy.Expanding, QSizePolicy.Minimum)
        output_layout.addItem(spacer, 0, 0)
        output_label = QLabel('Ausgabe Verzeichnis')
        output_layout.addWidget(output_label, 0, 1)

        self.output_path_label = QLineEdit('')
        self.output_path_label.setFixedWidth(500)
        output_layout.addWidget(self.output_path_label, 0, 2)

        output_select_button = QPushButton('Durchsuchen')
        output_layout.addWidget(output_select_button, 0, 3)

        # Hier verbinde das Signal mit der Methode
        output_select_button.clicked.connect(self.select_output_folder)

        spacer = QSpacerItem(33, 30, QSizePolicy.Expanding, QSizePolicy.Minimum)
        output_layout.addItem(spacer, 0, 4)

        return output_layout

    def select_folder(self):
        folder = QFileDialog.getExistingDirectory(self, 'Ordner auswählen')
        self.list_widget.clear()
        for file_name in os.listdir(folder):
            item = QListWidgetItem(file_name)
            self.list_widget.addItem(item)
        self.cd_path_label.setText(folder)

    def select_output_folder(self):
        folder = QFileDialog.getExistingDirectory(self, 'Ausgabeordner auswählen')
        self.output_path_label.setText(folder)


styles.py

Code: Alles auswählen

def get_stylesheet():
    return """
        QMainWindow {
            background-color: rgba(0, 0, 0, 150);
            color: #00FF00;
            border: 2px solid #00FF00;
        }

        QTabBar::tab {
            color: #177d12;
            border-top: 1px solid #177d12;
            border-left: 1px solid #177d12;
            border-right: 1px solid #177d12;
            border-bottom: 1px solid #177d12;
            border-radius: 3px 3px 0px 0px;
            padding: 5px;
        }

        QTabBar::tab:selected {
            color: #00FF00;
            border-top: 1px solid #00FF00;
            border-left: 1px solid #00FF00;
            border-right: 1px solid #00FF00;
            border-bottom: 1px solid #000000;
            border-radius: 3px 3px 0px 0px;
            padding: 5px;
        }

        QTabWidget::pane {
            border: 1px solid #00FF00;
            border-top: 1px solid #00FF00;
            border-left: 1px solid #00FF00;
            border-right: 1px solid #00FF00;
            border-bottom: 1px solid #00FF00;
        }

        QWidget {
            background-color: #000000;
            color: #00FF00;
        }

        QLineEdit {
            background-color: #000000;
            color: #00FF00;
            border: 1px solid #00FF00;
        }

        QPushButton {
            background-color: #000000;
            color: #00FF00;
            border: 1px solid #00FF00;
            padding: 2px;
            width: 100px;  /* Breite des Buttons */
            height: 11px;  /* Höhe des Buttons */
        }

        QListWidget {
            background-color: #000000;
            color: #00FF00;
            border: 1px solid #00FF00;
        }

        QLabel {
            background-color: #000000;
            color: #00FF00;
        }
        QProgressBar {
            border: 2px solid #00FF00;
            border-radius: px;
            text-align: center;
            background-color: transparent;
        }
        QProgressBar::chunk {
            background-color: #0a500d;
            border-radius: 5px;
        }
        
        }
    """
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Versuch mal das Problem aufzuteilen und kleinere Bestandteile davon einzeln zu lösen.

Kannst du Ordnerinhalte herausfinden und einfach in der Konsole ausgeben?
Kannst du Checkboxen anzeigen? Mit beliebigem Text daneben?

Wenn die einzelnen Bestandteile funktionieren, dann setze sie stückweise zusammen.
Auch hier bitte ein möglichst kurzes Beispiel, das genau den Fehler zeigt, und nicht mehr.
Beispielsweise die ganzen Stylesheets sind vermutlich völlig unerheblich für das Problem.
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Seevan
User
Beiträge: 3
Registriert: Dienstag 30. Januar 2024, 03:51

Das ist ja genau dass problem...
als erstes hatte ich versucht die checkboxen im main.py unter zubekommen und das wie folgt:

Code: Alles auswählen

 
     def select_folder(self):
        folder = QFileDialog.getExistingDirectory(self, 'Ordner auswählen')
        self.list_widget.clear()
        for file_name in os.listdir(folder):
            item = QListWidgetItem(file_name)
            checkbox = QCheckBox()
            checkbox.setChecked(True) 
            item.setSizeHint(QSize(50, 20))
            self.list_widget.addItem(item)
            self.list_widget.setItemWidget(item, checkbox)

        self.cd_path_label.setText(folder)
 
Das zeigt mir die Boxen, aber keine Dateinamen mehr.
Bild

Ich erstellte dann mal eine test.py, in der ich die Funktion getestet habe und da geht es.
Deswegen habe ich so viel vom code gepostet. Ich verstehe es leider rein gar nicht, warum es die Dateinamen nicht mehr anzeigt.

Die test.py

Code: Alles auswählen

import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QLabel, QPushButton, QFileDialog, QCheckBox, QWidget

class CHDConverterApp(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("CHD Converter")
        self.setGeometry(100, 100, 800, 600)

        # Widgets erstellen
        self.central_widget = QWidget()
        self.setCentralWidget(self.central_widget)
        
        self.layout = QVBoxLayout(self.central_widget)

        self.label = QLabel("Wähle die Dateien aus, die konvertiert werden sollen:")
        self.layout.addWidget(self.label)

        # Button für die Dateiauswahl
        self.select_files_button = QPushButton("Dateien auswählen")
        self.select_files_button.clicked.connect(self.select_files)
        self.layout.addWidget(self.select_files_button)

        # Hier wird die Checkbox-Liste eingefügt
        self.checkbox_layout = QVBoxLayout()
        self.layout.addLayout(self.checkbox_layout)

    def select_files(self):
        # Ordnerpfad auswählen
        path = str(QFileDialog.getExistingDirectory(self, "Ordner auswählen"))

        # Dateien im Ordner
        files = os.listdir(path)

        # Checkboxen für jede Datei erstellen und zur Liste hinzufügen
        for file in files:
            checkbox = QCheckBox(file)
            self.checkbox_layout.addWidget(checkbox)

if __name__ == '__main__':
    app = QApplication([])
    ex = CHDConverterApp()
    ex.show()
    app.exec_()
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Mal versucht dein Styling zu entfernen? Das ist ja recht radikal.
Seevan
User
Beiträge: 3
Registriert: Dienstag 30. Januar 2024, 03:51

Ja habe ich, oder besser gesagt ich hab von vorn angefangen und versuche erst mal die Funktionen, die ich brauche hinzubekommen, bevor ich alle zusammen schuster ;-)

Doch da knobel ich auch schon wieder an einem Problem ........... bin auch schon ein Stück weiter gekommen als zuvor.
Antworten