显示实时时钟并检查字符串长度

Display real time clock and check string length

我正在编写此程序以在 QT 文本编辑器检测到字符串长度大于 5 个字符时自动将数据保存到 Postgres 数据库。该程序还显示当前日期和时间。

注意:我创建了一个保存按钮,用于在 QT 文本编辑器中保存数据。但实际上我需要在QT Text Edit检测到长度超过5个字符后保存数据。

我面临以下困难:

  1. 显示的时间是停止的,它在应用程序启动时调用并显示,但之后它只是显示静态。

  2. 第 106 行的“if len(self.barcode_in) >= 5:”有错误。

我研究了 Python 时间表,但扫描的最小间隔似乎是 0.5 秒。 QT Text Edit 是否需要使用线程函数来刷新显示的时钟和扫描长度? 我的完整代码如下。

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'savebarcodedatetime.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost!
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import QTime, QTimer
from PyQt5.QtCore import QDate, Qt
from PyQt5.QtWidgets import QApplication, QLCDNumber

import threading
import psycopg2
#from config import config
from threading import Thread
from datetime import  *
import time
from time import time

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):

        MainWindow.setObjectName("MainWindow")

        MainWindow.resize(800, 600)

        self.centralwidget = QtWidgets.QWidget(MainWindow)

        self.centralwidget.setObjectName("centralwidget")

        self.widget = QtWidgets.QWidget(self.centralwidget)

        self.widget.setGeometry(QtCore.QRect(50, 10, 721, 531))

        self.widget.setObjectName("widget")

        self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.widget)

        self.verticalLayout_2.setContentsMargins(0, 0, 0, 0)

        self.verticalLayout_2.setObjectName("verticalLayout_2")

        self.horizontalLayout = QtWidgets.QHBoxLayout()

        self.horizontalLayout.setObjectName("horizontalLayout")

        spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)

        self.horizontalLayout.addItem(spacerItem)

        self.show_time = QtWidgets.QLCDNumber(self.widget) #LCD = show_time

        font = QtGui.QFont()

        font.setPointSize(16)

        self.show_time.setFont(font)

        self.show_time.setObjectName("show_time")

        self.horizontalLayout.addWidget(self.show_time)

        spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum)

        self.horizontalLayout.addItem(spacerItem1)

        self.show_date = QtWidgets.QLabel(self.widget)

        font = QtGui.QFont()

        font.setPointSize(16)

        self.show_date.setFont(font)

        self.show_date.setObjectName("show_date")

        self.horizontalLayout.addWidget(self.show_date)

        spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Minimum)

        self.horizontalLayout.addItem(spacerItem2)

        self.verticalLayout_2.addLayout(self.horizontalLayout)

        spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)

        self.verticalLayout_2.addItem(spacerItem3)

        self.tableWidget = QtWidgets.QTableWidget(self.widget)

        self.tableWidget.setObjectName("tableWidget")

        self.tableWidget.setColumnCount(0)

        self.tableWidget.setRowCount(0)

        self.verticalLayout_2.addWidget(self.tableWidget)

        spacerItem4 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)

        self.verticalLayout_2.addItem(spacerItem4)

        self.verticalLayout = QtWidgets.QVBoxLayout()

        self.verticalLayout.setObjectName("verticalLayout")

        self.barcode_in = QtWidgets.QTextEdit(self.widget)

        self.barcode_in.setObjectName("barcode_in")

        self.verticalLayout.addWidget(self.barcode_in)

        spacerItem5 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)

        self.verticalLayout.addItem(spacerItem5)

        self.save_button = QtWidgets.QPushButton(self.widget)

        font = QtGui.QFont()

        font.setPointSize(24)

        self.save_button.setFont(font)

        self.save_button.setObjectName("save_button")

        self.verticalLayout.addWidget(self.save_button)

        spacerItem6 = QtWidgets.QSpacerItem(20, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Preferred)

        self.verticalLayout.addItem(spacerItem6)

        self.verticalLayout_2.addLayout(self.verticalLayout)

        MainWindow.setCentralWidget(self.centralwidget)

        self.menubar = QtWidgets.QMenuBar(MainWindow)

        self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))

        self.menubar.setObjectName("menubar")

        MainWindow.setMenuBar(self.menubar)

        self.statusbar = QtWidgets.QStatusBar(MainWindow)

        self.statusbar.setObjectName("statusbar")

        MainWindow.setStatusBar(self.statusbar)



        self.retranslateUi(MainWindow)

        QtCore.QMetaObject.connectSlotsByName(MainWindow)

        

        self.save_button.clicked.connect(self.save_db)

       

        printoutput.printoutmessage()

        

        todaydate = QTime.currentTime()

        print(todaydate.toString(Qt.DefaultLocaleLongDate))

        todaydate_str = todaydate.toString("H:mm:ss")

        self.show_date.setText(todaydate_str)



        

        print(todaydate.toString(Qt.DefaultLocaleLongDate))

        

        

        if len(self.barcode_in) >= 5:

                barcodedata = self.barcode_in.toPlainText()

                insertdb.insert_vendor(barcodedata)

                print('barcode save')

        

       

                



    def retranslateUi(self, MainWindow):

        _translate = QtCore.QCoreApplication.translate

        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))

        self.show_date.setText(_translate("MainWindow", "TextLabel"))

        self.save_button.setText(_translate("MainWindow", "Save"))

        

        

    def save_db(self):

        print("save")

        #mytext = self.textEdit.toPlainText()

        barcodedata = self.barcode_in.toPlainText()

        insertdb.insert_vendor(barcodedata)

        #barcode_in = ''

        today = datetime.now()

        print (today.strftime(' %a %d-%m-%Y @ %H:%M:%S'))

        

class insertdb:

        

    def insert_vendor(vendor_name):

        """ insert a new vendor into the vendors table """

        sql = """INSERT INTO vendors(vendor_name)

             VALUES(%s) RETURNING vendor_id;"""

        conn = None

        vendor_id = None

        try:

           conn = psycopg2.connect(host="192.168.1.104", 

                port = 5432, database="suppliers", 

                user="pi", password="1234")

           cur = conn.cursor()

           # execute the INSERT statement

           cur.execute(sql, (vendor_name,))

           # get the generated id back

           vendor_id = cur.fetchone()[0]

           conn.commit()

           cur.close()

        except (Exception, psycopg2.DatabaseError) as error:

           print(error)

        finally:

           if conn is not None:

               conn.close()



        return vendor_id

        

class printoutput:

        def printoutmessage():

                print("print output")





if __name__ == "__main__":

    import sys

    app = QtWidgets.QApplication(sys.argv)

    MainWindow = QtWidgets.QMainWindow()

    ui = Ui_MainWindow()

    ui.setupUi(MainWindow)

    MainWindow.show()

    sys.exit(app.exec_())

qtextedit 可以在每次文本更改时发出信号,here is the name and doc

我的建议是将该信号连接到您自定义的插槽,并在该方法的实现中检查新文本的长度...比每“x”秒轮询一次 a 的大小更有效字符串.

现在,这里的错误:

if len(self.barcode_in) >= 5: 

无效,因为

self.barcode_in实际上是一个widget,你初始化它就像做 self.barcode_in = QtWidgets.QTextEdit(self.widget) 因此将它与数字进行比较是没有意义的,但是您想要的是比较该小部件中文本的长度,为此您需要它的“纯文本”(here the doc for that)