Найти - Пользователи
Полная версия: QSpinBox Qt5 передача значения в питон
Начало » GUI » QSpinBox Qt5 передача значения в питон
1 2 3 4 5 6
Venus
PEHDOM
Venus синдром жирафа? я ведь писал парй постов выше
понятно, извини за тугодумость, значит в сторону мультипроцессора смотреть надо
PEHDOM
Venus
значит в сторону мультипроцессора смотреть надо
Это вовсе необязательно, есть куча простых и не очень способов остановить поток, они уже не раз обсосаны со всех сторон на стековерфлов и подобных ресурсах.
https://stackoverflow.com/questions/18018033/how-to-stop-a-looping-thread-in-python
Весь вопрос в архитектуре.
Venus
PEHDOM
Venus синдром жирафа? я ведь писал парй постов выше
и благодарю за проявленное терпение
Venus
PEHDOM
а что произойдёт с запущеным дефом из внешнего модуля?он тоже остановится и если так то его останов процесса в деф стоп мэйна ставить(или правильно вызывать из дефа стоп мэйна)?
PEHDOM
Venus
а что произойдёт с запущеным дефом из внешнего модуля?он тоже остановится и если так то его останов процесса в деф стоп мэйна ставить(или правильно вызывать из дефа стоп мэйна)?
Э-э-э вот тут я совсем потерялся, чет я совсем ничего не понял.
Venus
PEHDOM
вот что откопал на просторах, норм?
Чтобы упростить создание потоков-функций можно сделать заготовку:

 # Импортируем модуль threading для работы с потоками
import threading
# Отдельная функция-заготовка для вынесения 
# последующих функций в отдельный поток
def thread(my_func):
    def wrapper(*args, **kwargs):
        my_thread = threading.Thread(target=my_func, args=args, kwargs=kwargs)
        my_thread.start()
    return wrapper
# Теперь чтобы запустить любую функцию в отдельный поток
# достаточно над ее именем написать @thread
@thread
def go(nomer):
    # В этой функции будем печатать числа от 1 до 199
    for x in range(1, 200):
        print('Поток номер '+str(nomer)+' число '+str(x)+'\n')
# Запускаем функцию три раза и получаем три потока 
go(1)
go(2)
go(3)


Мы описали функцию-заготовку для создания потока и назвали ее thread. Теперь, если мы будем писать перед любой функцией строчку @thread то эта функция станет выполняться в отдельном потоке. Это очень удобно. Всего лишь @thread над именем функции и вот она уже исполняется в новом потоке.
Venus
PEHDOM
попробовал что вы показали, тестить в хвост и гриву послезавтра буду, гуи не подвисаетт!надеюсь для моего кода сойдёт
PEHDOM
Venus
вот что откопал на просторах, норм?
ИМХО ты пытаешься бежат впереди паровоза, то что ты “откопал” называется декоратор.
Venus
PEHDOM
терь самое интересное )) а как остановить скрипт
сделал так
 from PyQt5 import QtWidgets
from threading import Thread
from samplestrorint import *
import sys
import strorint1
def log_uncaught_exceptions(ex_cls, ex, tb):
    text = '{}: {}:\n'.format(ex_cls.__name__, ex)
    import traceback
    text += ''.join(traceback.format_tb(tb))
    print(text)
    QMessageBox.critical(None, 'Error', text)
    quit()
    
sys.excepthook = log_uncaught_exceptions
class MainWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        QtWidgets.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        self.statusBar().showMessage('Stop')
        self.ui.pushButton.clicked.connect(self.Start)
        self.ui.pushButton_2.clicked.connect(self.Stop)
        self.ui.pushButton.clicked.connect(lambda: self.statusBar().showMessage('запущен'))
        self.ui.pushButton_2.clicked.connect(lambda: self.statusBar().showMessage('остановлен'))
                
    def Start(self):
        
        strorint1.n = 1   [b]<-- добавил[/b]
        r = self.ui.textEdit.toPlainText()
        strorint1.r = int(r)
        self.sec_thread = Thread(target = strorint1.strorint)
        self.sec_thread.start()
    def Stop(self):
        strorint1.n = 0   [b]<-- добавил[/b]
        #n = self.ui.textEdit.toPlainText()
        #strorint1.n = int(r)
        strorint1.stop()
        
        
if __name__=="__main__":
    app = QtWidgets.QApplication(sys.argv)
    myapp = MainWindow()
    myapp.show()
    sys.exit(app.exec_())

и во внешнем модуле
 # -*- coding: utf-8 -*-
import time
import sys
import os
r = ('')
n = ()
def strorint():
    if n == 1:
        time.sleep(r)
        print(r, type(r))
        strorint()
    else:
        stop()
def stop():
    print("Перезапуск",r,type(r))
    time.sleep(r)

стал останавливаться но через цикл, ааа можето то что во время цикла нажал стоп он и вывел?
4 <class ‘int’> <– start
4 <class ‘int’>
Перезапуск 4 <class ‘int’> <– нажал стоп
4 <class ‘int’>
Перезапуск 4 <class ‘int’>
PEHDOM
Venus
стал останавливаться но через цикл, ааа можето то что во время цикла нажал стоп он и вывел?
предполагаю это потому что ты нажал стоп во время цикла, в это время поток спал “time.sleep(r)”, поэтому выполнилось strorint1.stop() из ГУИ, потом поток проснулся напечатал “r, type(r)”, и вызвал рекурсивно себяже, там он увидил что n ==0, и вызвал stop() еще раз.
Во первых, ты делаешь два раза одну и туже работу, у тебя вызываеться stop() как из ГУИ так и из цикла. достаточно один раз .
Во вторых, избався наконец от рекурсии, я так понимаю она тебе нафик не нужна.

В третиьх, ты делаешь в ГУИ то что не нужно делать там, strorint1.n = 1 и strorint1.n = 0 там вообще ненужно, это нужно вынести в strorint1, както так:
  # -*- coding: utf-8 -*-
import time
r = ''
flag = True
def strorint():
    while flag:
        print(r, type(r))
        time.sleep(r)
def start():
    global flag
    flag = True
    strorint()
def stop():
    global flag
    flag = False
    print("Перезапуск",r,type(r))
    time.sleep(r)
и соотвевенно в ГУИ
 ....
    def Start(self):
        r = self.ui.textEdit.toPlainText()
        strorint1.r = int(r)
        sec_thread = Thread(target = strorint1.start)
        sec_thread.start()
    def Stop(self):
        strorint1.stop()
...
Тут мы используем глобальные переменные. Как для обучения допустимо, но вообще не есть хорошо. Нужно или заворачивать в класс все, или передавать через специальный threading.Event()(я уже приводил пример на странице 4).


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB