'Problem to reload a loop with Qdial, signal & subprocess

I am trying to record and use data with a Qdial. For the recording every thing seems to be fine, but in order to use this data in while loop I have to reload the while loop. When I do so with signal and a subprocess, the loop seems to use every data recorded, another problem is that the loop don’t stop at the end of the process. I have no doubt I am using the wrong method. Sorry for my bad English, and thank you very much for your help.

So I am using 3 scripts: Qdial.py, Data.py, Loop.py. The Data.py is an accumulation of data, here I use just one:

A1 = 10

The Loop.py is in deed my main script, here I resume:

import time
from Data import *

def loop():
    while True:
        print('A1 = ', A1)
        time.sleep(0.1)

loop()
    

[edit] Instead of this Loop.py I will not use from Data import *, but this one witch don't raise errors (but there is always the problem of the continuous looping after the exit on Qdial.py):

import time

def loop():
    with open('/address/Data.py', 'r') as file:
        lines = file.readlines()
        A1 = lines[0]
        A1 = float(A1[4:-1])
    print('A1 = ', A1)

while True:
    loop()
    time.sleep(0.09)

[/edit]

The Qdial.py is a common one, with the signal and a subprocess that raise false values:

from PyQt5 import QtWidgets
from PyQt5.QtWidgets import *
from Data import *
import sys, signal, subprocess, time

[edit] This line is no longer needed, and cause an endless loop.

I launch Loop.py with a subprocess:

proc = subprocess.Popen(['python3', '/address/Loop.py'])

[/edit]

Then it’s the writing for the Qdial:

class Window(QWidget):
    def __init__(self):
        super().__init__()
        self.setGeometry(300, 300, 150, 150)
        vbox = QVBoxLayout()
        self.a1 = QDial(self)
        self.value = int(A1)
        self.a1.setValue(self.value)
        self.value = self.a1.value()
        self.lab1 = QtWidgets.QLabel(self)
        self.lab1.setText('A1 = ' + str(A1) + 's')
        self.a1.valueChanged.connect(self.dial)
        vbox.addWidget(self.a1)
        vbox.addWidget(self.lab1)
        self.setLayout(vbox)
        self.show()
    
    def dial(self):
        val1 = self.a1.value()
        self.lab1.setText('A1 = ' + str(val1) + 's')
        with open('/address/data.py', 'r') as file:
            lines = file.readlines()
            lines[0] = 'A1 = ' + str(val1) + '\n'
        with open('/address/data.py', 'w') as file:
            for line in lines:
                file.write(line)
        file.close()

[edit] Thoses lines are no longer define or needed.

Here I use signal and subprocess in order to reload the data in Loop.py:

        proc.send_signal(signal.SIGINT)
        subprocess.Popen(['python3', '/address/Loop.py'])

[/edit]

And I finish:

app = QApplication(sys.argv)
window = Window()
sys.exit(app.exec_())

[edit] A solution to escape the endless loop was to run both scripts (Qdial.py & Loop.py) as subprocess from a main script and use Popen.wait(), Main.py:

import subprocess, signal

Qd = subprocess.Popen(['python3', '/address/Qdial.py'])
Lo = subprocess.Popen(['python3', '/address/Loop.py'])

if Qd.wait() != None:
    Lo.send_signal(signal.SIGINT)

[/edit]

Of course I don’t understand what is wrong, sorry for the length of this post...Thanks again.



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source