Ошибка в коде (pyqt5)
Пишу действие, если кнопка нажата, должна происходить функция weather_city. Но выдает ошибку:
"AttributeError: 'Ui_main' object has no attribute 'PushButton'"
Main.py
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from gui import Ui_main
#create
app = QtWidgets.QApplication(sys.argv)
#init
main = QtWidgets.QDialog()
ui = Ui_main()
ui.setupUi(main)
main.show()
def weather_city():
print("WORKING")
ui.PushButton.clicked.connect( weather_city )
#loop
sys.exit(app.exec_())
gui.py
# -*- coding: utf-8 -*-
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_main(object):
def setupUi(self, main):
main.setObjectName("main")
main.resize(502, 243)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("res/icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
main.setWindowIcon(icon)
main.setStyleSheet("background-color:#241f1f;\n"
"color:#dbd3d3 ;")
self.GET = QtWidgets.QPushButton(main)
self.GET.setGeometry(QtCore.QRect(170, 160, 151, 21))
self.GET.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.GET.setStyleSheet("QPushButton{\n"
"font: 8pt \"Minecrafter\";\n"
"border:none;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
"\n"
"color:#2c3d91;\n"
"\n"
"}")
self.GET.setCheckable(False)
self.GET.setChecked(False)
self.GET.setFlat(False)
self.GET.setObjectName("GET")
self.textEdit = QtWidgets.QTextEdit(main)
self.textEdit.setGeometry(QtCore.QRect(40, 90, 431, 71))
font = QtGui.QFont()
font.setFamily("Minecrafter")
font.setPointSize(20)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.textEdit.setFont(font)
self.textEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.IBeamCursor))
self.textEdit.setStyleSheet("color:#dbd3d3;\n"
"background-color:#2e2e2e ;\n"
"border:none;\n"
"font: 20pt \"Minecrafter\";")
self.textEdit.setObjectName("textEdit")
self.label = QtWidgets.QLabel(main)
self.label.setGeometry(QtCore.QRect(60, 0, 391, 81))
font = QtGui.QFont()
font.setFamily("Minecrafter")
font.setPointSize(25)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.label.setFont(font)
self.label.setStyleSheet("font: 25pt \"Minecrafter\";")
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(main)
self.label_2.setGeometry(QtCore.QRect(160, 200, 231, 31))
font = QtGui.QFont()
font.setFamily("Minecrafter")
font.setPointSize(10)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.label_2.setFont(font)
self.label_2.setStyleSheet("font: 10pt \"Minecrafter\";")
self.label_2.setObjectName("label_2")
self.pic = QtWidgets.QLabel(main)
self.pic.setGeometry(QtCore.QRect(100, 200, 61, 51))
self.pic.setText("")
self.pic.setTextFormat(QtCore.Qt.MarkdownText)
self.pic.setPixmap(QtGui.QPixmap("res/no.png"))
self.pic.setObjectName("pic")
self.line = QtWidgets.QFrame(main)
self.line.setGeometry(QtCore.QRect(-60, 180, 591, 20))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.line_2 = QtWidgets.QFrame(main)
self.line_2.setGeometry(QtCore.QRect(20, 0, 21, 191))
self.line_2.setFrameShape(QtWidgets.QFrame.VLine)
self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line_2.setObjectName("line_2")
self.line_3 = QtWidgets.QFrame(main)
self.line_3.setGeometry(QtCore.QRect(470, 0, 21, 191))
self.line_3.setFrameShape(QtWidgets.QFrame.VLine)
self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line_3.setObjectName("line_3")
self.retranslateUi(main)
QtCore.QMetaObject.connectSlotsByName(main)
def retranslateUi(self, main):
_translate = QtCore.QCoreApplication.translate
main.setWindowTitle(_translate("main", "Погода"))
self.GET.setText(_translate("main", "Получить погоду"))
self.label.setText(_translate("main", "Укажите город"))
self.label_2.setText(_translate("main", "Не получена погода"))
Ответы (2 шт):
Автор решения: gil9red
→ Ссылка
В Ui_main единственная кнопка имеет имя (Object name) GET, поэтому у вас должно быть так:
ui.GET.clicked.connect(weather_city)
PS.
Рекомендую давать названия (в Object name), которые будут понятны :)
Автор решения: S. Nick
→ Ссылка
кроме рекомендаций от @gil9red и вам рекомендую сразу погрузиться в ООП и использовать классы:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
#from gui import Ui_main
class Ui_main(object):
def setupUi(self, main):
main.setObjectName("main")
main.resize(502, 243)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("res/icon.ico"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
main.setWindowIcon(icon)
main.setStyleSheet("background-color:#241f1f;\n"
"color:#dbd3d3 ;")
self.GET = QtWidgets.QPushButton(main)
self.GET.setGeometry(QtCore.QRect(170, 160, 151, 21))
self.GET.setCursor(QtGui.QCursor(QtCore.Qt.PointingHandCursor))
self.GET.setStyleSheet("QPushButton{\n"
"font: 8pt \"Minecrafter\";\n"
"border:none;\n"
"}\n"
"\n"
"QPushButton:hover{\n"
"\n"
"color:#2c3d91;\n"
"\n"
"}")
self.GET.setCheckable(False)
self.GET.setChecked(False)
self.GET.setFlat(False)
self.GET.setObjectName("GET")
self.textEdit = QtWidgets.QTextEdit(main)
self.textEdit.setGeometry(QtCore.QRect(40, 90, 431, 71))
font = QtGui.QFont()
font.setFamily("Minecrafter")
font.setPointSize(20)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.textEdit.setFont(font)
self.textEdit.viewport().setProperty("cursor", QtGui.QCursor(QtCore.Qt.IBeamCursor))
self.textEdit.setStyleSheet("color:#dbd3d3;\n"
"background-color:#2e2e2e ;\n"
"border:none;\n"
"font: 20pt \"Minecrafter\";")
self.textEdit.setObjectName("textEdit")
self.label = QtWidgets.QLabel(main)
self.label.setGeometry(QtCore.QRect(60, 0, 391, 81))
font = QtGui.QFont()
font.setFamily("Minecrafter")
font.setPointSize(25)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.label.setFont(font)
self.label.setStyleSheet("font: 25pt \"Minecrafter\";")
self.label.setObjectName("label")
self.label_2 = QtWidgets.QLabel(main)
self.label_2.setGeometry(QtCore.QRect(160, 200, 231, 31))
font = QtGui.QFont()
font.setFamily("Minecrafter")
font.setPointSize(10)
font.setBold(False)
font.setItalic(False)
font.setWeight(50)
self.label_2.setFont(font)
self.label_2.setStyleSheet("font: 10pt \"Minecrafter\";")
self.label_2.setObjectName("label_2")
self.pic = QtWidgets.QLabel(main)
self.pic.setGeometry(QtCore.QRect(100, 200, 61, 51))
self.pic.setText("")
# Текстовая строка интерпретируется как текст в формате Markdown.
# Это значение перечисления было добавлено в Qt 5.14.
#self.pic.setTextFormat(QtCore.Qt.MarkdownText)
self.pic.setTextFormat(QtCore.Qt.PlainText)
self.pic.setPixmap(QtGui.QPixmap("res/no.png"))
self.pic.setObjectName("pic")
self.line = QtWidgets.QFrame(main)
self.line.setGeometry(QtCore.QRect(-60, 180, 591, 20))
self.line.setFrameShape(QtWidgets.QFrame.HLine)
self.line.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line.setObjectName("line")
self.line_2 = QtWidgets.QFrame(main)
self.line_2.setGeometry(QtCore.QRect(20, 0, 21, 191))
self.line_2.setFrameShape(QtWidgets.QFrame.VLine)
self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line_2.setObjectName("line_2")
self.line_3 = QtWidgets.QFrame(main)
self.line_3.setGeometry(QtCore.QRect(470, 0, 21, 191))
self.line_3.setFrameShape(QtWidgets.QFrame.VLine)
self.line_3.setFrameShadow(QtWidgets.QFrame.Sunken)
self.line_3.setObjectName("line_3")
self.retranslateUi(main)
QtCore.QMetaObject.connectSlotsByName(main)
def retranslateUi(self, main):
_translate = QtCore.QCoreApplication.translate
main.setWindowTitle(_translate("main", "Погода"))
self.GET.setText(_translate("main", "Получить погоду"))
self.label.setText(_translate("main", "Укажите город"))
self.label_2.setText(_translate("main", "Не получена погода"))
self.label_2.adjustSize()
class Dialog(QtWidgets.QDialog, Ui_main):
def __init__(self):
super().__init__()
self.setupUi(self)
self.GET.clicked.connect(self.weather_city)
def weather_city(self):
print("WORKING")
self.label_2.setAlignment(QtCore.Qt.AlignCenter)
self.label_2.setText("WORKING")
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Dialog()
w.show()
sys.exit(app.exec_())