Доступ и редактирование элементов пользовательского интерфейса между разными классами в PyQT5 - PullRequest
0 голосов
/ 03 августа 2020

Я нахожусь в процессе написания кода, который генерирует главное окно «TopLevel», в которое вводится информация, а затем при нажатии кнопки открывается другое окно, и эта информация отправляется и просматривается / редактируется / взаимодействует с это окно. Похоже, я пробовал все способы, которые я мог найти на этом и других веб-сайтах, чтобы попытаться получить доступ к элементам пользовательского интерфейса (будь то метки, текстовые поля или, в этом конкретном случае c, словарь) между разными классами, и пока ничего не сработало.

Я отредактировал приведенный ниже код, чтобы были доступны все соответствующие элементы, и эта версия работает до того момента, когда возникает ошибка. Пользователь вводит все, что хочет, в поле под «Элементы словаря ввода», щелкает «Готово», чтобы добавить его в список под «Список элементов словаря», а затем может нажать «Развернуть» под крайним левым полем, чтобы открыть второе окно, которое Я хочу передать список в.

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QDesktopWidget, QMessageBox, QPushButton, QAction, qApp, QMenu, QLineEdit, QLabel, QTextEdit, QComboBox, QScrollArea, QVBoxLayout, QScrollBar, QListWidget
from PyQt5.QtGui import QFont, QIcon
from PyQt5.QtCore import pyqtSlot, QCoreApplication, QMetaObject, QRect

def setKey(dictionary, key, value):
    if key not in dictionary:
        dictionary[key] = value
    elif type(dictionary[key]) == list:
        dictionary[key].append(value)
    else:
        dictionary[key] = [dictionary[key], value]

class TopLevel(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.setWindowTitle('Top Level')
        self.resize(800,550)
        topLevelLabel = QLabel(self)
        topLevelLabel.setText('Top level of tree')
        self.topLevelBox = QTextEdit(self)
        self.topLevelBox.resize(200,50)
        self.topLevelBox.move(60,100)
        topLevelLabel.move(60,70)
        
        topLevelExpandButton = QPushButton('Expand', self)
        topLevelExpandButton.resize(50,30)
        topLevelExpandButton.move(100,150)
        topLevelExpandButton.pressed.connect(self.open_New_Window_Expand)
       
        selectSCLabel = QLabel(self)
        selectSCLabel.setText('Input dictionary elements')
        self.selectSCBox = QTextEdit(self)
        self.selectSCBox.resize(300,50)
        self.selectSCBox.move(300,100)
        selectSCLabel.move(300,60)
        selectSCLabel.resize(400,50)
        
        selectSCConfirmationButton = QPushButton('Done', self)
        selectSCConfirmationButton.resize(40,30)
        selectSCConfirmationButton.move(560,150)
        selectSCConfirmationButton.pressed.connect(self.selectSCConfirmationButtonPressed)

        listOfSelectedSCLabel = QLabel(self)
        listOfSelectedSCLabel.setText('List of dictionary elements')
        listOfSelectedSCLabel.setWordWrap(True)
        listOfSelectedSCLabel.move(60,190)
        listOfSelectedSCLabel.resize(200,30)
        self.listOfSelectedSCArea = QScrollArea(self)
        self.placeholderListItem = QWidget()
        self.vboxOfListItems = QVBoxLayout()
        self.listOfSelectedSCArea.move(60,220)
        self.listOfSelectedSCArea.resize(200,300)
        self.listOfSelectedSCArea.setVerticalScrollBarPolicy(0)
        self.listOfSelectedSCArea.setHorizontalScrollBarPolicy(0)
        self.listOfSelectedSCArea.setWidgetResizable(True)
        
        self.listOfSelectedSCDictionary = {}
        self.SCIterate = 1
        self.show() 
        
    def open_New_Window_Expand(self):
        self.new_window = QMainWindow
        self.ui = NewLevelExpand()
        self.show()
        
    def selectSCConfirmationButtonPressed(self):
        newSCName = self.selectSCBox.toPlainText()
        nameToLabel = QLabel(self)
        nameToLabel.setText(newSCName)
        self.vboxOfListItems.addWidget(nameToLabel)
        self.placeholderListItem.setLayout(self.vboxOfListItems)
        self.listOfSelectedSCArea.setWidget(self.placeholderListItem)
        setKey(self.listOfSelectedSCDictionary, self.SCIterate, newSCName)
        self.SCIterate = self.SCIterate + 1
        print(self.listOfSelectedSCDictionary)
        
class NewLevelExpand(TopLevel):
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self, parent = TopLevel):
        self.setWindowTitle('Expanded Level')
        self.resize(800,550)
        print(self.listOfSelectedSCDictionary)

        self.show()

def main():
    app = QApplication(sys.argv)
    tl = TopLevel()
    sys.exit(app.exec_())
    
if __name__ == '__main__':
    main()

Работая с этим кодом, я сгенерировал множество различных сообщений об ошибках, но приведенный выше код выдает сообщение: «AttributeError: объект 'NewLevelExpand' не имеет атрибута 'listOfSelectedSCDictionary '"

Как я уже сказал, я чувствую, что перепробовал все, что связано с этим c topi в stackoverflow, и ничего не сработало. Любые советы и рекомендации, указывающие на глупые ошибки, предложения по изменению моего стиля кодирования, чтобы сделать его более понятным и т. Д. c. будут очень признательны.

1 Ответ

0 голосов
/ 04 августа 2020

Предпосылка: Я не могу вам сильно помочь с логикой c, стоящей за вашей программой; Должен признать, это немного сбивает с толку, и я не понимаю, как вы собираетесь передавать данные в новое окно и как вы собираетесь их использовать.

Ошибка, которую вы Обращение вызвано тем, что NewLevelExpand является подклассом TopLevel, и когда вы вызываете его super().__init__(), это приводит к вызову __init__() предка *.

В классе TopLevel __init__() вызывает initUI, который создает весь UI и словарь listOfSelectedSCDictionary.

Проблема в том, что вы переопределяете initUI в подклассе, поэтому в результате базовый класс initUI не вызывается никогда (это означает, что пользовательский интерфейс и словарь фактически не создаются).

Решение этой специфической проблемы c состоит в том, чтобы вызвать реализацию базового класса initUI в подклассе:

class NewLevelExpand(TopLevel):
    # ...
    def initUI(self):
        <b>super().initUI()</b>
        self.setWindowTitle('Expanded Level')
        self.resize(800,550)
        print(self.listOfSelectedSCDictionary)
...