我应该在 类 或重组程序之间传递 GUI 输入的变量吗?
Should I be passing GUI-entered variables between classes or restructuring program?
用户在 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_())
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",那么您应该使用 run
.
中的 parent()
方法
用户在 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_())
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",那么您应该使用 run
.
parent()
方法