【发布时间】:2017-01-22 21:03:56
【问题描述】:
我正在尝试将变量从 MainWindow 类调用到另一个 Dialog 类,我知道之前有人问过这个问题,但我尝试了所有给定的答案,但由于我还是初学者,我无法让它工作用python。
我的代码如下,(我想调用的变量是self.Value,考虑到我需要它在同一个While循环中):
from PyQt4 import QtCore, QtGui
import sys
import time
from threading import Event, Thread
from mainwindow import Ui_MainWindow
from savedialog import Ui_saveDialog
from plot import Plot
from PyQt4.Qt import QString, QFileDialog
from pylab import *
import threading
#DH11 tempSensor Library
import Adafruit_DHT
#Library to find FFT and FFTshift
from scipy.fftpack import fft, fftshift
from numpy import linspace
#Library to find Max and Min
from operator import itemgetter
class dataAcquisition(QtGui.QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(dataAcquisition, self).__init__(parent)
#threading.Thread.__init__(self)
self.setupUi(self)
self.startButton.clicked.connect(self.startButton_clicked)
self.th = Thread(target = self.runValue)
self.popSave = saveDialog()
self.status = False
def runValue(self):
Fs = 8000
N = 256
f = linspace(-Fs/2, Fs/2, N)
X = []
Y = []
MaxMin = []
self.i = 0.0
ax1 = subplot(2, 1, 1)
Line1 = plot(0,0,'r-')[0]
ax2 = subplot(2, 1, 2)
Line2 = plot(f,0*f,'r-')[0]
self.status = True
while (self.status):
self.Value = Adafruit_DHT.read_retry(11, 4)[1]
X.append(self.i)
Y.append(self.Value)
FFT = log10(abs(fft(Y, N)))
FFT = fftshift(FFT)
Line1.set_xdata(X)
Line1.set_ydata(Y)
ax1.relim()
ax1.autoscale_view()
Line2.set_ydata(FFT)
ax2.relim()
ax2.autoscale_view()
for k in Y:
for MM in range(int(k)):
MaxMin.append(MM)
self.MaxValue = max(MaxMin)
self.MinValue = min(MaxMin)
self.i += 0.10
pause(0.01)
self.lcdNumber_value.display(self.Value)
self.lcdNumber_MaxValue.display(self.MaxValue)
self.lcdNumber_MinValue.display(self.MinValue)
def startButton_clicked(self):
self.th.start()
self.popSave.show()
class saveDialog(QtGui.QDialog, Ui_saveDialog):
def __init__(self, parent=None):
super(saveDialog, self).__init__(parent)
flags = QtCore.Qt.Drawer | QtCore.Qt.WindowStaysOnTopHint
self.setWindowFlags(flags)
self.setupUi(self)
self.checkBox.stateChanged.connect(self.Unlimited_NOVs)
self.saveOkButton.clicked.connect(self.acceptOKButtonClicked)
self.NOVs = 0.0
self.spinBox.valueChanged.connect(self.spinBox_value_changed)
def Unlimited_NOVs (self, state):
if state == QtCore.Qt.Checked:
self.NOVs = 5
def spinBox_value_changed (self):
self.NOVs = self.spinBox.value()
def acceptOKButtonClicked(self):
#Here I want to call self.Value
i = 1
while True:
Name = QtGui.QFileDialog.getSaveFileName(self, 'Save File', 'sessionData.txt')
self.fName = open(Name %i ,"w")
i += 1
c = 1
while c <= self.NOVs:
c += 1
self.fName.write(str(self.Value))
self.fName.write("\n")
else:
self.fName.close()
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
MainWindow = dataAcquisition()
MainWindow.show()
sys.exit(app.exec_())
【问题讨论】:
-
while True将冻结您的程序。 -
直接将此值作为
def __init__(self, parent=None, value):中的参数发送或尝试parent.Value但您必须将父级发送到对话框self.popSave = saveDialog(self) -
你可以解释你想做什么,因为你不明白你的逻辑
-
顺便说一句:如果你运行
thread,那么使用queue将数据从thread发送到主线程是安全的。 -
顺便说一句:更好地为您的问题创建最小的工作代码 - 这样每个人都可以运行它。
标签: python qt class pyqt class-variables