【问题标题】:Call a variable from another Class in python从python中的另一个类调用变量
【发布时间】: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


【解决方案1】:

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

但如果你想在对话框__init__ 中使用它,你应该在__init__ 中创建具有一些默认值的变量

顺便说一句:我们为类使用CamelCase 名称 - 即。 QPushButtonDataAcquisition, 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_())

【讨论】:

  • 感谢您的回答@furas,但您能否在我的原始代码上做同样的事情?因为我已经形成了我的小部件和按钮。
  • @M.Lagha 你可以自己做 - 你需要 SaveDialog(self)self.parent = parentself.parent.Value - 仅此而已。
  • @M.Lagha - 我检查过,你可能需要更少,因为它有方法self.parent() - 所以你必须将父级(self)发送到对话框self.popSave = saveDialog(self),然后你可以使用self.parent().Value
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多