метод run, когда QPlainTextEdit определенной длины - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть диалоговое окно pyqt, которое принимает список данных, который заканчивается возвратом (от сканера штрих-кода, который имеет автоматический возврат.)

Этот список имеет длину 5 элементов, и в настоящее время я долженнажмите «Добавить данные», чтобы запустить метод populate_row при вводе 5 элементов.

Я разбил строку на список, используя \n, и обработал каждый элемент по мере необходимости.

Естьесть ли способ автоматизировать нажатие кнопки add data, когда число строк или число \n достигает 5 в поле QPlainTextEdit?

import sys

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *

class Status(QDialog):
    def __init__(self, parent=None):
        super(Status, self).__init__(parent)

        self.label = QLabel()

        self.btn = QPushButton("Input Data")
        self.btn.clicked.connect(self.populate_row)

        self.layout = QVBoxLayout()

        self.layout.addWidget(self.btn)
        self.layout.addWidget(self.label)

        self.resize(660, 260)
        self.setLayout(self.layout)

    def populate_row(self, letter):
        self.dialog = QDialog()

        self.dialog.resize(660, 260)

        self.textBox = QPlainTextEdit(self.dialog)

        Rbtn = QPushButton("Add Data")
        Rbtn.clicked.connect(
            lambda: self.enter_data(self.textBox.toPlainText()))

        layout = QVBoxLayout(self.dialog)
        layout.addWidget(self.textBox)
        layout.addWidget(Rbtn)

        self.dialog.exec_()

    def enter_data(self, text):
        self.label.setText(text)

        lst = text.split("\n")
        try:
            for  x in lst:
                if x != "":
                    print(x)
                    self.do_something_with_x()
        except IndexError:
            pass

        self.update_data()

        self.dialog.close()

    def do_something_with_x(self):
        print('Something done with x..')

    def update_data(self):
        print('Data updated..')

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

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Для подсчета разрывов строк используйте сигнал blockCountChanged(), и если вы хотите нажать на кнопку, вы должны использовать метод click().Также для проверки того, что строка пуста, достаточно использовать if x: поскольку строки являются итеративными, а if ifrable возвращает False, если она пуста, и True в других случаях.

import sys
from PyQt5 import QtCore, QtGui, QtWidgets


class Status(QtWidgets.QDialog):
    def __init__(self, parent=None):
        super(Status, self).__init__(parent)
        self.label = QtWidgets.QLabel()
        self.btn = QtWidgets.QPushButton("Input Data")
        self.btn.clicked.connect(self.populate_row)
        layout = QtWidgets.QVBoxLayout(self)
        layout.addWidget(self.btn)
        layout.addWidget(self.label)
        self.resize(660, 260)


    def populate_row(self, letter):
        self.dialog = QtWidgets.QDialog()
        self.dialog.resize(660, 260)
        self.textBox = QtWidgets.QPlainTextEdit()
        self.textBox.blockCountChanged.connect(self.blockCount)
        self.Rbtn = QtWidgets.QPushButton("Add Data")
        self.Rbtn.clicked.connect(self.runcode)
        layout = QtWidgets.QVBoxLayout(self.dialog)
        layout.addWidget(self.textBox)
        layout.addWidget(self.Rbtn)
        self.dialog.exec_()

    @QtCore.pyqtSlot(int)
    def blockCount(self, num):
        if num > 5: self.Rbtn.click()

    def runcode(self):
        self.enter_data(self.textBox.toPlainText())

    def enter_data(self, text):
        self.label.setText(text)
        for  x in text.split("\n"):
            if x:
                print(x)
                self.do_something_with_x()
        self.update_data()
        self.dialog.close()

    def do_something_with_x(self):
        print('Something done with x..')

    def update_data(self):
        print('Data updated..')

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    ex = Status()
    ex.show()
    sys.exit(app.exec_())
0 голосов
/ 20 сентября 2018

void QPlainTextEdit :: blockCountChanged (int newBlockCount)

Этот сигнал испускается всякий раз, когда изменяется количество блоков.Счетчик новых блоков передается в newBlockCount.

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui     import *
from PyQt5.QtCore    import *

class Status(QDialog):
    def __init__(self, parent=None):
        super(Status, self).__init__(parent)

        self.label = QLabel()

        self.btn = QPushButton("Input Data")
        self.btn.clicked.connect(self.populate_row)

        self.layout = QVBoxLayout()

        self.layout.addWidget(self.btn)
        self.layout.addWidget(self.label)

        self.resize(660, 260)
        self.setLayout(self.layout)

    def populate_row(self, letter):
        self.dialog = QDialog()

        self.dialog.resize(660, 260)

        self.textBox = QPlainTextEdit(self.dialog)
        #
        self.textBox.blockCountChanged[int].connect(self.blockCount)  # +++



        Rbtn = QPushButton("Add Data")
        Rbtn.clicked.connect(
            lambda: self.enter_data(self.textBox.toPlainText()))

        layout = QVBoxLayout(self.dialog)
        layout.addWidget(self.textBox)
        #layout.addWidget(Rbtn)                                       # ---

        self.dialog.exec_()
## +++
    def blockCount(self, num):
        if num > 5:
            self.enter_data(self.textBox.toPlainText())
##

    def enter_data(self, text):
        self.label.setText(text)
        lst = text.split("\n")
        try:
            for  x in lst:
                if x != "":
                    print(x)
                    self.do_something_with_x()
        except IndexError:
            pass

        self.update_data()

        self.dialog.close()

    def do_something_with_x(self):
        print('Something done with x..')

    def update_data(self):
        print('Data updated..')

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

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...