【问题标题】:Should I be passing GUI-entered variables between classes or restructuring program?我应该在类或重组程序之间传递 GUI 输入的变量吗?
【发布时间】:2016-01-19 18:48:40
【问题描述】:

用户在MyWidget 屏幕上使用行编辑输入值,然后按下 Enter 按钮。这将打开MyDialog 屏幕,按下运行按钮时将在该屏幕上绘制数据。如何使MyDialog 中的run 可以访问行编辑数据以进行绘图?或者,有没有更好的方法不需要在类之间传递变量?我的程序基于this 答案。

from PyQt4 import QtCore, QtGui, uic
#  Import Qt widgets
from matplotlib.backends.backend_qt4agg \
    import FigureCanvasQTAgg as FigureCanvas
from matplotlib.backends.backend_qt4agg \
    import NavigationToolbar2QT as NavigationToolbar
from matplotlib.figure import Figure

GUI_FILE = "Minimal_UI.ui"  # GUI with line edit and 'enter' button
form_class = uic.loadUiType(GUI_FILE)[0]


class MyWidget(QtGui.QWidget, form_class):
    def __init__(self, parent=None):
        super(MyWidget, self).__init__(parent)

        self.setupUi(self)
        self.pushButton_Enter.clicked.connect(self.on_pushButton_clicked)
        self.dialogTextBrowser = MyDialog(self)

    @QtCore.pyqtSlot()
    def on_pushButton_clicked(self):
        # I'd like to be able to pass Temp_0 to the run method
        self.Temp_0 = self.lineEdit_Temp_0.text()
        self.dialogTextBrowser.exec_()


class MyDialog(QtGui.QDialog):
    def __init__(self, parent=None):
        super(MyDialog, self).__init__(parent)

        self.fig = Figure()
        self.canvas = FigureCanvas(self.fig)
        self.toolbar = NavigationToolbar(self.canvas, self)

        self.run_button = QtGui.QPushButton('Run')
        self.run_button.clicked.connect(self.run)
        self.stop_button = QtGui.QPushButton('Stop')
        self.stop_button.clicked.connect(self.stop)

        layout = QtGui.QVBoxLayout()
        #  Widgets are stacked in the order they are added
        layout.addWidget(self.toolbar)
        layout.addWidget(self.canvas)
        layout.addWidget(self.run_button)
        layout.addWidget(self.stop_button)

        self.setLayout(layout)

    def run(self):
        # Create axes
        ax = self.fig.add_subplot(111)
        # Discard the old graphs
        ax.hold(False)
        # Plot data--I'd like to be able to use line edit data here
        ax.plot([1, 2, 3, 4], '*-')
        # Refresh canvas
        self.canvas.draw()

    def stop(self):
        print 'Stop Pressed'

if __name__ == "__main__":
    import sys

    app = QtGui.QApplication(sys.argv)
    app.setApplicationName('MyWidget')

    main = MyWidget()
    main.show()

    sys.exit(app.exec_())

【问题讨论】:

    标签: python-2.7 matplotlib pyqt4


    【解决方案1】:

    MyDialog 构造函数有一个属性parent
    使用下面的代码,您可以创建一个 MyDialog 的实例,并将 MyWidget 作为父级:

    self.dialogTextBrowser = MyDialog(self)
    

    小部件从其父级访问数据的两种方式:

    • __init__函数中使用parent属性

       self.lineEditData=parent.lineEdit.text()
      
    • 在任何地方使用parent() 方法

       def run(self):
           self.lineEditData=self.parent().lineEdit.text()
      

    我说这取决于您打算如何使用该应用程序。如果您想在单击后填充 lineEdit 并获得绘图,我将使用 parent 属性或直接在 __init__ 函数中传递数据。
    但是如果用户可以回到lineEdit,改变一些东西,然后再次点击“运行”,那么你应该使用run中的parent()方法。

    【讨论】:

    • 感谢您的回复。在 run 中使用 parent() 方法是可行的。请澄清您所说的“使用父属性或直接在 init 函数中传递数据”的意思,因为我无法让它工作,并且根据您的建议,这些技术更多适合我的应用。
    • 我会用 self.dialogTextBrowser = MyDialog(self.lineEdit.text(),self) 初始化 MyDialog,并使用构造函数 __init__(self, data, parent=None)。这样,对话框是专门为“数据”构建的,没有它就无法存在。但这实际上只是个人喜好,对我来说似乎更合乎逻辑。使用parent() 也非常合适。
    猜你喜欢
    • 1970-01-01
    • 2013-03-27
    • 2023-02-22
    • 1970-01-01
    • 2015-04-03
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-10-11
    相关资源
    最近更新 更多