【问题标题】:change label from other class in a different file从不同文件中的其他类更改标签
【发布时间】:2018-11-12 17:21:41
【问题描述】:

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

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)

【问题讨论】:

    标签: python python-3.x pyqt pyqt5


    【解决方案1】:

    您使用了错误的工具,例如,您的代码有一个循环导入,导致您的应用程序关闭,因为它等同于 while 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_())
    

    ma​​in_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_())
    

    【讨论】:

    • 我知道我正在创建循环导入并且我遇到了问题。我尝试了几件事,但都没有结果。我从未使用过 QSignal,也不知道它是这个问题的答案。成功了,非常感谢@eyllanesc
    • @filipefraqueiro Qt 最棒的地方之一就是信号。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-07
      • 1970-01-01
      • 2012-12-07
      • 1970-01-01
      • 1970-01-01
      • 2014-01-25
      • 2014-02-20
      相关资源
      最近更新 更多