2017-01-22 4 views
-2

Я пытаюсь вызвать переменную из класса MainWindow в другой класс диалогового окна, я знаю, что этот вопрос задавали раньше, но я пробовал все ответы, и я не мог заставить его работать, поскольку я все еще начинаю с python.Вызвать переменную из другого класса в python

Мой код, как показано ниже, (переменная, которую я хочу назвать это self.Value, учитывая, что мне это нужно, чтобы быть в то же время как петля):

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_()) 
+0

'в то время как true' заморозит вашу программу. – furas

+0

отправьте это значение непосредственно в качестве параметра в 'def __init __ (self, parent = None, value):' или try 'parent.Value', но вам нужно отправить родителя в Dialog' self.popSave = saveDialog (self) ' – furas

+0

Вы можете объясните, что вы хотите делать, так как не понимаете свою логику. – eyllanesc

ответ

0

Вы можете отправить parent в диалоговое окно, а затем у вас есть доступ к главному окну - self.parent.Value

Но вы должны создать переменную с некоторым значением по умолчанию в __init__, если вы хотите использовать его в диалоговом __init__

BTW: мы используем имена 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_()) 
+0

Спасибо за ваш ответ @furas, но не могли бы вы сделать то же самое с моим исходным кодом? Поскольку я уже создал свои виджеты и кнопки. –

+0

@ M.Lagha вы можете сделать это сами - вам нужно 'SaveDialog (self)', 'self.parent = parent' и' self.parent.Value' - вот и все. – furas

+0

@ M.Lagha - я проверил, вам может понадобиться еще меньше, потому что у него есть метод 'self.parent()' - поэтому вам нужно отправить родителя ('self') в диалог' self.popSave = saveDialog (self) 'и позже вы можете использовать 'self.parent(). Value' – furas

Смежные вопросы