Python — как реализовать ООП с PyQt (connect)? Есть окно в PyQt в нем кнопка Оpen для загрузки файла В том же окне есть таблица, которая заполняется содержимым файл Не могу грамотно соединить все( Вот части программы:class open_kn(QPushButton): def __init__(self, parent=None): super(open_kn, self).__init__(parent) self.setText('Open') self.resize(self.sizeHint()) self.clicked.connect(FileDialog)
class FileDialog(QFileDialog): def __init__(self): super().__init__() try: self.fileName = self.getOpenFileName(self, 'Open file', 'D:\\')[0] #self.textEdit.setText(self.fileName) f = open(self.fileName, 'r') data = [] with f as f: for i in f.readlines(): data.append(i) TableWidget.data = data except IOError: print('Не могу открыть', self.fileName) except ImportError as err: print('Error: импортировать файл не удалось!', err) except ValueError as err: print('Error: не тот формат данных!', err) except: print('Неожиданная ошибка:', sys.exc_info()[0]) class TableWidget(QTableWidget): def __init__(self, parent=None, data=[]): super(TableWidget, self).__init__(parent) #data = [] self.setColumnCount(1) self.setRowCount(len(data)) for i, entry in enumerate(data, start=1): self.setRowCount(i) item = QTableWidgetItem() item.setText(str(entry)) Сама таблица вставляется QGridLayout: я думала может в класс задать переменной данные с файла и там уже просто обьявить таблицу с атрибутом но не знаю как это реализовать Вот класс class HBox4(QGridLayout): def __init__(self, parent=None): super(HBox4, self).__init__(parent) table = TableWidget() self.addWidget(table, *(0,0)) self.addWidget(TabDemo(), *(0,1)) Я только начала изучать программирование не судите строго Я думаю, может так вообще делать нельзя(
Для связывания кнопки с функцией загрузки файла и заполнения таблицы, вы можете использовать сигналы и слоты в PyQt. Вот пример, как вы можете изменить ваш код:
Сделайте изменения в классе open_kn, чтобы он создавал сигнал, который будет отправляться при нажатии на кнопку:from PyQt5.QtCore import pyqtSignal class open_kn(QPushButton): file_loaded = pyqtSignal(object) def __init__(self, parent=None): super(open_kn, self).__init__(parent) self.setText('Open') self.resize(self.sizeHint()) self.clicked.connect(self.FileDialog) def FileDialog(self): file_dialog = QFileDialog() file_name, _ = file_dialog.getOpenFileName(self, 'Open file', 'D:\\') if file_name: self.file_loaded.emit(file_name)В классе, который содержит таблицу, подключите сигнал к функции, которая будет заполнять таблицу:class HBox4(QGridLayout): def __init__(self, parent=None): super(HBox4, self).__init__(parent) self.table = TableWidget() self.addWidget(self.table, *(0,0)) self.addWidget(TabDemo(), *(0,1)) open_button = open_kn() open_button.file_loaded.connect(self.load_file) def load_file(self, file_name): data = [] try: with open(file_name, 'r') as f: for line in f: data.append(line.strip()) self.table.setRowCount(len(data)) for i, entry in enumerate(data): item = QTableWidgetItem() item.setText(str(entry)) self.table.setItem(i, 0, item) except Exception as e: print('Error:', e)
Теперь, когда пользователь нажимает на кнопку "Open", сигнал file_loaded отправляется и функция load_file вызывается для загрузки файла и заполнения таблицы данными из него.
Для связывания кнопки с функцией загрузки файла и заполнения таблицы, вы можете использовать сигналы и слоты в PyQt. Вот пример, как вы можете изменить ваш код:
Сделайте изменения в классе open_kn, чтобы он создавал сигнал, который будет отправляться при нажатии на кнопку:from PyQt5.QtCore import pyqtSignalclass open_kn(QPushButton):
file_loaded = pyqtSignal(object)
def __init__(self, parent=None):
super(open_kn, self).__init__(parent)
self.setText('Open')
self.resize(self.sizeHint())
self.clicked.connect(self.FileDialog)
def FileDialog(self):
file_dialog = QFileDialog()
file_name, _ = file_dialog.getOpenFileName(self, 'Open file', 'D:\\')
if file_name:
self.file_loaded.emit(file_name)В классе, который содержит таблицу, подключите сигнал к функции, которая будет заполнять таблицу:class HBox4(QGridLayout):
def __init__(self, parent=None):
super(HBox4, self).__init__(parent)
self.table = TableWidget()
self.addWidget(self.table, *(0,0))
self.addWidget(TabDemo(), *(0,1))
open_button = open_kn()
open_button.file_loaded.connect(self.load_file)
def load_file(self, file_name):
data = []
try:
with open(file_name, 'r') as f:
for line in f:
data.append(line.strip())
self.table.setRowCount(len(data))
for i, entry in enumerate(data):
item = QTableWidgetItem()
item.setText(str(entry))
self.table.setItem(i, 0, item)
except Exception as e:
print('Error:', e)
Теперь, когда пользователь нажимает на кнопку "Open", сигнал file_loaded отправляется и функция load_file вызывается для загрузки файла и заполнения таблицы данными из него.