Я новичок в PySide2, начал использовать его вчера. Я учу себя из документации API и информации, которую я нахожу онлайн. Я пытаюсь сделать небольшое приложение, чтобы научить себя. Моя идея для приложения заключалась в том, чтобы использовать модель, похожую на вид, когда вы нажимаете go на определенных кнопках, я удаляю текущий макет в окне и представляю вам совершенно новый. Это способствует модульности, поскольку каждый макет не будет зависеть друг от друга, а будет полностью индивидуальным. (Каждая часть приложения сильно отличается и требует удаления почти всех виджетов.)
Однако всякий раз, когда я ищу, как удалить макет или удалить все его виджеты, я всегда сталкиваюсь с таким фрагментом кода ( Это на самом деле из вопроса, заданного 6 месяцев go):
def clearLayout(self, layout):
if layout is not None:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget is not None:
widget.deleteLater()
else:
self.clearLayout(item.layout())
Тем не менее, когда я реализую что-то подобное, даже точно такую же функцию, а затем вызываю ее, используя self.clearLayout(self.layout)
, я получаю следующее ошибка:
File "GUI.py", line 45, in home
self.clearLayout(self.layout)
File "GUI.py", line 16, in clearLayout
while layout.count():
AttributeError: 'builtin_function_or_method' object has no attribute 'count'
Я предполагаю, что, вероятно, забыл импортировать что-то важное, но я не могу просто найти что. Вот список с моими импортами.
import sys
from PySide2.QtWidgets import QApplication, QLabel, QLineEdit, QWidget
from PySide2.QtWidgets import QDialog, QPushButton, QVBoxLayout, QLayout
Я также установил PySide2, используя pip install PySide2
в командной строке (Anaconda). Должен ли я сделать что-то еще?
Большое спасибо, извините, пост так долго, просто хотел дать вам всю информацию с самого начала:)
РЕДАКТИРОВАТЬ: дальнейшее тестирование привело Я понимаю, что не могу использовать ни одну из виртуальных функций QLayout или его подклассов. По-видимому, я должен реализовать их сам в коде. Я верю, что это может быть так. Я не знаю, как их реализовать, хотя. Я буду продолжать пытаться.
РЕДАКТИРОВАТЬ 2: Некоторые люди просили воспроизводимый пример, так что вот код, который не работает.
import sys
from PySide2.QtWidgets import QApplication, QLabel, QLineEdit, QWidget
from PySide2.QtWidgets import QDialog, QPushButton, QVBoxLayout, QLayout
class Window(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("Program")
self.setGeometry(300, 300, 300, 300)
self.start()
def clearLayout(self, layout):
if layout is not None:
while layout.count():
item = layout.takeAt(0)
widget = item.widget()
if widget is not None:
widget.deleteLater()
else:
self.clearLayout(item.layout())
def start(self):
self.startbutton = QPushButton("Start App")
layout = QVBoxLayout()
layout.addWidget(self.startbutton)
self.setLayout(layout)
self.startbutton.clicked.connect(self.home)
def home(self):
self.clearLayout(self.layout)
self.message=QLabel("Welcome to homepage")
layout=QVBoxLayout()
layout.addWidget(self.message)
self.setLayout(layout)
if __name__ == "__main__":
app = QApplication([])
window=Window()
window.show()
sys.exit(app.exec_())