habe mal wieder ein kleine Frage.
Die Lösung ist vermutlich sehr einfach, aber nach 1,5 Std. Suche habe ich nun kapituliert.
Ich find die Lösung leider nicht alleine -.-
Code: Alles auswählen
#!/usr/bin/python3
# -*- coding: utf-8 -*-
import sys
import csv
import re
from collections import OrderedDict
from PyQt5.QtCore import QCoreApplication
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout, \
QHBoxLayout, QLineEdit, QPushButton, QTextEdit, \
QCompleter, QTableWidget, QTableWidgetItem, \
QInputDialog, QMessageBox
class Lager():
def __init__(self):
self.lager = OrderedDict()
self.artikelbezeichnungen = [] #Benötigt für Vorschläge in Autocomplete
self.feldnamen = [] #Benötigt zur Erstellung der Feldnamen der Tabelle
def csv_einlesen(self, csvdatei):
with open(csvdatei, "r") as datei:
reader = csv.DictReader(datei, delimiter=";")
self.feldnamen = reader.fieldnames
reader = sorted(reader, key=lambda d: d["Artikelbezeichnung"])
vortlaufendenummer = 1
print("-------------------------------------------------------")
print("|folgende Artikel wurden aus der CSV Datei eingelesen:|")
print("-------------------------------------------------------")
for zeile in reader:
self.lager[vortlaufendenummer] = zeile
print(self.lager[vortlaufendenummer])
self.artikelbezeichnungen.append(self.lager[vortlaufendenummer]\
["Artikelbezeichnung"])
vortlaufendenummer += 1
return (list(range(0,vortlaufendenummer)))
class Lieferanten():
def __init__(self):
self.lieferanten = {}
class Window(QWidget):
def __init__(self):
super().__init__()
self.fenstereinstellungen()
self.warenbestand = Lager()
self.erzeugeWidgets()
self.erzeugeLayout()
self.warenbestand.csv_einlesen("Artikelliste-oop.csv")
self.tabelle_erzeugen(tuple(self.warenbestand.lager.keys()))
self.autovervollstaendigung()
self.show()
# Setzt die allgemeinen Eistellungen des Hauptfensters
def fenstereinstellungen(self):
self.resize(1500, 600)
self.setWindowTitle("Bestellung V1.0")
# Definition der benötigten Windows
def erzeugeWidgets(self):
self.labeltreffer = QLabel()
self.tablewidget = QTableWidget()
self.suchleiste = QLineEdit(self)
self.suchleiste.returnPressed.connect(self.artikel_suchen_und_anzeigen)
self.suchleiste.setToolTip("Artikelbezeichung, oder Artikelnummer "\
"eingeben")
self.sfsuche = QPushButton("Suchen", self)
self.sfsuche.clicked.connect(self.artikel_suchen_und_anzeigen)
self.sfbestellen = QPushButton("Bestellen", self)
self.sfbestellen.clicked.connect(self.bestellmenge_auswaehlen)
self.sfsenden = QPushButton("Senden", self)
self.sfsenden.clicked.connect(self.lieferant_auswaehlen)
self.sfbeenden = QPushButton("Beenden", self)
self.sfbeenden.clicked.connect(self.programm_beenden)
# Setzen des Layouts
def erzeugeLayout(self):
hBoxLay1 = QHBoxLayout()
hBoxLay1.addWidget(self.suchleiste)
hBoxLay1.addWidget(self.sfsuche)
vBoxLay2 = QVBoxLayout()
vBoxLay2.addWidget(self.labeltreffer)
vBoxLay2.addWidget(self.tablewidget)
hBoxLay3 = QHBoxLayout()
hBoxLay3.addWidget(self.sfbestellen)
hBoxLay3.addWidget(self.sfsenden)
hBoxLay3.addWidget(self.sfbeenden)
masterbox = QVBoxLayout()
masterbox.addLayout(hBoxLay1)
masterbox.addLayout(vBoxLay2)
masterbox.addLayout(hBoxLay3)
self.setLayout(masterbox)
# Autovervollständigung des Suchen-feldes oben am Fensterrand
def autovervollstaendigung(self):
vorschlaege = self.warenbestand.artikelbezeichnungen
autocomplete = QCompleter(vorschlaege)
self.suchleiste.setCompleter(autocomplete)
# Erzeugen der Tabelle mit den übergebenen Artikelnummern aus der
# übergebenen Liste
def tabelle_erzeugen(self, artikelnummernliste):
self.tablewidget.setColumnCount(len(self.warenbestand.feldnamen))
self.tablewidget.setHorizontalHeaderLabels(self.warenbestand.feldnamen)
zeile = 0
print("----------------------------------------------------")
print("|folgende Artikel wurden in die Tabelle geschrieben|")
print("----------------------------------------------------")
for artikelnummer in artikelnummernliste:
zeile += 1
self.tablewidget.setRowCount(zeile)
spalte = 0
print(self.warenbestand.lager[artikelnummer])
print(artikelnummer)
for schluessel in self.warenbestand.lager[artikelnummer]:
print(zeile, spalte, str(self.warenbestand.lager[artikelnummer][schluessel]))
self.tablewidget.setItem(zeile, spalte, \
QTableWidgetItem(str(self.warenbestand.lager[artikelnummer][schluessel])))
spalte += 1
self.labeltreffer.setText("Es wurden " + str(zeile) +\
" Artikel gefunden")
"""
# Aufbau und Anwendung wie Werte in eine Zelle geschrieben werden
#self.tablewidget.setItem(0,0, QTableWidgetItem("Zellenname0"))
#self.tablewidget.setItem(0,1, QTableWidgetItem("Zellenname1"))
#self.tablewidget.setItem(0,2, QTableWidgetItem("Zellenname2"))
"""
# Such nach den eingegebenen Textteilen in allen Artikelbezeichungen und
# und gibt diese dann durch aufruf der tabelle_erzeugen funktion aus
def artikel_suchen_und_anzeigen(self):
durchlaufzaehler = 0
suchbegriff = "".join(["[" + str(zeichen).upper() +\
str(zeichen).lower() + "]"\
for zeichen in self.suchleiste.text()])
print("------------------------------------------------")
print("|Die Suche nach Artikel ergab folgende Nummern:|")
print("------------------------------------------------")
print("Gesuchte Zeichenkette: " + suchbegriff)
gefundene_artikelnummern = []
for artikelnummer in self.warenbestand.lager:
if re.findall(suchbegriff, self.warenbestand.lager[artikelnummer]\
["Artikelbezeichnung"]):
gefundene_artikelnummern.append(artikelnummer)
durchlaufzaehler += 1
print("passende Artikelnummern: " + str(gefundene_artikelnummern))
if durchlaufzaehler == 0:
self.labeltreffer.setText("Es konnte kein Treffer ermittelt werden")
self.tabelle_erzeugen(gefundene_artikelnummern)
# Auswahl der zu bestellenden Menge die dem Artikel hinterlegt werden soll
def bestellmenge_auswaehlen(self):
menge, check = QInputDialog.getInt(self, "Bestellmenge",
"Zu bestellenden Menge eingeben:",
value=1)
#if check:
# Auswahl des Lieferanten dem die Bestellung gesendet werden soll
def lieferant_auswaehlen(self):
lieferanten = ("Innstolz", "optima", "Hofmark")
lieferant, check = QInputDialog.getItem(self, "Lieferant",
"Lieferanten auswählen:",\
lieferanten)
#if check:
# Beenden des Programmes
def programm_beenden(self):
reply = QMessageBox.question(self, "Achtung", "Möchten Sie die " \
"Anwendung wirklich schließen?", \
QMessageBox.Yes | QMessageBox.No, \
QMessageBox.No)
if reply == QMessageBox.Yes:
QCoreApplication.quit()
def main():
app = QApplication(sys.argv)
w = Window()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Das bei mir auftauchende Problem erscheint beim Aufruf der Funktion "tabelle_erzeugen".
Es sollte anhand der übergeben Liste die jeweiligen Elemente in die QTableWidgets übergeben werden.
Es wird eine Tabelle erzeugt, diese hat auch so viele Zeilen wie sich in der Csv Datei befinden, bzw.
so viele wie durch die Suchfunktion Elemente gefunden werden. Nur bleiben die Felder leer, also es steht kein Text darin.
Ich bin neu in der GUI Programmierung und kann es mir nicht erklären.
Das Programm ist noch NICHT fertig!
Es wurde bisher nur der Aufbau, Import und Anzeige fertig gestellt.
Die Funktionen "bestellmenge_auswaehlen" und "lieferant_auswaehlen" sind nur ganz grob notiert.
Ich würde mich daher sehr über Hilfe freuen.