Передача значения переменной в другой класс PyQt5
Нужно передать значение введённое пользователем в GUI в другой класс.
Не получается это сделать, помогите пожалуйста.
Всё лишнее из кода удалил.
import sys
import PyQt5.QtCore
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import QThread, pyqtSignal
class MyApp(QtCore.QThread):
def __init__(self, *args, **kwargs):
super(MyApp, self).__init__(*args, **kwargs)
self.Latency = 0.10 # Сюда нужно передать значение
def run(self):
print(self.Latency)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi()
def setupUi(self):
self.setWindowTitle("Application")
self.resize(400, 200)
self.line_set_t1 = QtWidgets.QLineEdit("0.1", self)
self.line_set_t1.setGeometry(QtCore.QRect(25, 70, 40, 22))
self.btn_set_t1 = QtWidgets.QPushButton("Apply", self)
self.btn_set_t1.setGeometry(QtCore.QRect(70, 70, 40, 22))
self.btn_set_t1.setEnabled(True)
self.btn_set_t1.clicked.connect(lambda: self.change_latency(self.line_set_t1.text()))
def change_latency(self, text):
self.Latency = text # Это значение нужно передать
self.ma = MyApp(self)
self.ma.start()
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Ответы (2 шт):
Автор решения: Vestalt
→ Ссылка
Наиболее правильный вариант, который не будет нарушать общий вид параметров инициализатора QtCore.QThread, - это использовать первый, обязательный аргумент (родитель класса MyApp, экземпляр MainWindow). Через него доступны все атрибуты и методы MainWindow.
Чтобы это сделать, добавьте сохранение параметра Latency через родителя:
# класс MyApp, метод __init__
def __init__(self, *args, **kwargs):
super(MyApp, self).__init__(*args, **kwargs)
parent = args[0] # Здесь находится экземпляр MainWindow
self.Latency = parent.get_latency()
И получение параметра через метод:
# класс MainWindow
def get_latency(self):
return self.Latency
Итоговый код:
import sys
from PyQt5 import QtCore, QtWidgets
class MyApp(QtCore.QThread):
def __init__(self, *args, **kwargs):
super(MyApp, self).__init__(*args, **kwargs)
parent = args[0]
self.Latency = parent.get_latency()
def run(self):
print(self.Latency)
class MainWindow(QtWidgets.QMainWindow):
def __init__(self, *args, **kwargs):
super(MainWindow, self).__init__(*args, **kwargs)
self.setupUi()
def setupUi(self):
self.setWindowTitle("Application")
self.resize(400, 200)
self.line_set_t1 = QtWidgets.QLineEdit("0.1", self)
self.line_set_t1.setGeometry(QtCore.QRect(25, 70, 40, 22))
self.btn_set_t1 = QtWidgets.QPushButton("Apply", self)
self.btn_set_t1.setGeometry(QtCore.QRect(70, 70, 40, 22))
self.btn_set_t1.setEnabled(True)
self.btn_set_t1.clicked.connect(
lambda: self.change_latency(self.line_set_t1.text()))
def change_latency(self, text):
self.Latency = text
self.ma = MyApp(self)
self.ma.start()
def get_latency(self):
return self.Latency
if __name__ == "__main__":
app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.show()
sys.exit(app.exec_())
Автор решения: S. Nick
→ Ссылка
Спросите если что-то не понятно.
import sys
from PyQt5.QtWidgets import QMainWindow, QLineEdit, QPushButton, \
QApplication, QWidget
from PyQt5.QtCore import QThread, QRect
class Thread(QThread):
def __init__(self, latency): # <----
super().__init__()
self.latency = latency # <----
def run(self):
print(f'\nself.latency = {self.latency}') # <----
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.centralWidget = QWidget() # !!!
self.setCentralWidget(self.centralWidget) # !!!
self.line_set_t1 = QLineEdit("0.1", self.centralWidget)
self.line_set_t1.setGeometry(QRect(25, 70, 40, 22))
self.btn_set_t1 = QPushButton("Apply", self.centralWidget)
self.btn_set_t1.setGeometry(QRect(70, 70, 40, 22))
self.btn_set_t1.clicked.connect(self.change_latency)
def change_latency(self):
latency = self.line_set_t1.text() # <----
self.thread = Thread(latency) # <----
self.thread.start()
if __name__ == "__main__":
app = QApplication(sys.argv)
w = MainWindow()
w.setWindowTitle("Application")
w.resize(400, 200)
w.show()
sys.exit(app.exec_())
