Verzweifle an GUI

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Jan Butters
User
Beiträge: 2
Registriert: Dienstag 18. Februar 2014, 19:54

Guten Tag verehrte Python-ianer,

habe mir mit dem Qt-Designer ein Fenster erstellt:
Bild

Hier der windowUi.py Code:

Code: Alles auswählen

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.setEnabled(True)
        MainWindow.resize(507, 430)
        sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth())
        MainWindow.setSizePolicy(sizePolicy)
        MainWindow.setMaximumSize(QtCore.QSize(507, 430))
        MainWindow.setStyleSheet(_fromUtf8("font: 9pt \"MS Shell Dlg 2\";"))


#Test Button
        self.btntest = QtGui.QPushButton(MainWindow)
        self.btntest.setGeometry(QtCore.QRect(410, 20, 75, 23))
        self.btntest.setMouseTracking(True)
        self.btntest.setDefault(True)
        self.btntest.setObjectName(_fromUtf8("TEST"))

#Erstellen von "Albumtitel" - Feldbeschriftung
        self.Albumtitellabel = QtGui.QLabel(MainWindow)
        self.Albumtitellabel.setGeometry(QtCore.QRect(20, 20, 111, 16))
        self.Albumtitellabel.setStyleSheet(_fromUtf8("font: 9pt \"MS Shell Dlg 2\";"))
        self.Albumtitellabel.setObjectName(_fromUtf8("Albumtitellabel"))

#Erstellen von "Erscheinungsjahr" - Feldbeschriftung
        self.Erscheinungsjahrlabel = QtGui.QLabel(MainWindow)
        self.Erscheinungsjahrlabel.setGeometry(QtCore.QRect(20, 50, 111, 16))
        self.Erscheinungsjahrlabel.setObjectName(_fromUtf8("Erscheinungsjahrlabel"))

#Erstellen von "Traeger" - Feldbeschriftung
        self.Traegerlabel = QtGui.QLabel(MainWindow)
        self.Traegerlabel.setGeometry(QtCore.QRect(20, 110, 111, 16))
        self.Traegerlabel.setStyleSheet(_fromUtf8("font: 9pt \"MS Shell Dlg 2\";"))
        self.Traegerlabel.setObjectName(_fromUtf8("Traegerlabel"))

#Erstellen des Button "pdf-lyrics"
        self.btnpdflyrics = QtGui.QToolButton(MainWindow)
        self.btnpdflyrics.setGeometry(QtCore.QRect(360, 280, 71, 19))
        self.btnpdflyrics.setMouseTracking(True)
        self.btnpdflyrics.setAcceptDrops(True)
        self.btnpdflyrics.setObjectName(_fromUtf8("btnpdflyrics"))

#Erstellen des Button "pdf-booklet"
        self.btnpdfbooklet = QtGui.QToolButton(MainWindow)
        self.btnpdfbooklet.setGeometry(QtCore.QRect(360, 310, 71, 19))
        self.btnpdfbooklet.setMouseTracking(True)
        self.btnpdfbooklet.setAcceptDrops(True)
        self.btnpdfbooklet.setObjectName(_fromUtf8("btnpdfbooklet"))

#Erstellen des Feld für "pdf-lyrics" (listWidget_4 )
        self.listWidget_4 = QtGui.QListWidget(MainWindow)
        self.listWidget_4.setGeometry(QtCore.QRect(80, 280, 256, 21))
        self.listWidget_4.setMouseTracking(False)
        self.listWidget_4.setObjectName(_fromUtf8("listWidget_4"))

#Erstellen des Feld für "pdf-booklet" (listWidget_5)
        self.listWidget_5 = QtGui.QListWidget(MainWindow)
        self.listWidget_5.setGeometry(QtCore.QRect(80, 310, 256, 21))
        self.listWidget_5.setMouseTracking(False)
        self.listWidget_5.setObjectName(_fromUtf8("listWidget_5"))

