Destopanwendung, Übergeben von generierten Listen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mady
User
Beiträge: 7
Registriert: Mittwoch 17. Oktober 2018, 20:38

Hallo,

ich habe eine Destopanwendung programmiert, mit 2 Buttons.
Button-Nr.1 (work_file_with_excel) soll Begriffe aus einer Exceltabelle in eine Liste (allgemein_1) lesen/schreiben
Button-Nr.2 (search_for_it) soll anhand dieser generierten Liste (allgemein_1) eine weiter Datei durchsuchen. Wenn eine Wort aus der Liste (allgemein_1) gefunden wird, soll die jeweilige komplette Zeile in eine weitere txt Datei gedruckt werden.

Leider haben ich 2 Probleme

1. Ich bekomme die Liste nicht übergeben. Wie kann ich die Liste übergeben?
2. Wenn der Button-Nr.2 (search_for_it) gedrückt wird, wird das komplette Programm auf "break" gesetzt. Wie kann ich den Code anders schreiben, dass das nicht mehr passiert ?

Hier mein Code:

Code: Alles auswählen

#import numpy as np
#import xlrd
#import matplotlib.pyplot as plt
import pandas as pd
from pandas import DataFrame
import random
import sys


bpa_file ='Technische Gebäudeausrüstung'
gewerke_file ='Gebäudeautomation'


import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *


#search_file =


class filedialogdemo(QWidget):
    def __init__(self, parent = None):
        super(filedialogdemo, self).__init__(parent)

        layout = QVBoxLayout()

        self.button_1 = QPushButton("Suchliste")
        self.button_1.clicked.connect(self.work_file_with_excel)
        layout.addWidget(self.button_1)

        self.button_2 = QPushButton("Wortsuche")
        self.button_2.clicked.connect(self.search_for_it)
        layout.addWidget(self.button_2)

        self.setLayout(layout)
        self.setWindowTitle("Lea\'s Program")

    def work_file_with_excel(self):
        print('fängt an')
        if bpa_file == 'Technische Gebäudeausrüstung':
            file_name_tga = '2018_10_26_Liste zum Prüfen_Arbeitsdatei.xlsx'
            xls = pd.ExcelFile(file_name_tga, encoding_override="utf-8")
            xls.sheet_names
            ['Allgemein', 'Nebenleistungen', 'Besondere Leistungen','von Prüfliste', 'Hersteller']
            if gewerke_file == 'Gebäudeautomation':
                df_1 = pd.read_excel(file_name_tga, sheet_name="Allgemein")
                allgemein_1 = list (df_1['allgemein'])
                print (allgemein_1)
            else:
                print ('anderes gewerk')
        elif bpa_file == 'Rohbau':
            print ('Rohbau')

    def search_for_it (self):
        def search_for_lines(filename, words_list):
            with open('Ergebnisse.txt','w'): pass

            work_file_with_excel(allgemein_1())
            words_found = 0
            with open(filename) as db_file:
                for line_no, line in enumerate(db_file):
                    if any(word in line for word in words_list):
                        sys.stdout = open('Ergebnisse.txt', 'a')
                        print(line_no, ':', line)
                        words_found += 1
            return words_found


        while True:
            fqWords = [allgemein_1()]
            #fqWords = ['kostenlos', 'bauseits', 'komplett', 'vollständig', 'bzw.', 'somit', 'genau', 'absolut', 'Patent', 'nicht vergütet', 'ohne Vergütung']
            #eigentlich sollte diese liste hier aus der funktion davor übergeben worden sein
            search_for_lines("test.txt", fqWords)
            break ### durch diesn button läuft kompletter code zum break -- wie kann man das ev anders lösen


def main():
    app = QApplication(sys.argv)
    ex = filedialogdemo()
    ex.show()
    sys.exit(app.exec_())

if __name__ == '__main__':
    main()








Sirius3
User
Beiträge: 17745
Registriert: Sonntag 21. Oktober 2012, 17:20

`sys` wird zwei mal importiert. Konstanten wie bpa_file schreibt man komplett groß: BPA_FILE. Klassen dagegen schreibt man Groß-Klein: FileDialogDemo, wobei die Klasse weder ein File-Dialog ist, noch der Zusatz Demo irgendwas aussagt.
Keine *-Importe, weil man damit unkontrolliert Namen in den Namensraum schaufelt. Immer konkrete Namen angeben.
Backslashe in Strings sind eigentlich fast nie nötig, denn es gibt ja verschieden Anführungszeichen für Strings, bei Dir ", wodurch das ' keinen Backslash braucht.
`file_name_tga` ist auch eine Konstante und sollte zu den anderen Konstanten am Anfang des Programms verschoben werden.
Das Laden des Excel-Files `xls` ist unnötig, da es nicht benutzt wird. Einfach nur ein Attribut oder eine literale Liste im Code zu stehen haben, macht bewirkt nichts. allgemein_1 muss an self gebunden werden, damit es über die Methode hinaus referenziert werden kann. `allgemein` ist schlechter Variablenname, und die 1 hilft auch nicht für das Verständnis, was denn nun in dieser Variable gespeichert ist.
In search_for_lines ständig eine Datei zu öffnen um eine Zeile hineinzuschreiben, ist verschwenderisch. Öffne die Datei einmal am Anfang und schreibe immer in das selbe Dateihandle. Das sollte dann nicht sys.stdout sein, denn das wird normalerweise noch für was anderes gebraucht. `print` kennt ein file=-Argument. Weder work_file_with_excel noch allgemein_1 sind hier definiert, wenn allgemein_1 ein Attribut wäre, dann wäre es keine Funktion, die man aufrufen könnte.

Was Du mit der while-Schleife und dem break erreichen willst, ist mir völlig unklar. Eigentlich würde ich sagen, Du willst beides einfach weglassen.
Antworten