Окно управления и окно дисплея - PullRequest
0 голосов
/ 19 октября 2018

Мне нужно два окна PyQt для одновременного запуска на машине с несколькими дисплеями: один экран для отображения, а другой для ввода.В следующем примере я пытаюсь создать простое окно с кнопкой и другое окно с меткой.Когда я нажимаю кнопку, текст другой метки окна должен измениться:

import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QApplication, QWidget, QDialog, QInputDialog,QDesktopWidget,QVBoxLayout,QPushButton,QMainWindow,QAction,QFileDialog,QGroupBox,QGridLayout,QLabel


class Control_Pannel(QWidget):

    def __init__(self):
        super().__init__()
        self.title = 'Main Control Pannel'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 400
        self.text = "Display text"
        self.InitializeUI()


    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.inputBox = QGroupBox("Display")
        layout = QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        button = QPushButton('Push here to change text')
        layout.addWidget(button,0,0)
        button.clicked.connect(self.on_click)
        self.inputBox.setLayout(layout)
        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.inputBox)
        self.setLayout(windowLayout)
        self.show()

        app = QApplication(sys.argv)
        ex=InputWindows()
        sys.exit(app.exec_())


    @pyqtSlot()
    def on_click(self):
        InputWindows.text = "Modified text after button push"
        print(InputWindows.text)
        InputWindows.update()
        ##???? here i don't know how to make the changes be reflected in the other window, even if when i print the .text attribute it seems to have changed.



class InputWindows(QDialog):

    def __init__(self):
        super().__init__()
        self.title = 'Display Pannel'
        self.left = 5
        self.top = 5
        self.width = 300
        self.height = 300
        self.text = "Original Text"
        self.InitializeUI()

    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)


        self.createDisplayGridLayout()
        windowLayout = QVBoxLayout()
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)
        self.show()

    def createDisplayGridLayout(self):

        self.horizontalGroupBox = QGroupBox("Grid")
        layout = QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        self.label = QLabel(self.text)
        layout.addWidget(self.label,0,0) 



if __name__=='__main__':
    app=QApplication(sys.argv)
    ex=Control_Pannel()
    sys.exit(app.exec_())

С InputWindows.update() я получаю это first argument of unbound method must have a type QWidget, а если я пытаюсь InputWindows.label.update(), я получаю type object inputwindows has no attribute label

1 Ответ

0 голосов
/ 19 октября 2018

InputWindows - это класс, это абстракция, поэтому обычно вам нужно создать объект, я вас спрашиваю: если у вас n Windows InputWindows, в какое окно вы будете обновлять текст?, Мы бы не знали, так что простоПо логике мы видим, что это неправильно.С другой стороны, рассматривайте каждый класс как черный ящик, где он стимулируется входными данными и получаются выходные данные, в вашем случае Control_Pannel должен иметь выход: новый текст, но этот вывод является асинхронным, поскольку он изменяется и должен использоваться, когдаменяется, и это в Qt является сигналом, поэтому мы должны его создать.С другой стороны, InputWindows должна получить информацию для создания слота, который обновляет текст в QLabel, как показано ниже:

import sys
from PyQt5 import QtCore, QtWidgets


class Control_Pannel(QtWidgets.QWidget):
    sendSignal = QtCore.pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.title = 'Main Control Pannel'
        self.left = 10
        self.top = 10
        self.width = 640
        self.height = 400
        self.text = "Display text"
        self.InitializeUI()

    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.inputBox = QtWidgets.QGroupBox("Display")
        layout = QtWidgets.QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        button = QtWidgets.QPushButton('Push here to change text')
        layout.addWidget(button,0,0)
        button.clicked.connect(self.on_click)
        self.inputBox.setLayout(layout)
        windowLayout = QtWidgets.QVBoxLayout(self)
        windowLayout.addWidget(self.inputBox)

    @QtCore.pyqtSlot()
    def on_click(self):
        text = "Modified text after button push"
        self.sendSignal.emit(text)


class InputWindows(QtWidgets.QDialog):
    def __init__(self):
        super().__init__()
        self.title = 'Display Pannel'
        self.left = 5
        self.top = 5
        self.width = 300
        self.height = 300
        self.InitializeUI()
        self.setText("Original Text")

    @QtCore.pyqtSlot(str)
    def setText(self, text):
        self.label.setText(text)

    def InitializeUI(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.left,self.top,self.width,self.height)
        self.createDisplayGridLayout()
        windowLayout = QtWidgets.QVBoxLayout(self)
        windowLayout.addWidget(self.horizontalGroupBox)
        self.setLayout(windowLayout)

    def createDisplayGridLayout(self):
        self.horizontalGroupBox = QtWidgets.QGroupBox("Grid")
        layout = QtWidgets.QGridLayout()
        layout.setColumnStretch(1, 4)
        layout.setColumnStretch(2, 4)
        self.label = QtWidgets.QLabel()
        layout.addWidget(self.label, 0, 0) 
        self.horizontalGroupBox.setLayout(layout)



if __name__=='__main__':
    app = QtWidgets.QApplication(sys.argv)

    ex1 = Control_Pannel()
    ex1.show()
    ex2 = InputWindows()
    ex2.show()

    ex1.sendSignal.connect(ex2.setText)

    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...