Можно ли разделить код GUI и обработчика событий в разные файлы? (Python, PyQt5)
Пытаюсь отделить код интерфейса приложения и обработчиков событий для читабельности и удобства.
Проблема в том, что обработчики событий оперируют элементами GUI и при запуске программы выдается ошибка о том, что элемент используемый в обработчике не определен, но он определен в модуле GUI.
GUI_modul.py
from PyQt5 import QtWidgets, QtGui, QtCore, QtSql
import sys
from modul1 import input_cliced
app = QtWidgets.QApplication(sys.argv)
###########################################################
######## Стартовое окно ############
###########################################################
start_window = QtWidgets.QWidget()
start_window.setWindowTitle('База приборов')
button_input = QtWidgets.QPushButton('Внести новый прибор')
button_input.clicked.connect(input_cliced)
start_layout = QtWidgets.QGridLayout()
start_layout.addWidget(button_input)
start_window.setLayout(start_layout)
###########################################################
######## Окно ввода информации о новом приборе ############
###########################################################
input_window = QtWidgets.QWidget()
input_window.setWindowTitle('Ввод нового прибора')
input_window.resize(QtCore.QSize(1000,300))
###Поля ввода информации в окне ввода
input_layout = QtWidgets.QGridLayout()
input_place_devprod = QtWidgets.QLineEdit()
input_place_devmode = QtWidgets.QLineEdit()
input_place_devSN = QtWidgets.QLineEdit()
input_submit_btn = QtWidgets.QPushButton('Input')
###Добавление полей ввода в слой окна ввода данных
input_layout.addWidget(lable_devprod)
input_layout.addWidget(input_place_devprod)
input_layout.addWidget(input_place_devmode)
input_layout.addWidget(input_place_devSN)
input_layout.addWidget(input_submit_btn)
###Передача слоя в окно ввода данных
input_window.setLayout(input_layout)
start_window.show()
sys.exit(app.exec_())
Отрывок кода modul1.py с обработчиком событий
from PyQt5 import QtWidgets
def input_cliced ():
input_window.show()
start_window запускается, но при нажатии на button_input вылетает ошибка о том, что input_window не определен, но он определен в первом модуле.
Вопрос - как сделать чтобы модули видели объекты друг друга? (Среда Visual Studio)
Ответы (1 шт):
Автор решения: S. Nick
→ Ссылка
То что вы задумали, может выглядеть примерно так:
main.py
from PyQt5 import QtWidgets, QtGui, QtCore, QtSql
from modul1 import InputWindow
class StartWindow(QtWidgets.QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle('База приборов')
button_input = QtWidgets.QPushButton('Внести новый прибор')
button_input.clicked.connect(self.input_cliced)
self.label_devprod = QtWidgets.QLabel()
self.label_devmode = QtWidgets.QLabel()
self.label_devSN = QtWidgets.QLabel()
start_layout = QtWidgets.QGridLayout(self)
start_layout.addWidget(self.label_devprod)
start_layout.addWidget(self.label_devmode)
start_layout.addWidget(self.label_devSN)
start_layout.addWidget(button_input)
self.input_window = InputWindow(self)
def input_cliced(self):
self.input_window.show()
if __name__ == '__main__':
import sys
app = QtWidgets.QApplication(sys.argv)
w = StartWindow()
w.resize(QtCore.QSize(640, 480))
w.show()
sys.exit(app.exec_())
modul1.py
from PyQt5 import QtWidgets, QtCore
class InputWindow(QtWidgets.QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.parent = parent
self.setWindowTitle('Ввод нового прибора')
self.resize(QtCore.QSize(1000,300))
self.setWindowFlags(QtCore.Qt.Window | QtCore.Qt.WindowStaysOnTopHint)
self.input_place_devprod = QtWidgets.QLineEdit()
self.input_place_devmode = QtWidgets.QLineEdit()
self.input_place_devSN = QtWidgets.QLineEdit()
input_submit_btn = QtWidgets.QPushButton('Input')
input_submit_btn.clicked.connect(self.goStartWindow)
input_layout = QtWidgets.QGridLayout(self)
input_layout.addWidget(self.input_place_devprod)
input_layout.addWidget(self.input_place_devmode)
input_layout.addWidget(self.input_place_devSN)
input_layout.addWidget(input_submit_btn)
def goStartWindow(self):
self.parent.label_devprod.setText(self.input_place_devprod.text())
self.parent.label_devmode.setText(self.input_place_devmode.text())
self.parent.label_devSN.setText(self.input_place_devSN.text())
self.hide()
