Почему не запускается код в PyCharm?
При запуске кода выводятся две ошибки. Их я отметил в коде как "#<<<---------ERROR"
Traceback (most recent call last):
File "C:\Users\Захар\Desktop\Часы\watch_s.py", line 309, in
w = ManinWindow()
File "C:\Users\Захар\Desktop\Часы\watch_s.py", line 101, in init
self.setupUi(self)
File "C:\Users\Захар\Desktop\Часы\watch_s.py", line 70, in setupUi
self.layout_t = QGridLayout(self.tab_3)
AttributeError: 'ManinWindow' object has no attribute 'tab_3'. Did you mean: 'tab_2'?
Вот код:
from datetime import datetime, timedelta # +++
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.Qt import *
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(649, 168)
MainWindow.setMinimumSize(QtCore.QSize(0, 0))
MainWindow.setMaximumSize(QtCore.QSize(999999, 999999))
MainWindow.setStyleSheet(
"MainWindow\n""{\n"" background-color: rgb(37, 37, 37);\n""}")
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setMaximumSize(QtCore.QSize(99999, 999999))
self.centralwidget.setStyleSheet("background-color: rgb(37, 37, 37)\n""")
self.centralwidget.setObjectName("centralwidget")
self.frame = QtWidgets.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(0, -1, 641, 171))
self.frame.setMinimumSize(QtCore.QSize(0, 0))
self.frame.setMaximumSize(QtCore.QSize(99999, 999))
self.frame.setStyleSheet(
"MainWindow\n""{\n"" background-color:rgb(46, 46, 46)\n""}")
self.frame.setFrameShape(QtWidgets.QFrame.NoFrame)
self.frame.setFrameShadow(QtWidgets.QFrame.Raised)
self.frame.setObjectName("frame")
self.tabWidget = QtWidgets.QTabWidget(self.frame)
self.tabWidget.setGeometry(QtCore.QRect(0, 0, 651, 161))
self.tabWidget.setMinimumSize(QtCore.QSize(4, 0))
font = QtGui.QFont()
font.setFamily("Rio Glamour personal use")
font.setPointSize(14)
self.tabWidget.setFont(font)
self.tabWidget.setStyleSheet(
"QTabWidget::pane\n"
"{\n"" border: 1px;\n"
" background: rgb(37, 37, 37);\n"
"}\n""\n"
"QTabBar::tab\n""{\n"" background: rgb(37, 37, 37);\n"
" color:rgb(255, 255, 255);\n""}\n""\n""\n"
"QTabBar::tab:selected\n""{\n"
" background:rgb(26, 26, 26);\n"
" color:rgb(255, 255, 255);\n""}\n""\n"
"QTabBar::tab:hover\n""{\n"" background:rgb(57, 57, 57);\n"
" color:rgb(255, 255, 255);\n""}\n""\n""")
self.tabWidget.setObjectName("tabWidget")
self.tab = QtWidgets.QWidget()
font = QtGui.QFont()
font.setPointSize(8)
self.tab.setFont(font)
self.tab.setObjectName("tab")
self.label = QtWidgets.QLabel(self.tab)
self.label.setGeometry(QtCore.QRect(-4, -8, 651, 141))
self.label.setText("")
self.label.setObjectName("label")
self.tabWidget.addTab(self.tab, "")
self.tab_2 = QtWidgets.QWidget()
self.tab_2.setObjectName("tab_2")
self.label_2 = QtWidgets.QLabel(self.tab_2)
self.label_2.setGeometry(QtCore.QRect(0, 0, 661, 141))
self.label_2.setText("")
self.label_2.setObjectName("label_2")
self.layout = QGridLayout(self.tab_2)
self.layout.addWidget(self.label_2, 0, 0, 1, 5)
self.layout_timer = QGridLayout(self.tab_3) #<<<<<<<<<<<<<<<<--ERROR
self.layout_timer.addWidget(self.label_3, 0, 0, 1, 2)
self.tabWidget.addTab(self.tab_2, "")
self.tab_3 = QtWidgets.QWidget()
self.tab_3.setStyleSheet(
"background-color: rgb(37, 37, 37);\n""color: rgb(255, 255, 255);")
self.tab_3.setObjectName("tab_3")
self.label_3 = QtWidgets.QLabel(self.tab_3)
self.label_3.setGeometry(QtCore.QRect(10, 0, 661, 141))
self.label_3.setText("")
self.label_3.setObjectName("label_3")
self.tabWidget.addTab(self.tab_3, "")
MainWindow.setCentralWidget(self.centralwidget)
self.retranslateUi(MainWindow)
self.tabWidget.setCurrentIndex(2)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("MainWindow", "Time"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("MainWindow", "Timer"))
self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("MainWindow", "Stopwatch"))
class ManinWindow(QtWidgets.QMainWindow, Ui_MainWindow):
def __init__(self):
super().__init__()
self.setupUi(self) #<<<<<<<<<<<<<<<<<<<<<<---ERROR
self.tabWidget.currentChanged.connect(self.current_index)
self.tabWidget.setCurrentIndex(0)
self.working_clock = QtCore.QTimer()
self.working_clock.setInterval(1000)
self.working_clock.timeout.connect(self.display_clock)
self.working_clock.start()
def add_functions(self): #main functions
# Часы --- tab_2
self.label.setText(QDateTime.currentDateTime().toString('HH:mm:ss\ndd MM yyyy'))
self.label.setFont(QtGui.QFont("Capsuula", 40))
self.label.setStyleSheet("color: #DADDFC;")
self.label.setAlignment(Qt.AlignHCenter)
# Таймер --- tab_2
self.label_2.setText("00:00:00")
self.label_2.setAlignment(Qt.AlignHCenter)
self.label_2.setFont(QtGui.QFont("Capsuula", 45))
self.label_2.setStyleSheet("color: #fff;")
self.btn_start = QtWidgets.QPushButton("Start")
self.btn_start.setStyleSheet("color: #fff; font-size: 15px; background-color: #555;")
self.btn_start.clicked.connect(self.func_start_timer)
self.btn_continue = QtWidgets.QPushButton("Continue")
self.btn_continue.setStyleSheet("color: #fff; font-size: 15px; background-color: #555;")
self.btn_continue.clicked.connect(self.func_continue_timer)
self.btn_reset = QtWidgets.QPushButton("Reset")
self.btn_reset.setStyleSheet("color: #fff; font-size: 15px; background-color: #555;")
self.btn_reset.clicked.connect(self.func_reset_timer)
self.startDateTime = QDateTimeEdit()
today = QDate.currentDate()
DATETIME_FORMAT = "yyyy-MM-dd hh:mm:ss"
self.startDateTime.setDateRange(today, today)
self.startDateTime.setDisplayFormat(DATETIME_FORMAT)
self.startDateTime.setStyleSheet('background-color: #ccc; font-size: 12px;')
self.endDateTime = QDateTimeEdit()
self.endDateTime.setDateTime(QDateTime.currentDateTime())
self.endDateTime.setDisplayFormat(DATETIME_FORMAT)
self.endDateTime.setStyleSheet('background-color: #ccc; font-size: 12px;')
startLabel = QLabel('Start', styleSheet='color: #fff; font-size: 12px;')
startLabel.setFixedSize(30, 25)
self.layout.addWidget(startLabel, 1, 0, 1, 1, alignment=Qt.AlignRight)
self.layout.addWidget(self.startDateTime, 1, 1, 1, 1)
endLabel = QLabel("End:", styleSheet='color: #fff; font-size: 12px;')
endLabel.setFixedSize(30, 25)
self.layout.addWidget(endLabel, 1, 2, 1, 1, alignment=Qt.AlignRight)
self.layout.addWidget(self.endDateTime, 1, 3, 1, 1)
self.layout.addWidget(self.btn_start, 1, 4, 1, 1)
self.layout.addWidget(self.btn_continue, 2, 1, 1, 1)
self.layout.addWidget(self.btn_reset, 2, 3, 1, 1)
self.btn_continue.hide()
self.btn_reset.hide()
self.timer = QtCore.QTimer()
self.timer.setInterval(1000)
self.timer.timeout.connect(self.display_time_timer)
#Секундомер --- tab_3
self.temp = 0
self.label_2.setText("00:00:00")
self.label_2.setAlignment(Qt.AlignHCenter)
self.label_2.setFont(QtGui.QFont("Capsuula", 40))
self.label_2.setStyleSheet("color: #f00;")
self.btn_start = QtWidgets.QPushButton("Start")
self.btn_start.setStyleSheet("color: #fff; font-size: 15px; background-color: #555;")
self.btn_start.clicked.connect(self.func_start)
self.btn_continue = QtWidgets.QPushButton("Continue")
self.btn_continue.setStyleSheet("color: #fff; font-size: 15px; background-color: #555;")
self.btn_continue.clicked.connect(self.func_continue)
self.btn_reset = QtWidgets.QPushButton("Reset")
self.btn_reset.setStyleSheet("color: #fff; font-size: 15px; background-color: #555;")
self.btn_reset.clicked.connect(self.func_reset)
self.layout.addWidget(self.btn_start, 1, 0, 1, 2)
self.layout.addWidget(self.btn_continue, 2, 0, 1, 1)
self.layout.addWidget(self.btn_reset, 2, 1, 1, 1)
self.btn_continue.hide()
self.btn_reset.hide()
self.timer = QtCore.QTimer()
self.timer.setInterval(1000)
self.timer.timeout.connect(self.display_time)
#STOPWATCH FUNCTIONS ---VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def func_start(self):
if self.btn_start.text() == "Start":
self.timer.start()
self.btn_start.setText("Stop")
else:
self.timer.stop()
self.btn_start.setText("Start")
self.btn_start.hide()
self.btn_continue.show()
self.btn_reset.show()
def func_reset(self):
self.temp = 0
self.label_2.setText("00:00:00")
self.btn_start.setText("Start")
self.btn_start.show()
self.btn_continue.hide()
self.btn_reset.hide()
def display_time(self):
f_temp = datetime.utcfromtimestamp(self.temp).strftime("%H:%M:%S")
self.label_2.setText(f_temp)
self.temp += 1
def current_index(self, index):
if index == 0:
self.add_functions()
def func_continue(self):
self.timer.start()
self.btn_start.setText('Стоп')
self.btn_start.show()
self.btn_continue.hide()
self.btn_reset.hide()
#TIMER FUNCTIONS ---VVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVV
def func_start_timer(self):
if self.btn_start.text() == "Start":
self.timer.start()
self.btn_start.setText("Stop")
start_date = self.startDateTime.dateTime()
self.start_date_py = start_date.toPyDateTime()
end_date = self.endDateTime.dateTime()
self.end_date_py = end_date.toPyDateTime()
self.d = self.end_date_py - self.start_date_py # !!!
else:
self.timer.stop()
self.btn_start.setText("Start")
self.btn_start.hide()
self.btn_continue.show()
self.btn_reset.show()
def func_reset_timer(self):
self.label_2.setText("00:00:00")
self.btn_start.setText("Start")
self.btn_start.show()
self.btn_continue.hide()
self.btn_reset.hide()
def display_time_timer(self):
mm, ss = divmod(self.d.seconds, 60) # !!!
hh, mm = divmod(mm, 60) # !!!
self.label_2.setText(
f'{self.d.days} d. {hh:02} h. {mm:02} min. {ss:02} sec.'
)
self.d = self.d - timedelta(seconds=1) # !!!
if self.d.days < 0: # !!!
self.timer.stop()
def current_index_timer(self, index):
if index == 0:
self.add_functions()
def func_continue_timer(self):
if self.d.days < 0:
return
self.timer.start()
self.btn_start.setText('Стоп')
self.btn_start.show()
self.btn_continue.hide()
self.btn_reset.hide()
def display_clock(self): #clock functions
self.label.setText(QDateTime.currentDateTime().toString('HH:mm:ss\ndd MM yyyy'))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication(sys.argv)
w = ManinWindow()
w.show()
sys.exit(app.exec_())
Уточняю ошибку на линии 70. Мне нужна именно "tab_3", но не "tab_2"
Ответы (1 шт):
Ты сначала исспользуешь переменную, а затем инициализируешь
self.layout_timer = QGridLayout(self.tab_3) #use но таб3 ещё не существует #<<<<<<<<<<<<<<<<--ERROR
self.layout_timer.addWidget(self.label_3, 0, 0, 1, 2)
self.tabWidget.addTab(self.tab_2, "")
self.tab_3 = QtWidgets.QWidget() #init
то есть это что то вроде
...
result=x-1
x=10
...
то есть перенеси инициализацию tab_3 в начало функции, по крайней мере до первого использования