Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中从另一个类调用变量_Python_Qt_Class_Pyqt_Class Variables - Fatal编程技术网

在python中从另一个类调用变量

在python中从另一个类调用变量,python,qt,class,pyqt,class-variables,Python,Qt,Class,Pyqt,Class Variables,我正在尝试将一个变量从一个主窗口类调用到另一个对话框类,我知道以前有人问过这个问题,但我尝试了所有给定的答案,但我无法使它工作,因为我仍然是python初学者 我的代码如下所示(我想调用的变量是self.Value,考虑到我需要它位于同一While循环中): 从PyQt4导入QtCore,QtGui 导入系统 导入时间 从线程导入事件,线程 从主窗口导入Ui\u主窗口 从savedialog导入Ui\u savedialog 从绘图导入绘图 从PyQt4.Qt导入QString,QFileDia

我正在尝试将一个变量从一个主窗口类调用到另一个对话框类,我知道以前有人问过这个问题,但我尝试了所有给定的答案,但我无法使它工作,因为我仍然是python初学者

我的代码如下所示(我想调用的变量是
self.Value
,考虑到我需要它位于同一While循环中):

从PyQt4导入QtCore,QtGui
导入系统
导入时间
从线程导入事件,线程
从主窗口导入Ui\u主窗口
从savedialog导入Ui\u savedialog
从绘图导入绘图
从PyQt4.Qt导入QString,QFileDialog
从派拉布进口*
导入线程
#DH11温度传感器库
进口Adafruit_DHT
#用于查找FFT和FFTshift的库
从scipy.fftpack导入fft,fftshift
从numpy导入linspace
#要查找最大值和最小值的库
从运算符导入itemgetter
类数据采集(QtGui.QMainWindow、Ui\U MainWindow):
def uuu init uuu(self,parent=None):
超级(数据采集,自我)。\uuuuu初始化\uuuuuuu(父级)
#threading.Thread.\uuuuu init\uuuuuu(自)
self.setupUi(self)
self.startButton.clicked.connect(self.startButton_clicked)
self.th=线程(目标=self.runValue)
self.popSave=saveDialog()
self.status=False
def运行值(自身):
Fs=8000
N=256
f=linspace(-Fs/2,Fs/2,N)
X=[]
Y=[]
MaxMin=[]
self.i=0.0
ax1=子批次(2,1,1)
第1行=绘图(0,0,'r-')[0]
ax2=子批次(2,1,2)
第2行=绘图(f,0*f,'r-')[0]
self.status=True
while(自我状态):
self.Value=Adafruit\u DHT.read\u retry(11,4)[1]
X.append(self.i)
Y.append(self.Value)
FFT=log10(abs(FFT(Y,N)))
FFT=FFT移位(FFT)
第1行。设置扩展数据(X)
第1行。设置数据(Y)
ax1.relim()
ax1.自动缩放视图()
第2行设置数据(FFT)
ax2.relim()
ax2.自动缩放视图()
对于k in Y:
对于范围内的毫米(int(k)):
MaxMin.append(MM)
self.MaxValue=max(MaxMin)
self.MinValue=min(MaxMin)
自我保护指数+=0.10
暂停(0.01)
self.lcdNumber\u值显示(self.value)
self.lcdNumber\u MaxValue.display(self.MaxValue)
self.lcdNumber\u MinValue.display(self.MinValue)
def startButton_单击(自):
self.th.start()
self.popSave.show()
类saveDialog(QtGui.QDialog,Ui\u saveDialog):
def uuu init uuu(self,parent=None):
超级(保存对话框,自我)。\uuuu初始化\uuuu(父级)
flags=QtCore.Qt.Drawer | QtCore.Qt.WindowStaysOnTopHint
self.setWindowFlags(标志)
self.setupUi(self)
self.checkBox.stateChanged.connect(self.Unlimited\u NOVs)
self.saveOkButton.clicked.connect(self.acceptokbutton单击)
self.NOVs=0.0
self.spinBox.valueChanged.connect(self.spinBox\u value\u changed)
def Unlimited_NOVs(自身、状态):
如果state==QtCore.Qt.Checked:
self.NOVs=5
def spinBox_值_已更改(自身):
self.NOVs=self.spinBox.value()
def acceptOKButtonClicked(自):
#这里我想称之为self.Value
i=1
尽管如此:
Name=QtGui.QFileDialog.getSaveFileName(self,'Save File','sessionData.txt')
self.fName=打开(名称%i,“w”)
i+=1
c=1

当c时,您可以将
parent
发送到对话框,然后您可以访问主窗口-
self.parent.Value

但是,如果您想在对话框
\uuuuu init\uuu
中使用该变量,则应在
\uuuuu init\uuuu
中创建具有某些默认值的变量

顺便说一句:我们为类使用
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_())

为True时
将冻结您的程序。直接将此值作为参数发送到
def\uuu init\uuuu(self,parent=None,value):
或尝试
parent.value
但您必须将parent发送到Dialog
self.popSave=saveDialog(self)
你可以解释你想做什么,因为你不理解你的逻辑。BTW:如果你运行
线程
,那么使用
队列
将数据从
线程
发送到主线程是安全的。BTW:最好针对你的问题创建最小的工作代码-这样每个人都可以运行它。谢谢你的回答@furas,但是你能在我的原始代码上做同样的事情吗?因为我已经形成了我的小部件和按钮。@M.Lagha你可以自己做-你需要
SaveDialog(self)
self.parent=parent
self.parent.Value
-就这些。@M.Lagha-我检查过了,你需要的更少,因为它有方法
self.parent()
-所以你必须发送parent(
self
)要创建对话框
self.popSave=saveDialog(self)
以及更高版本,您可以使用
self.parent().Value
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_())