StellandYT
@StellandYT
Программист Python

Как остановить цикл?

Всем шалом
Есть некий код, написанный с помощью библеотеки PyQt...
class whoLike(QtWidgets.QMainWindow, who_likes.Ui_Form):
    def __init__(self):
        super().__init__()
        self.setupUi(self)
        self.pushButton.clicked.connect(self.whoLiked)
        self.pushButton_2.clicked.connect(self.exitApp)
        self.listWidget.itemClicked.connect(self.selectionChanged)

    def selectionChanged(self, item):
        a = ("{}".format(item.text()))
        print(a)
        webbrowser.open(a)

    def exitApp(self):
        self.close()

    def whoLiked(self):
        self.listWidget.clear()

        response = requests.get(
            'https://api.vk.com/method/friends.get?access_token=%s&v=%s&order=name' % (access_token, version))
        data = response.json()
        print(data)

        data_fil = data['response']["items"]
        len_check = len(data_fil)
        print(data_fil)

        mass_likes = []
        i = 0
        check_x = 0

        for filter_data in data_fil:
            response_posts = requests.get('https://api.vk.com/method/wall.get?access_token=%s&v=%s&owner_id=%s' % (
            access_token, version, filter_data))
            data_posts = response_posts.json()

            check_x += 1
            self.label_5.setText(str(check_x) + '/' + str(len_check))
            i += 1

            if i >= 7:
                # Ждем 3 секунды
                loop = QEventLoop()
                QTimer.singleShot(3000, loop.quit)
                loop.exec()
                i = 0

            else:
                try:
                    post = data_posts['response']['items']
                    print(post)
                    for posts in post:
                        likes_posts = posts['likes']['user_likes']
                        if likes_posts == 1:
                            user_id = posts['owner_id']
                            id_post = posts['id']
                            url = 'https://vk.com/id%s?w=wall%s_%s' % (user_id, user_id, id_post)
                            mass_likes.append(url)
                            self.listWidget.addItem(url)
                            print(url)
                        else:
                            continue
                except:
                    print('User was deleted or banned')

Есть цикл " for filter_data in data_fil", нужно чтоб по нажатию кнопки "pushButton_2" останавливался цикл. Как это реализовать?
  • Вопрос задан
  • 148 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
У вас такой длинный цикл. что надо кнопкой останавливать -- переделывайте. Такого в приложении быть не должно.
Длительные операции нужно делать кусочками и асинхронно.
Сформируйте очередь задач. Каждая задача должна быть мелкой и атомарной.
У вас тут, судя по всему, сплошная архитектурная лапша в коде.
Не ясно как вы этот код запускаете, не ясно что у вас вокруг него.
Ясно только, что вы тут намудрили какой-то витиеватый костыль и пытаетесь решить стандартную задачу каким-то кустарным дендрофекальным методом.

Из всего могу срезюмировать.
  • Выделите и изолируйте модель задачи.
  • Накапливайте их в очереди.
  • Заполняйте очередь когда это требуется. Вытаскивайте и обрабатывайте отдельные задачи когда это возможно, но асинхронно.

Более подробно можно подумать, если объясните чего пытаетесь тут добиться.
Если попробовать играть по вашим правилам и дать ответ на именно ваш не очень правильный вопрос, то нужно обрабатывать интерфейс в отдельном треде, между тредами поднять мьютекс и по его состояние проверять в этом цикле. Но это плохой путь.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы