I'm trying to get all my filenames after I click on a button. I am getting the following error after I run app.py
-
<lib.create_form_elements.CreateFormElements object at 0x000002286E0B9948>
Traceback (most recent call last):
File "\controller\addNewItemController.py", line 12, in update_filename
self._model.fname = value
File "\models\addNewItemModel.py", line 14, in fname
self._flname.emit(value)
AttributeError: 'bool' object has no attribute 'emit'
.
what am I doing wrong?
app.py
import sys
from PyQt5.QtWidgets import QApplication
from models.addNewItemModel import ModelAddNewItem
from views.additem import AddNewItem
from controller.addNewItemController import AddNewItemController
class App(QApplication):
def __init__(self, sys_argv):
super(App, self).__init__(sys_argv)
self.model = ModelAddNewItem()
self.main_controller = AddNewItemController(self.model)
self.main_view = AddNewItem(self.model, self.main_controller)
self.main_view.show()
if __name__ == '__main__':
app = App(sys.argv)
sys.exit(app.exec_())
view:
from PyQt5 import QtWidgets
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QMainWindow, QWidget, QVBoxLayout, QLineEdit, QPushButton
from lib.create_form_elements import CreateFormElements
# view
# Subclass QMainWindow to customise your application's main window
class AddNewItem(QMainWindow):
def __init__(self, model, controller, *args, **kwargs):
super(AddNewItem, self).__init__(*args, **kwargs)
self._model = model
self._controller = controller
self.myWindow()
def myWindow(self):
self.setWindowTitle("Add New Item")
sizeObject = QtWidgets.QDesktopWidget().screenGeometry(-1)
print(" Screen size : " + str(sizeObject.height()) + "x" + str(sizeObject.width()))
self.width = 600
self.height = 480
self.left = 0
self.top = 0
self.setGeometry(self.left, self.top, self.width, self.height)
layout = QVBoxLayout()
el_name = CreateFormElements("Object Name: ", QLineEdit())
el_image = CreateFormElements("Add Images", None)
el_image_1 = CreateFormElements("Image 1 ", QPushButton(), connectType='file', _fieldType='button')
el_image_2 = CreateFormElements("Image 2 ", QPushButton(), connectType='file', _fieldType='button')
el_image_3 = CreateFormElements("Image 1 ", QPushButton(), connectType='file', _fieldType='button')
el_image_4 = CreateFormElements("Image 2 ", QPushButton(), connectType='file', _fieldType='button')
el_save_button = QPushButton()
el_save_button.setText('save')
# this button is my save button
el_save_button.clicked.connect(self._controller.get_file_name)
self._model.fileName.connect(self.on_filename_changed)
layout.addWidget(el_name)
layout.addWidget(el_image)
layout.addWidget(el_image_1)
layout.addWidget(el_image_2)
layout.addWidget(el_image_3)
layout.addWidget(el_image_4)
layout.addWidget(el_save_button)
widget = QWidget()
widget.setLayout(layout)
self.setCentralWidget(widget)
@pyqtSlot(str)
def on_filename_changed(self, value):
print(value)
Model:
from PyQt5.QtCore import QObject, pyqtSignal
class ModelAddNewItem(QObject):
fileName = pyqtSignal(str)
@property
def fname(self):
return self._flname
@fname.setter
def fname(self, value):
self._flname = value
self._flname.emit(value)
def __init__(self):
super().__init__()
self._flname = ''
controller
from PyQt5.QtCore import QObject, pyqtSlot, QFileInfo
class AddNewItemController(QObject):
def __init__(self, model):
super().__init__()
self._model = model
@pyqtSlot(str)
def update_filename(self, value):
self._model.fname = value
def get_file_name(self):
filePath = self.line_edit.text()
fileName = QFileInfo(filePath).fileName()
the factory that create my form elements/ widgets:
from PyQt5 import QtWidgets
from PyQt5.QtCore import QFileInfo, pyqtSignal
from PyQt5.QtWidgets import QFormLayout, QLabel, QLineEdit, QHBoxLayout, QFileDialog
class CreateFormElements(QtWidgets.QWidget):
filenameChanged = pyqtSignal(str)
def __init__(self, label, fieldType, **kwargs):
super(CreateFormElements, self)
super().__init__()
self.line_edit = QLineEdit()
self.label = label
self.fieldType = fieldType
self.connectType = kwargs.get('connectType', None)
self._fieldType = kwargs.get('_fieldType', None)
self.create_form_row()
def create_form_row(self):
layout = QFormLayout()
# if this is a button that should open up a file window, call the create_file_window() function to make a
# file window.
if self.connectType == 'file' and self._fieldType == 'button':
self.fieldType.setText("Browse")
self.fieldType.clicked.connect(self.create_file_window)
hlayout = QHBoxLayout()
hlayout.addWidget(self.line_edit)
hlayout.addWidget(self.fieldType)
layout.addRow(QLabel(self.label), hlayout)
#self.line_edit.textChanged.connect(self.get_file_name)
else:
layout.addRow(QLabel(self.label), self.fieldType)
self.setLayout(layout)
def create_file_window(self):
fileName, _ = QFileDialog.getOpenFileName(None, 'Select Image', '', 'Image Files (*.png *.jpg '
'*.jpeg *.bmp)')
self.line_edit.setText(fileName)
self.filenameChanged.emit(fileName)