Ошибка: TypeError: 'QMainWindow' object is not callable
Открываю второе окно истории; первый раз открывается, потом закрывается, а при повторном действии выдаёт ошибку:
TypeError: 'QMainWindow' object is not callable.
main.py:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from oneicran import Ui_oneicran
from hictori import Ui_hictori
#главное окно
app = QtWidgets.QApplication(sys.argv)
oneicran = QtWidgets.QDialog()
ui = Ui_oneicran()
ui.setupUi(oneicran)
oneicran.show()
def beak():
hictori.close()
oneicran.show()
def hictori():
#история
global hictori
hictori = QtWidgets.QMainWindow()
ui = Ui_hictori()
ui.setupUi(hictori)
oneicran.close()
hictori.show()
ui.commandLinkButton.clicked.connect(lambda:beak())
ui.pushButton_4.clicked.connect(lambda:hictori())
sys.exit(app.exec_())
Помогите пожалуйста решить проблему. Заранее спасибо!!!
Ответы (2 шт):
def hictori():
^^^^^^^ функция
#история
global hictori
^^^^^^^ переменная
hictori = QtWidgets.QMainWindow()
^^^^^^^ переменная
...
ui.pushButton_4.clicked.connect(lambda:hictori())
^^^^^^^ функция
У вас выше отмеченные мной функция и переменная имеют абсолютно одинаковое название. Питон их не никак не различает со своей динамической типизацией, для него все объекты одинаковые, это всё просто переменные, тип их он узнаёт только в момент их использования (и потом тут же забывает обратно). После присваивания hictori = QtWidgets.QMainWindow() переменная hictori перестаёт указывать на функцию и начинает указывать на объект типа QtWidgets.QMainWindow. Поэтому следующий вызов lambda:hictori() уже не может вызвать вашу функцию, а пытается вызвать этот объект QMainWindow как функцию.
Назовите разными именами переменную и функцию для начала. Хотя думаю в вашем коде будут и другие проблемы, вы, судя по стилю кода, пока не очень понимаете, что вообще происходит и как нужно писать программы.
Пожалуйста, всегда предоставляйте минимально-воспроизводимый пример.
Вы не предоставили модули oneicran.py и hictori.py и я не смог проверить то что написал.
Глобальные переменные - это ЗЛО.
Создайте другой класс, который наследуется от соответствующего виджета, и используйте созданный класс для его заполнения.
Вот как примерно может выглядеть ваше приложение:
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from oneicran import Ui_oneicran
from hictori import Ui_hictori
class HictoriWindow(QtWidgets.QMainWindow, Ui_hictori):
def __init__(self, parent=None):
super(HictoriWindow, self).__init__(parent)
self.setupUi(self)
self.parent = parent
self.commandLinkButton.clicked.connect(self.go_main)
def go_main(self):
self.parent.show()
self.hide()
#главное окно
class MainWindow(QtWidgets.QDialog, Ui_oneicran):
def __init__(self):
super().__init__()
self.setupUi(self)
self.commandLinkButton.clicked.connect(self.go_hictori)
self.hictori = HictoriWindow(self)
self.hictori.hide()
def go_hictori(self):
self.hictori.show()
self.hide()
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())