#Erstellen des Button "save txt"
        self.btnsavetxt = QtGui.QCommandLinkButton(MainWindow)
        self.btnsavetxt.setGeometry(QtCore.QRect(20, 380, 101, 41))
        self.btnsavetxt.setMouseTracking(True)
        self.btnsavetxt.setToolTip(_fromUtf8(""))
        self.btnsavetxt.setWhatsThis(_fromUtf8(""))
        self.btnsavetxt.setAutoFillBackground(True)
        self.btnsavetxt.setObjectName(_fromUtf8("btnsavetxt"))

#Erstellen des Button "Clear All"
        self.btnclearall = QtGui.QPushButton(MainWindow)
        self.btnclearall.setGeometry(QtCore.QRect(320, 210, 75, 23))
        self.btnclearall.setMouseTracking(True)
        self.btnclearall.setDefault(True)
        self.btnclearall.setObjectName(_fromUtf8("btnClearAll"))

#Erstellen des Fortschrittbalken (Prozentangabe)
        self.progressBar = QtGui.QProgressBar(MainWindow)
        self.progressBar.setGeometry(QtCore.QRect(130, 390, 365, 20))
        self.progressBar.setStyleSheet(_fromUtf8(""))
        self.progressBar.setProperty("value", 1)
        self.progressBar.setObjectName(_fromUtf8("progressBar"))

#Erstellen der "Trennlinie oben"
        self.line = QtGui.QFrame(MainWindow)
        self.line.setGeometry(QtCore.QRect(0, 240, 511, 16))
        self.line.setMouseTracking(False)
        self.line.setFrameShape(QtGui.QFrame.HLine)
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
        self.line.setObjectName(_fromUtf8("line"))

#Erstellen der "Trennlinie unten"
        self.line =QtGui.QFrame(MainWindow)
        self.line.setGeometry(QtCore.QRect(0, 360, 511, 16))
        self.line.setMouseTracking(False)
        self.line.setFrameShape(QtGui.QFrame.HLine)
        self.line.setFrameShadow(QtGui.QFrame.Sunken)
        self.line.setObjectName(_fromUtf8("line"))

#Erstellen des Drop-Down-Menü mit den waehlbaren Möglichkeiten - für Format
        self.comboBoxFormat = QtGui.QComboBox(MainWindow)
        self.comboBoxFormat.setGeometry(QtCore.QRect(200, 80, 105, 22))
        self.comboBoxFormat.setEditable(False)
        self.comboBoxFormat.setMaxVisibleItems(6)
        self.comboBoxFormat.setMaxCount(6)
        self.comboBoxFormat.setMinimumContentsLength(1)
        self.comboBoxFormat.setObjectName(_fromUtf8("comboBox"))
        self.comboBoxFormat.addItem("wmv")
        self.comboBoxFormat.addItem("mp3")
        self.comboBoxFormat.addItem("mp4")
        self.comboBoxFormat.addItem("divx")
        self.comboBoxFormat.addItem("quicktime")

#Erstellen des Eingabefelds für "Erscheinungsjahr"
        self.txtErscheinungsjahr = QtGui.QLineEdit(MainWindow)
        self.txtErscheinungsjahr.setGeometry(QtCore.QRect(200, 50, 65, 20))
        self.txtErscheinungsjahr.setInputMethodHints(QtCore.Qt.ImhDigitsOnly|QtCore.Qt.ImhFormattedNumbersOnly|QtCore.Qt.ImhNoPredictiveText|QtCore.Qt.ImhPreferNumbers)
        self.txtErscheinungsjahr.setText(_fromUtf8(""))
        self.txtErscheinungsjahr.setMaxLength(10)
        self.txtErscheinungsjahr.setObjectName(_fromUtf8("txtErscheinungsjahr"))

