Python - Передача переменной имени файла в pyqt между функциями - PullRequest
0 голосов
/ 12 ноября 2018

Я сделал приложение для дестопа. С помощью одной кнопки (button_on_click_getfile) вы можете выбрать файл.С другой кнопкой (button_on_click_work) вы должны работать с файлом.Мне нужно немного информации от пользователя перед обработкой файла, поэтому мне нужно передать имя файла из файла button_on_click_getfile в button_on_click_work.

Как мне передать имя файла.Мой код работает, но при нажатии button_on_click_work возвращает следующее:

Process finished with exit code -1073740791 (0xC0000409)

Вот мой код:

from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtWidgets import *
from PyQt5.QtWidgets import QGridLayout, QWidget, QDesktopWidget
from tkinter import messagebox
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMainWindow, QPushButton, QAction, QMessageBox
from PyQt5.QtWidgets import QCalendarWidget, QFontDialog, QColorDialog, QTextEdit, QFileDialog
from PyQt5.QtWidgets import QCheckBox, QProgressBar, QComboBox, QLabel, QStyleFactory, QLineEdit, QInputDialog
from PyQt5.QtWidgets import QTabWidget
from file_to_text2 import convert_file_to_txt2
from excel_function import work_file_with_excel




OUTPUT_FILENAME = 'test.txt'


class main_window(QTabWidget):
    def __init__(self, parent=None):
        super(main_window, self).__init__(parent)


        self.setGeometry(50,50, 1078, 541)
        self.setWindowTitle("Lea\'s Program")

        qtRectangle = self.frameGeometry()
        centerPoint = QDesktopWidget().availableGeometry().center()
        qtRectangle.moveCenter(centerPoint)
        self.move(qtRectangle.topLeft())


        self.centralWidget = QtWidgets.QWidget()
        self.tabWidget = QtWidgets.QTabWidget(self.centralWidget)
        self.tabWidget.setGeometry(QtCore.QRect(10, 10, 1200, 1000))
        self.tabWidget.setLayoutDirection(QtCore.Qt.LeftToRight)
        self.tabWidget.setTabPosition(QtWidgets.QTabWidget.West)


        self.tab_v1 = QtWidgets.QWidget()
        self.addTab(self.tab_v1, "Read")


        self.openFile = QPushButton("Get file", self.tab_v1)
        self.openFile.setGeometry(QtCore.QRect(700, 15, 200, 30))
        self.openFile.clicked.connect(self.on_click_getfile)


        self.path_file = QLabel("",self.tab_v1)
        self.path_file.setGeometry(QtCore.QRect(200, 15, 350, 30))

        self.groupbox = QGroupBox('Informationen', self.tab_v1)
        self.groupbox.setGeometry(QtCore.QRect(15, 100, 1000, 600))

        self.w_pz = QLineEdit(self.groupbox)
        self.w_pz.setGeometry(QtCore.QRect(212, 150, 250, 22))

        self.w_pn = QLineEdit(self.groupbox)
        self.w_pn.setGeometry(QtCore.QRect(212, 200, 250, 22))

        self.work_file = QtWidgets.QPushButton("Search", self.tab_v1)
        self.work_file.setGeometry(QtCore.QRect(700, 250, 150, 30))
        self.work_file.clicked.connect(self.on_click_work)

    def on_click_getfile(self):
        fname = QFileDialog.getOpenFileName(self,
                                            'Open file',
                                            'c:\\',
                                            'Alle LV-Check-Datein,(*.txt *.docx *.xml *.x81 *.pdf)'
                                            #'Alle Datein (*.*)'
                                            )
        filename = fname[0]
        self.path_file.setText(filename)
        print (filename)

        return filename # with this i want to pass the filename to on_click_work

    def on_click_work(self):
        if len (self.w_pz.text()) < 1:
            messagebox.showinfo("Information", "Please  put something in")
        elif len (self.w_pn.text()) < 1:
            messagebox.showinfo("Information", "Please  put something in")
        else:
            input_lv =([self.w_pz.text(),self.w_pn.text()])
            print (input_lv)

            filename = on_click_getfile(filename) ##this should get the filename from the on_click_getfile function
            print (filename)
            convert_file_to_txt2(filename,input_lv, output_filename=OUTPUT_FILENAME) # this should start running convertig different filetypes depending on the filename, which was put in at teh on_click_getfile function
            work_file_with_excel(OUTPUT_FILENAME) # this should get the outputfile from convert_file_to_txt2 and run a search

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


if __name__ == '__main__':
    main()

1 Ответ

0 голосов
/ 12 ноября 2018

Вероятно, вы можете думать об этих решениях в этом коде.

Глобальное заявление

Вы пишете global filename в каждой функции. При этом вы можете использовать оба имени файла. Пожалуйста, обратите внимание, чтобы дублировать имя и перезаписать. Пожалуйста, не забывайте писать это заявление только перед фактами.

Свойство QObject

В def on_click_getfile(self):

self.setProperty("get_filename",get_filename) # вы можете Имя с соответствующим именем.

В def on_click_work(self):

get_filename = self.property("get_filename") # вы получаете действительное имя с тем же именем.

В программировании на Qt очень важно знать и думать об отношениях между родителями и детьми, а также о связи с каждым виджетом.

Эти решения не очень хороши, потому что они не предназначены для повышения вашего мастерства. Но оба они очень полезны, когда вы путаетесь с подключением и передачей значений виджета.

делает себя. сначала объект в конструкторе

вы должны сделать объект файла self.current_filename в Конструкторе (класс main_window)

-omitting-
self.current_filename = ""#here
def on_click_getfile(self):
        fname = QFileDialog.getOpenFileName(self,
                                            'Open file',
                                            'c:\\',
                                            'Alle LV-Check-Datein,(*.txt *.docx *.xml *.x81 *.pdf)'
                                            #'Alle Datein (*.*)'
                                            )
        self.filename = fname[0]#here this can be
        self.path_file.setText(self.filename)
        print (filename)

        return filename`# you may delete it.




def on_click_work(self):
    if len (self.w_pz.text()) < 1:
        messagebox.showinfo("Information", "Please  put something in")
    elif len (self.w_pn.text()) < 1:
        messagebox.showinfo("Information", "Please  put something in")
    else:
        input_lv =([self.w_pz.text(),self.w_pn.text()])
        print (input_lv)

        #filename = on_click_getfile(filename) ##this should get the filename from the on_click_getfile function
        #print (filename)
        convert_file_to_txt2(self.filename#here,input_lv, output_filename=OUTPUT_FILENAME) # this should start running convertig different filetypes depending on the filename, which was put in at teh on_click_getfile function
        work_file_with_excel(OUTPUT_FILENAME) # this should get the outputfile from convert_file_to_txt2 and run a search

То есть передавать допустимые значения между двумя функциями не нужно. сначала вы создаете self.filename объект. и когда вы получите filename, установите его на self.filename. И, наконец, вы используете его в методах. Я думаю, что это лучшее решение для этой проблемы.

В этом случае это будет проще, чем Signal & Slot.

...