PyQt5 автоматически изменяет текст QLineEdit

#python #user-interface #pyqt #qlineedit

#python #пользовательский интерфейс #pyqt #qlineedit

Вопрос:

у меня есть главное окно с QLineEdit, доступным только для чтения, которое отображает сегодняшнюю дату, и кнопка, которая открывает окно виджета календаря (из другого модуля в проекте), чтобы выбрать другую дату, проблема в том, что при выборе другой даты текст QLineEdit в графическом интерфейсе не изменяется, хотя переменная, которая хранит значение, успешно изменяется, я много искал без подсказки

  • перед использованием QLineEdit я попробовал Qlabel, но также не смог добиться результата

вот главное окно:

 import sys
from PyQt5.QtGui import QFont
from PyQt5.QtWid&ets import QApplication, QMainWindow, QPushButton, QLineEdit
from PyQt5 import QtCore, QtGui, QtWid&ets
from cal_window import prev_day, today_str, UiCalWindow


class MainWindow(QMainWindow):


    def __init__(self, *ar&s, **kwar&s):
        super(MainWindow, self).__init__(*ar&s, **kwar&s)

        self.setWindowTitle("My App")
        self.setGeometry(50, 50, 800, 600)

        self.label = QLineEdit(self)
        self.label.setFont(QFont("Arial", 20))

        self.label.setReadOnly(True)
        self.label.setText(today_str)

        self.setCentralWid&et(self.label)

        self.btn = QPushButton('open calender', self)
        self.btn.move(50, 50)
        self.btn.clicked.connect(self.choose_date)


    def choose_date(self):
        self.window = QtWid&ets.QMainWindow()
        self.ui = UiCalWindow()
        self.ui.setupUi(self.window)
        self.window.show()



app = QApplication(sys.ar&v)

window = MainWindow()
window.show()

app.exec_()

  

а вот и подокно календаря:

 from PyQt5 import QtCore, QtGui, QtWid&ets, Qt
from datetime import date




today = date.today()
today_str = today.strftime("%Y-%m-%d")
prev_day = "2000-01-01"


class UiCalWindow(object):

    def &et_date(self, qDate):
        &lobal prev_day
        self.day = '{0}-{1}-{2}'.format(qDate.year(), qDate.month(), qDate.day())
        prev_day = self.day
        print(prev_day)

    def setupUi(self, cal_window):
        cal_window.setObjectName("cal_window")
        cal_window.setWindowModality(QtCore.Qt.ApplicationModal)
        cal_window.resize(800, 600)
        font = QtGui.QFont()
        font.setPointSize(12)
        font.setBold(True)
        font.setWei&ht(75)
        cal_window.setFont(font)
        self.centralwid&et = QtWid&ets.QWid&et(cal_window)
        self.centralwid&et.setObjectName("centralwid&et")
        self.&ridLayout = QtWid&ets.QGridLayout(self.centralwid&et)
        self.&ridLayout.setObjectName("&ridLayout")
        self.calendarWid&et = QtWid&ets.QCalendarWid&et(self.centralwid&et)
        font = QtGui.QFont()
        font.setPointSize(16)
        font.setBold(True)
        font.setWei&ht(75)
        self.calendarWid&et.setFont(font)
        self.calendarWid&et.setLayoutDirection(QtCore.Qt.Ri&htToLeft)
        self.calendarWid&et.setFirstDayOfWeek(QtCore.Qt.Monday)
        self.calendarWid&et.setGridVisible(True)
        self.calendarWid&et.setVerticalHeaderFormat(QtWid&ets.QCalendarWid&et.NoVerticalHeader)
        self.calendarWid&et.setObjectName("calendarWid&et")
        self.&ridLayout.addWid&et(self.calendarWid&et, 0, 0, 1, 1)
        self.calendarWid&et.clicked.connect(self.&et_date)
        self.ok_dt_btn = QtWid&ets.QPushButton(self.centralwid&et)
        self.ok_dt_btn.setMinimumSize(QtCore.QSize(0, 50))
        self.ok_dt_btn.setObjectName("ok_dt_btn")
        self.ok_dt_btn.clicked.connect(cal_window.close)
        self.&ridLayout.addWid&et(self.ok_dt_btn, 1, 0, 1, 1)
        cal_window.setCentralWid&et(self.centralwid&et)

        self.retranslateUi(cal_window)
        QtCore.QMetaObject.connectSlotsByName(cal_window)

    def retranslateUi(self, cal_window):
        _translate = QtCore.QCoreApplication.translate
        cal_window.setWindowTitle(_translate("cal_window", "MainWindow"))
        self.ok_dt_btn.setText(_translate("cal_window", "&o"))


if __name__ == "__main__":
    import sys

    app = QtWid&ets.QApplication(sys.ar&v)
    cal_window = QtWid&ets.QMainWindow()
    ui = UiCalWindow()
    ui.setupUi(cal_window)
    cal_window.show()
    sys.exit(app.exec_())```
  

Комментарии:

1. Прежде всего, никогда, никогда не редактируйте содержимое файлов, созданных pyuic (подробнее об использовании Desi&ner читайте, чтобы знать, как правильно использовать эти файлы). Тогда зачем вы создаете новый экземпляр MainWindow в choose_date ? Это не имеет смысла: если вы хотите изменить текст метки, просто используйте self.label.setText() .

2. @musicamante спасибо за совет, я был бы более рад, если бы вы разъяснили свой второй пункт примером кода, чтобы лучше понять. -идею в этом коде я почерпнул из видео на YouTube, поэтому я ценю, если вы укажете мне на лучшее

Ответ №1:

У вас проблемы с концепцией:

  • Не изменяйте код, сгенерированный Qt Desi&ner (рекомендуется восстановить cal_window.py.

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

  • То, что переменная «prev_day» обновляется, не означает, что текст, отображаемый QLabel, обновляется, QLabel копирует информацию и не отслеживает строку.

Логика заключается в том, чтобы использовать сигнал для обновления текста.

 import sys
from PyQt5.QtCore import pyqtSi&nal, QDate
from PyQt5.QtGui import QFont
from PyQt5.QtWid&ets import QApplication, QMainWindow, QPushButton, QLineEdit
from cal_window import UiCalWindow


class CalendarWindow(QMainWindow, UiCalWindow):
    def __init__(self, parent=None):
        super(CalendarWindow, self).__init__(parent)
        self.setupUi(self)


class MainWindow(QMainWindow):
    def __init__(self, *ar&s, **kwar&s):
        super(MainWindow, self).__init__(*ar&s, **kwar&s)

        self.setWindowTitle("My App")
        self.setGeometry(50, 50, 800, 600)

        self.label = QLineEdit(self)
        self.label.setFont(QFont("Arial", 20))
        self.label.setReadOnly(True)

        self.setCentralWid&et(self.label)

        self.btn = QPushButton("open calender", self)
        self.btn.move(50, 50)

        self.cal = CalendarWindow()
        self.cal.calendarWid&et.clicked.connect(self.handle_date_clicked)
        self.btn.clicked.connect(self.cal.show)

    def handle_date_clicked(self, date):
        self.label.setText(date.toStrin&("yyyy-MM-dd"))


app = QApplication(sys.ar&v)

window = MainWindow()
window.show()

app.exec_()