#Erstellen des Eingabefelds für "Albumtitel"
        self.txtAlbumtitel = QtGui.QLineEdit(MainWindow)
        self.txtAlbumtitel.setGeometry(QtCore.QRect(200, 20, 111, 20))
        self.txtAlbumtitel.setInputMethodHints(QtCore.Qt.ImhDigitsOnly|QtCore.Qt.ImhFormattedNumbersOnly|QtCore.Qt.ImhNoPredictiveText|QtCore.Qt.ImhPreferNumbers)
        self.txtAlbumtitel.setText(_fromUtf8(""))
        self.txtAlbumtitel.setMaxLength(11)
        self.txtAlbumtitel.setReadOnly(False)
        self.txtAlbumtitel.setObjectName(_fromUtf8("txtAlbumtitel"))

#Backup Eingabefeld für "Format"
        self.Formatlabel = QtGui.QLabel(MainWindow)
        self.Formatlabel.setGeometry(QtCore.QRect(20, 80, 41, 16))
        self.Formatlabel.setObjectName(_fromUtf8("Formatlabel"))

#Erstellen des Eingabefelds für "Datum"
        self.txtDatum = QtGui.QLineEdit(MainWindow)
        self.txtDatum.setGeometry(QtCore.QRect(200, 140, 65, 20))
        self.txtDatum.setText(_fromUtf8(""))
        self.txtDatum.setMaxLength(20)
        self.txtDatum.setObjectName(_fromUtf8("txtDatum"))
        self.txtDatum.setMaxLength(10)

#Erstellen von "Datum" - Feldbeschriftung
        self.Datumlabel = QtGui.QLabel(MainWindow)
        self.Datumlabel.setGeometry(QtCore.QRect(20, 140, 170, 20))
        self.Datumlabel.setStyleSheet(_fromUtf8("font: 9pt \"MS Shell Dlg 2\";"))
        self.Datumlabel.setObjectName(_fromUtf8("Datumlabel"))

#Erstellen des Eingabefelds für "Genre"
        self.txtGenre = QtGui.QLineEdit(MainWindow)
        self.txtGenre.setGeometry(QtCore.QRect(200, 170, 100, 20))
        self.txtGenre.setText(_fromUtf8(""))
        self.txtGenre.setMaxLength(10)
        self.txtGenre.setObjectName(_fromUtf8("txtGenre"))

#Erstellen von "Genre" - Feldbeschriftung
        self.Genrelabel = QtGui.QLabel(MainWindow)
        self.Genrelabel.setGeometry(QtCore.QRect(20, 170, 101, 16))
        self.Genrelabel.setStyleSheet(_fromUtf8("font: 9pt \"MS Shell Dlg 2\";"))
        self.Genrelabel.setObjectName(_fromUtf8("Genrelabel"))

#Erstellen von "Sprachcodelabel" - Feldbeschriftung
        self.Sprachcodelabel = QtGui.QLabel(MainWindow)
        self.Sprachcodelabel.setGeometry(QtCore.QRect(20, 200, 71, 16))
        self.Sprachcodelabel.setStyleSheet(_fromUtf8("font: 9pt \"MS Shell Dlg 2\";"))
        self.Sprachcodelabel.setObjectName(_fromUtf8("Sprachcodelabel"))

#Erstellen des Butten "Clear All"
        self.btnClearAll = QtGui.QPushButton(MainWindow)
        self.btnClearAll.setGeometry(QtCore.QRect(410, 210, 75, 23))
        self.btnClearAll.setMouseTracking(True)
        self.btnClearAll.setDefault(True)
        self.btnClearAll.setObjectName(_fromUtf8("btnClearAll"))

#Erstellen des Drop-Down-Menue für "Sprachcode" mit waehlbaren Sprachen
        self.comboBoxSprache = QtGui.QComboBox(MainWindow)
        self.comboBoxSprache.setGeometry(QtCore.QRect(200, 200, 90, 22))
        self.comboBoxSprache.setEditable(False)
        self.comboBoxSprache.setMaxVisibleItems(5)
        self.comboBoxSprache.setMaxCount(5)
        self.comboBoxSprache.setMinimumContentsLength(1)
        self.comboBoxSprache.setObjectName(_fromUtf8("comboBox"))
        self.comboBoxSprache.addItem("D - deutsch")
        self.comboBoxSprache.addItem("E - englisch")
        self.comboBoxSprache.addItem("F - französisch")
        self.comboBoxSprache.addItem("P - polnisch")
        self.comboBoxSprache.addItem("T - türkisch")

