#python #python-3.x #pyqt5
#python #python-3.x #pyqt5
Вопрос:
У меня есть две строки редактирования, которые, когда в них вводится буква из словаря, возвращают число, и это число добавляется к следующему номеру строки редактирования и печатается на этикетке. Теперь я хочу, чтобы предыдущее число было уменьшено, а новое число добавлялось при изменении одной из строк редактирования.
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_()
Комментарии:
1. Извините, но ваше описание мне не очень понятно. Можете ли вы пояснить это, возможно, на практическом примере?
2. Я хочу рассчитать рабочую смену медсестры, у которой разные смены в течение месяца, которые я указал в словаре. Теперь я хочу, чтобы каждый вводимый мной сдвиг вводился в метку и добавлялся к следующему вводимому сдвигу. Иногда при ее исправлении может возникнуть ошибка сдвига, предыдущее значение уменьшается и добавляется новое значение.
3. Итак, вы хотите вычислить значение для метки только при нажатии кнопки return, но также вычислить его снова, если одно из полей очищено?
4. Да, при удалении предыдущее значение будет вычтено из предыдущей суммы, и новое значение будет заменено
Ответ №1:
Поскольку клавиши могут использовать более одного символа, возможным решением является использование textChanged(text)
сигнала и вызов функции для последующего вычисления сдвигов.
Однако факт заключается в том, что две существующие функции на самом деле имеют недостатки: они делают почти одно и то же, но не учитывают два поля так, как должны.
Я предлагаю вам объединить эти функции и использовать 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 (с установленной политикой вставки NoInsert
) и проверять сдвиг только тогда, когда вставленный текст находится в списке.
Комментарии:
1. Большое вам спасибо, я надеюсь, что смогу использовать ваши советы в будущих программах
2. Как я могу использовать музыку, созданную вами?
3. @AmooAmir извините, что вы имеете в виду?
4. У вас есть страница в киберпространстве? YouTube или WhatsApp
5. Мой веб-сайт указан на странице моего профиля здесь, на StackOverflow.