[英]Call a variable from another Class in python
我正在嘗試將 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_())
您可以將parent
發送到對話框,然后您可以訪問主窗口 - self.parent.Value
但是如果你想在對話框__init__
使用它,你應該在__init__
創建具有一些默認值的變量
順便說一句:我們使用CamelCase
名稱作為類 - 即。 QPushButton
和DataAcquisition
, SaveDialog
from PyQt4 import QtCore, QtGui
from PyQt4.Qt import QString, QFileDialog
from threading import Event, Thread
import sys
import time
class DataAcquisition(QtGui.QMainWindow):
def __init__(self, parent=None):
super(DataAcquisition, self).__init__(parent)
self.startButton = QtGui.QPushButton(self, text="Show Dialog")
self.startButton.clicked.connect(self.startButton_clicked)
self.th = Thread(target = self.runValue)
# create variable with default value
self.Value = "Hello World!"
# send parent (self) to Dialog
self.popSave = SaveDialog(self)
def runValue(self):
self.Value = 0
while True:
self.Value += 1
time.sleep(1)
def startButton_clicked(self):
self.th.start()
self.popSave.show()
class SaveDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(SaveDialog, self).__init__(parent)
vbox = QtGui.QVBoxLayout()
# this value is get when Dialog is create, not when is executed `show()`
# so it gets default value "Hello World!"
self.label = QtGui.QLabel(self, text=self.parent().Value)
vbox.addWidget(self.label)
self.button = QtGui.QPushButton(self, text="Update label")
self.button.clicked.connect(self.button_clicked)
vbox.addWidget(self.button)
self.setLayout(vbox)
def button_clicked(self):
# get current value from parent
self.label.setText(str(self.parent().Value))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
MainWindow = DataAcquisition()
MainWindow.show()
sys.exit(app.exec_())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.