#Erstellen des Drop-Down-Menue für "Informationstraeger" mit waehlbaren Arten
        self.comboBoxInformationstraeger = QtGui.QComboBox(MainWindow)
        self.comboBoxInformationstraeger.setGeometry(QtCore.QRect(200, 110, 256, 22))
        self.comboBoxInformationstraeger.setObjectName(_fromUtf8("comboBox_2"))
        self.comboBoxInformationstraeger.setEditable(False)
        self.comboBoxInformationstraeger.addItem("Platte")
        self.comboBoxInformationstraeger.addItem("Kasette")
        self.comboBoxInformationstraeger.addItem("CD")
        self.comboBoxInformationstraeger.addItem("DVD")
        self.comboBoxInformationstraeger.addItem("Blue-Ray")
        self.comboBoxInformationstraeger.addItem("Festplatte")

#Aktion - Eintraege aus den Eingabefeldern "Albumtitel","Erscheinungsjahr",
#"Datum" und "Albumtitel" durch drücken des Button "Clear All"
#entfernen bzw. loeschen
        self.retranslateUi(MainWindow)
        QtCore.QObject.connect(self.btnClearAll, QtCore.SIGNAL(_fromUtf8("clicked()")), self.txtAlbumtitel.clear)
        QtCore.QObject.connect(self.btnClearAll, QtCore.SIGNAL(_fromUtf8("clicked()")), self.txtErscheinungsjahr.clear)
        QtCore.QObject.connect(self.btnClearAll, QtCore.SIGNAL(_fromUtf8("clicked()")), self.txtDatum.clear)
        QtCore.QObject.connect(self.btnClearAll, QtCore.SIGNAL(_fromUtf8("clicked()")), self.txtGenre.clear)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

#Eintraege der jeweiligen Beschriftungslabel der Feldbeschriftungen
    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "Archiver", None))
        self.Albumtitellabel.setText(_translate("MainWindow", "Albumtitel:", None))
        self.Erscheinungsjahrlabel.setText(_translate("MainWindow", "Erscheinungsjahr:", None))
        self.Traegerlabel.setText(_translate("MainWindow", "Träger:", None))
        self.btnpdflyrics.setText(_translate("MainWindow", "pdf - Lyrics", None))
        self.btnpdfbooklet.setText(_translate("MainWindow", "pdf - Booklet", None))
        self.btnsavetxt.setText(_translate("MainWindow", "save txt", None))
        self.Formatlabel.setText(_translate("MainWindow", "Format:", None))
        self.Datumlabel.setText(_translate("MainWindow", "Datum - ddmmyyyy:", None))
        self.Genrelabel.setText(_translate("MainWindow", "Genre:", None))
        self.Sprachcodelabel.setText(_translate("MainWindow", "Sprache:", None))
        self.btnClearAll.setText(_translate("MainWindow", "Clear All", None))
        self.btntest.setText(_translate("MainWindow","TEST", None))
sowie ein zweites Modul - main.py um die Funktionen zu definieren:

Code: Alles auswählen

import os,sys
import time

import glob

from tkinter import *
from PyQt4.QtGui import QDialog, QApplication, QPushButton, QLineEdit, QFormLayout
root=Tk()

#Einbinden der Bibliotheken
from PyQt4 import QtCore,QtGui


#Einbinden des GUI Code (windowUI.py)
from windowUi import Ui_MainWindow



class Main(QtGui.QMainWindow):

    def __init__(self):
        QtGui.QMainWindow.__init__(self)

        self.ui=Ui_MainWindow()
        self.ui.setupUi(self)
        self.ui.btntest.clicked.connect(self.btntest_clicked)
        self.ui.btnpdfbooklet.clicked.connect(self.openFile)


