在其他文件中更改其他班级的标签

时间:2018-11-12 17:21:41

标签: python python-3.x pyqt pyqt5

我正在创建一个应用程序,其中有一个带有标签的主窗口,然后是另一个文件中的停靠小部件。我想从停靠的小部件上的按钮更改主窗口标签。我尝试导入主窗口文件,但随后无法访问标签。而且,我还尝试在主窗口中调用一个函数来更改标签,但随后标签不会更改。 这是代码:

main_window.py:

import results_window

class MainWindow(QMainWindow):

    def __init__(self):
        super(MainWindow, self).__init__()

        self.define_main_windows()

        self.create_dock_widgets()

    def define_main_windows(self):
        # Define de Main window properties
        self.setMinimumSize(QSize(300, 100))    
        self.setWindowTitle("Python SkyLibris") 
        self.setWindowIcon(QtGui.QIcon("skylibris_icon.png"))
        self.setStyleSheet("QMainWindow {background: 'white';}")

        self.top = 50
        self.left = 0
        self.width = 1300
        self.height = 400
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.result = QLabel("result:")
        self.setCentralWidget(self.result)


    def create_dock_widgets(self):
        # Create dock widgets
        self.results_window = results_window.results_window()
        self.resultsWindowDock = QDockWidget("Results Viewer", self)
        self.resultsWindowDock.setWidget(self.results_window )
        self.resultsWindowDock.setFloating(False)
        self.resultsWindowDock.setVisible(True)
        self.addDockWidget(Qt.LeftDockWidgetArea, self.resultsWindowDock)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('Fusion')
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())

results_window.py:

import main_window

class results_window(QWidget):

    def __init__(self):
        super(results_window, self).__init__()
        print("init")

        self.label = QLabel()
        self.value = QLineEdit()

        self.bt = QPushButton("Click")
        self.bt.clicked.connect(self.clickMethod)


        self.main_layout = QVBoxLayout()
        self.main_layout.addWidget(self.label)
        self.main_layout.addWidget(self.value)
        self.main_layout.addWidget(self.bt)

        self.setLayout(self.main_layout)

    def clickMethod(self):
        print(self.value.text())
        text = self.value.text()
        main_window.result.setText(text)

2 个答案:

答案 0 :(得分:0)

您使用了错误的工具,例如您的代码具有循环导入功能,因为它等效于一会儿True,因此导致您的应用程序关闭。

在Qt中,信号和插槽用于异步共享数据,并且有助于在类之间不存在耦合。在您的情况下,Results_Window必须具有将该信息传输到MainWindow的信号,该信号必须在clickMethod中发出。

results_window.py

from PyQt5 import QtCore, QtWidgets

class Results_Window(QtWidgets.QWidget):
    resultChanged = QtCore.pyqtSignal(str)

    def __init__(self):
        super(Results_Window, self).__init__()
        print("init")

        self.label = QtWidgets.QLabel()
        self.value = QtWidgets.QLineEdit()

        self.bt = QtWidgets.QPushButton("Click")
        self.bt.clicked.connect(self.clickMethod)

        main_layout = QtWidgets.QVBoxLayout(self)
        main_layout.addWidget(self.label)
        main_layout.addWidget(self.value)
        main_layout.addWidget(self.bt)

    @QtCore.pyqtSlot()
    def clickMethod(self):
        text = self.value.text()
        self.resultChanged.emit(text)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('Fusion')
    w = Results_Window()
    w.show()
    sys.exit(app.exec_())

main_window.py

from PyQt5 import QtCore, QtGui, QtWidgets
import results_window

class MainWindow(QtWidgets.QMainWindow):
    def __init__(self):
        super(MainWindow, self).__init__()
        self.define_main_windows()
        self.create_dock_widgets()

    def define_main_windows(self):
        self.setMinimumSize(QtCore.QSize(300, 100))    
        self.setWindowTitle("Python SkyLibris") 
        self.setWindowIcon(QtGui.QIcon("skylibris_icon.png"))
        self.setStyleSheet("QMainWindow {background: 'white';}")
        top, left, width, height = 50, 0, 1300, 400
        self.setGeometry(left, top, width, height)
        self.result = QtWidgets.QLabel("result:")
        self.setCentralWidget(self.result)

    def create_dock_widgets(self):
        self.results_window = results_window.Results_Window()
        self.results_window.resultChanged.connect(self.result.setText)
        self.resultsWindowDock = QtWidgets.QDockWidget("Results Viewer", self)
        self.resultsWindowDock.setWidget(self.results_window )
        self.resultsWindowDock.setFloating(False)
        self.resultsWindowDock.setVisible(True)
        self.addDockWidget(QtCore.Qt.LeftDockWidgetArea, self.resultsWindowDock)

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle('Fusion')
    mainWin = MainWindow()
    mainWin.show()
    sys.exit(app.exec_())

答案 1 :(得分:0)

我在PyQT5中遇到了类似的问题,无法访问和设置局部变量。经过大量的努力,我发现写文件和从文件读取是最好的解决方案。只需将所需的输出写入文件并从其他文件访问相同的信息。很棒!