如何更改编辑行的文本并进行加减?

2024-10-03 00:20:47 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个编辑行,当在其中键入字典中的字母时,它返回一个数字,这个数字被添加到下一个编辑行号中,并打印在标签上。现在,我希望在更改其中一个编辑行时减少以前的数字,并添加新的数字

import sys
from PyQt5.QtWidgets import QWidget, QApplication, QPushButton, QLabel
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.uic import loadUiType
oroh, _ = loadUiType("oroh.ui")

class OrOh(QWidget, oroh):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)
    
        self.lin_sh1.returnPressed.connect(self.shift1)
        self.lin_sh2.returnPressed.connect(self.shift2)
         
    def shift1(self):
        shifts = {"m":7, "s":7, "v":7, "t":7, "e":3, "le":5, "ld":12,
                  "n":12, "ln":14, "mn":19, "en":17, "me":10, "f":24}
    
        sh1 = self.lin_sh1.text()
        if sh1 in shifts.keys():
           a = shifts[sh1]
           print(a)
        else:
           a = 0
           print(a)
        self.lbl_shifts.setText(f"{a}")
    
    def shift2(self):
        shifts = {"m":7, "s":7, "v":7, "t":7, "e":3, "le":5, "ld":12,
                  "n":12, "ln":14, "mn":19, "en":17, "me":10, "f":24}
        a = self.lbl_shifts.text()
    
        sh2 = self.lin_sh2.text()
        if sh2 in shifts.keys():
            b = shifts[sh2] 
        else:
            b = 0
        
        result = int(a) + int(b)
        self.lbl_shifts.setText(f"{result}")
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = OrOh()
    window.show()
    app.exec_()

Tags: textfromimportself编辑ifdef数字
1条回答
网友
1楼 · 发布于 2024-10-03 00:20:47

由于键可以使用多个字符,因此一种可能的解决方案是使用^{}信号,然后调用函数来计算移位

然而,事实上,这两个现有函数实际上是有缺陷的:它们几乎都做同样的事情,但不应该考虑这两个字段。p>

我建议您合并这些函数,并仅在输入有效键时使用textChanged来“重置”值。请注意,这意味着一个逻辑不是立即就能理解的(即使对于用户来说),并且可能会引起一些混乱

class OrOh(QWidget, oroh):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)

        self.shifts = {"m":7, "s":7, "v":7, "t":7, "e":3, "le":5, "ld":12,
                  "n":12, "ln":14, "mn":19, "en":17, "me":10, "f":24}
    
        self.lin_sh1.returnPressed.connect(self.computeShift)
        self.lin_sh2.returnPressed.connect(self.computeShift)

        self.lin_sh1.textChanged.connect(self.checkText)
        self.lin_sh2.textChanged.connect(self.checkText)

    def checkText(self):
        lin1 = self.lin_sh1.text()
        lin2 = self.lin_sh2.text()
        if self.lbl_shifts.text() and (not lin1 or not lin2):
            self.computeShift()

    def computeShift(self):
        lin1 = self.lin_sh1.text()
        lin2 = self.lin_sh2.text()

        if ((lin1 in self.shifts and not lin2) or 
            (lin2 in self.shifts and not lin1) or
            (lin1 in self.shifts and lin2 in self.shifts)):
                shift = self.shifts.get(lin1, 0) + self.shifts.get(lin2, 0)
                self.lbl_shifts.setText(str(shift))

我建议您添加一些验证逻辑,或者至少始终使用textChanged信号。一个简单的解决方案是,只要输入的文本不在字典中,就更改文本颜色,并在焦点改变时最终清除它:

class OrOh(QWidget, oroh):
    def __init__(self):
        QWidget.__init__(self)
        self.setupUi(self)

        self.shifts = {"m":7, "s":7, "v":7, "t":7, "e":3, "le":5, "ld":12,
                  "n":12, "ln":14, "mn":19, "en":17, "me":10, "f":24}
    
        self.lin_sh1.textChanged.connect(self.computeShift)
        self.lin_sh2.textChanged.connect(self.computeShift)

        self.lin_sh1.editingFinished.connect(lambda: self.checkField(self.lin_sh1))
        self.lin_sh2.editingFinished.connect(lambda: self.checkField(self.lin_sh2))

    def checkField(self, field):
        if not field.text() in self.shifts:
            field.setText('')

    def computeShift(self):
        shift = 0
        
        for field in (self.lin_sh1, self.lin_sh2):
            value = self.shifts.get(field.text(), 0)
            if field.text() and not value:
                field.setStyleSheet('color: red;')
            else:
                field.setStyleSheet('')
            shift += self.shifts.get(field.text(), 0)
        self.lbl_shifts.setText(str(shift))

另一种可能是使用可编辑的QComboBox(将insert policy设置为NoInsert),并且仅当插入的文本在列表中时才检查移位

相关问题 更多 >