#Funktion für Button "Test"

    def btntest_clicked(self):
        self.ui.txtAlbumtitel.setText("Best Of")
        self.ui.txtErscheinungsjahr.setText("11.11.2014")
        self.ui.txtDatum.setText("19.02.2014")
        self.ui.txtGenre.setText("Rock")


#Funktion für Button "Datum"

    def btndatum_clicked(self):
        self.ui.txtDatum.setText("13.02.2014")


#Funktion für Button "PDF-Booklet"
    def btnpdfbooklet_clicked(self):
        self.ui.btnpdfbooklet.clicked.connect(self.openFile)


#Verzeichnis zum laden öffnen - geht noch nicht -.-

    def openFile(btntest_clicked):

        openFile = QtGui.QAction(QtGui.QIcon('open.png'), 'Open', self)
        openFile.setShortcut('Ctrl+O')
        openFile.setStatusTip('Open pdf-Doku')

        fileMenu = btnpdfbooklet_clicked.openFile('&File')
        fileMenu.addAction(openFile)

        self.setGeometry()
        self.setWindowTitle('File dialog')
        self.show()

    def showDialog(self):

        fname = QtGui.QFileDialog.getOpenFileName(self, 'Open pdf-Booklet', '/home')

        f = open(fname, 'r')


    def main():

     app = QtGui.QApplication(sys.argv)
     app = QtGui.QApplication(sys.argv)
     ex = Example()
     sys.exit(app.exec_())
     window=Main()
     window.show()
     gui = ComboBoxBasic()
     sys.exit(app.exec_())
     ex = Example()

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)

    window = Main()
    window.show()
    sys.exit(app.exec_())
Das Problem ist, dass ich eigentlich wenn ich auf den lyrics-pdf und booklet-pdf Button drücke, will dass ich im Explorer einmal die Lyrics und einmal das Booklet laden will, so dass der Verzeichnispfad links im Fenster angezeigt wird. Ich bekomme das einfach nicht hin.
Weiter würde ich gerne, die ausgewählten bzw. eingetragenen Werte der Felder durch den save-txt Button in ein txt-File abspeichern lassen.
Wie kann ich die Werte aus den Felder auslesen und zusammen in ein txt-File abspeichern?
:K

Für jede kleine Hilfe wäre ich sehr verbunden und erfreut :cry:
Benutzeravatar
Madmartigan
User
Beiträge: 200
Registriert: Donnerstag 18. Juli 2013, 07:59
Wohnort: Berlin

Hallo Jan,

den Text aus einem QLineEdit bekommst du über dessen Methode text().
z.B.:

Code: Alles auswählen

album_title = self.txtAlbumtitel.text()
Aufpassen! Das ist ein QString, für etwaige Weiterverwendung ist es ratsam, folgendes zu verwenden:

Code: Alles auswählen

album_title = str(self.txtAlbumtitel.text())
Strings in eine Datei zu speichern ist auch wirklich simpel.

Code: Alles auswählen

out_file = open('pfad zur datei', 'w')
out_file.write(album_title)
out_file.close()
oder mehr pythonic:

Code: Alles auswählen

with open('pfad zur datei', 'w') as out_file:
    out_file.write(album_title)
Jan Butters
User
Beiträge: 2
Registriert: Dienstag 18. Februar 2014, 19:54

Vielen Vielen Dank :D
hat alles prima geklappt
BlackJack

@Jan Butters: Die GUI-Elemente sind absolut platziert und mit absoluten Grössen. Du solltest statt dessen die Layout-Möglichkeiten von Qt benutzen, damit sich die GUI unterschiedlichen Displaygrössen und Grafikeinstellungen anpassen kann.

Mit dem `PyQt4.uic`-Modul kann man die ``*.ui``-Datei zur Laufzeit laden, dann braucht man keinen Quelltext daraus zu generieren. Das spart also einen Zwischenschritt.
Antworten