Как сделать так, чтобы кнопка была кликабельной, чтобы изменить значение и продолжить в PyQt? - PullRequest
0 голосов
/ 10 июля 2019

Как сделать, чтобы кнопка была нажимаемой, чтобы изменить значение и продолжить дальнейшую программу.

Я пытался создать простой графический интерфейс, в котором я хочу напечатать значение от 1 до 100 через виджет метки. Другое требование - когда значение в цикле равно кратному 4 (each_item% == 0), я хочу Удвойте его с помощью pushButtonChange и напечатайте на этикетке. Я написал для него код, но программа не ждет изменения значения, нажав pushButtonChange. Как заставить программу остановиться и дождаться нажатия кнопки и продолжить.

import sys
from PyQt5.QtWidgets import QDialog,QApplication
from  verifygui import *
class MyForm(QDialog):
    def __init__(self):
        super().__init__()
        self.ui=Ui_Dialog()
        self.ui.setupUi(self)
        self.ui.pushButtonStart.clicked.connect(self.start)
        self.show()
    def start(self):
        list1=list(range(100))
        # print(list1)
        for each_item in list1:
            if each_item%4==0:
                self.ui.pushButtonChange.clicked.connect(lambda:self.valueChanged(each_item))
            else:
                self.ui.label.setText(str(each_item))

    def valueChanged(self,each_item):
        new_value=each_item*2
        self.ui.label.setText(str(new_value))


if __name__=="__main__":
    app=QApplication(sys.argv)
    w=MyForm()
    w.show()
    sys.exit(app.exec_())

1 Ответ

1 голос
/ 10 июля 2019

Я все еще не уверен, что понимаю проблему, но я поставил свой код.

Кнопка Start установить первое значение на этикетке или распечатать в консоли «Уже работает»

Кнопка Change добавляет +1 к текущему значению и повторяет * 2, если значение делится на 4. Он выведет на консоль Not running, если Start не был нажат ранее, или значение wen будет равно 100 (оно останавливается, и вам придется снова использовать Start)

Он не использует for -loop, поскольку значение изменяется только при нажатии кнопки.

import sys
from PyQt5.QtWidgets import QDialog, QApplication, QLabel, QPushButton, QVBoxLayout

class MyForm(QDialog):

    def __init__(self):
        super().__init__()

        self.layout = QVBoxLayout(self)

        self.label = QLabel(self, text="?")
        self.layout.addWidget(self.label)

        self.buttonStart = QPushButton(self, text="Start")        
        self.buttonStart.clicked.connect(self.start)
        self.layout.addWidget(self.buttonStart)

        self.buttonChange = QPushButton(self, text="Change")
        self.buttonChange.clicked.connect(self.valueChanged)
        self.layout.addWidget(self.buttonChange)

        self.is_running = False
        self.current_item = 0

        self.show()

    def start(self):
        if not self.is_running:
            self.is_running = True
            self.current_item = 1
            self.label.setText(str(self.current_item))
        else:    
            print("Already running")

    def valueChanged(self):
        if self.is_running:
            self.current_item += 1
            if self.current_item % 4 == 0:
                self.label.setText(str(self.current_item * 2) + " <-- double")
            else:
                self.label.setText(str(self.current_item))
            if self.current_item >= 100:
                self.is_running = False
        else:
            print("Not running")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyForm()
    window.show()
    sys.exit(app.exec_())

Это моя первая версия. Он использует таймер для изменения значения в метке каждые 0,5 мс (500 мс).

Он начинает считать, когда вы нажимаете Start. Когда вы нажимаете Change и значение делится на 4, оно умножается на * 2

import sys
from PyQt5.QtWidgets import QDialog, QApplication, QLabel, QPushButton, QVBoxLayout
from PyQt5.QtCore import QTimer

class MyForm(QDialog):

    def __init__(self):
        super().__init__()

        self.layout = QVBoxLayout(self)

        self.label = QLabel(self, text="?")
        self.layout.addWidget(self.label)

        self.buttonStart = QPushButton(self, text="Start")        
        self.buttonStart.clicked.connect(self.start)
        self.layout.addWidget(self.buttonStart)

        self.buttonChange = QPushButton(self, text="Change")
        self.buttonChange.clicked.connect(self.valueChanged)
        self.layout.addWidget(self.buttonChange)

        self.current_item = 0

        self.show()

    def start(self):
        self.current_item = 0
        self.timer = QTimer()
        self.timer.timeout.connect(self.valueUpdate)
        self.timer.start(500) # 500ms = 0.5s

    def valueUpdate(self):
        self.current_item += 1
        self.label.setText(str(self.current_item))

        if self.current_item >= 100:
            self.timer.stop()


    def valueChanged(self):
        if self.current_item is not None:
            if self.current_item % 4 == 0:
                new_value = self.current_item * 2
                self.label.setText(str(new_value))
        else:
            print("Not running")


if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MyForm()
    window.show()
    sys.exit(app.exec_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...