2013-11-07 2 views
1

Это простая программа отображения стека с графическим интерфейсом с использованием PyQt5 и Python3.3. Gui программа область ошибок выделена между ###Error####Использование экземпляра одного класса в другом

#Modules 
import sys 
from PyQt5 import QtGui, QtCore, QtWidgets 
import stacks_queues 

#Classes 
class MainWindow(QtWidgets.QMainWindow): 
    '''Main Window''' 

    #Constructor 
    def __init__(self): 
     super(MainWindow,self).__init__() 
     self.createUI() 

    #Methods 

###Error### 
    def createUI(self): 
     self.stack = stacks_queues.Stack() 
     #Title 
     self.setWindowTitle('Section 2.4: Stacks and queues') 
     #Window Components 
     self.mainViewWidget = QtWidgets.QWidget() 
     #Layouts 
     self.mainViewWidget.setLayout(self.mainGrid(self.stack)) 
     self.setCentralWidget(self.mainViewWidget) 
###Error### 

    def mainGrid(self,stack): 
     #Layout components 
     self.mainLayout = QtWidgets.QVBoxLayout() 
     self.addRemoveLayout = QtWidgets.QGridLayout() 
     self.pushButtonLayout = QtWidgets.QHBoxLayout() 
     #Create components 
     #Labels 
     self.titleLabel = QtWidgets.QLabel('Implementation of a Stack', self) 
     self.counterLabel = QtWidgets.QLabel('Number of items in stack: 0', self) 
     self.contentsLabel = QtWidgets.QLabel('Contents of stack', self) 
     self.addWordLabel = QtWidgets.QLabel('Word to add:', self) 
     self.removeWordLabel = QtWidgets.QLabel('Word being removed', self) 
     #Buttons 
     self.pushButton = QtWidgets.QPushButton('Push', self) 
     self.popButton = QtWidgets.QPushButton('Pop', self) 
     #Line Edit 
     self.addWordLineEdit = QtWidgets.QLineEdit('', self) 
     self.removeWordLineEdit = QtWidgets.QLineEdit('Test', self) 
     self.removeWordLineEdit.isReadOnly() 
     #Text Edit 
     self.stackTextEdit = QtWidgets.QTextEdit('', self) 
     self.stackTextEdit.isReadOnly() 
     #Add Widgets 
     self.mainLayout.addWidget(self.titleLabel) 
     self.addRemoveLayout.addWidget(self.addWordLabel, 0,0) 
     self.addRemoveLayout.addWidget(self.removeWordLabel, 1,0) 
     self.addRemoveLayout.addWidget(self.addWordLineEdit, 0,1) 
     self.addRemoveLayout.addWidget(self.removeWordLineEdit, 1,1) 
     self.mainLayout.addLayout(self.addRemoveLayout) 
     self.mainLayout.addWidget(self.contentsLabel) 
     self.mainLayout.addWidget(self.stackTextEdit) 
     self.mainLayout.addWidget(self.counterLabel) 
     self.pushButtonLayout.addWidget(self.pushButton) 
     self.pushButtonLayout.addWidget(self.popButton) 
     self.mainLayout.addLayout(self.pushButtonLayout) 
     #Connections 
     self.pushButton.clicked.connect(self.pushStack(self.stack)) 
     self.popButton.clicked.connect(self.popStack) 
     return self.mainLayout 

###Error### 
    def pushStack(self,stack): 
     item = self.addWordLineEdit.text() 
     self.stack.push(item) 
     #Re-draw Window 
     self.mainViewWidget = QtWidgets.QWidget() 
     self.mainViewWidget.setLayout(self.mainGrid(self.stack)) 
     self.setCentralWidget(self.mainViewWidget) 
###Error### 

    def popStack(self): 
     #Not finished yet 
     pass 


#Functions 
def Main(): 
    '''Main Program''' 
    #Creates new application 
    application = QtWidgets.QApplication(sys.argv) 
    #Creates new instance of MainWindow 
    mainWindow = MainWindow() 
    #Display MainWindow 
    mainWindow.show() 
    #Keep MainWindow on top 
    mainWindow.raise_() 
    #Monitor for events 
    application.exec_() 
#Run Main 
Main() 

Импортной программой

class Stack(): 
    '''Stack data''' 
    #Attributes 
    items = [] 
    maxsize = 0 

    #Methods 
    def push(self,item): 
     self.items.append(item) 

    def pop(self,item): 
     self.items.pop() 

    def isEmpty(self): 
     if self.items: 
      return False 
     else: 
      return True 

    def size(self): 
     self.maxsize = len(self.items) 

Ошибка 1993 линии длинной, так что я только покажу основные ошибки, которые не устают повторять.

Traceback (most recent call last): 
    File "C:\Users\Luke\Documents\A-Level-Work\A2\Computing\COMP 3\stack_queues_gui.py", line 92, in <module> 
    Main() 
    File "C:\Users\Luke\Documents\A-Level-Work\A2\Computing\COMP 3\stack_queues_gui.py",  line 84, in Main 
    mainWindow = MainWindow() 
    File "C:\Users\Luke\Documents\A-Level-Work\A2\Computing\COMP 3\stack_queues_gui.py",  line 13, in __init__ 
    self.createUI() 
    File "C:\Users\Luke\Documents\A-Level-Work\A2\Computing\COMP 3\stack_queues_gui.py", line 23, in createUI 
    self.mainViewWidget.setLayout(self.mainGrid(self.stack)) 
    File "C:\Users\Luke\Documents\A-Level-Work\A2\Computing\COMP 3\stack_queues_gui.py",  line 62, in mainGrid 
    self.pushButton.clicked.connect(self.pushStack(self.stack)) 
    File "C:\Users\Luke\Documents\A-Level-Work\A2\Computing\COMP 3\stack_queues_gui.py",   line 71, in pushStack 

Ошибка продолжает повторяться линиями 62 и 71 только до тех пор, пока питон не превысит максимальную глубину рекурсии.

Массивная ошибка произошла только после того, как я добавил pushStack, поэтому я понятия не имею, как исправить это, поскольку у меня есть только знание уровня P2 на уровне A2. Программа была в порядке с Stack, вызываемой в MainWindow и используемой в mainGrid.

+1

Вы имеете в виду у вас есть 'InfiniteRecursion' исключение здесь? Вы отключили фактическое сообщение об исключении. –

+1

Мне любопытно. Что вы понимаете под «знанием питона на уровне A2»? – That1Guy

+0

Знание питона уровня A2 означает, что все мои знания в области кодирования взяты из учебного плана уровня А, который является квалификацией в шестой форме в Англии. Так что я дерьмо в основном. – user1921942

ответ

2

Вы создали бесконечную рекурсию:

def mainGrid(self,stack): 
    # ... 
    self.pushButton.clicked.connect(self.pushStack(self.stack)) 

называет

def pushStack(self,stack): 
    # ... 
    self.mainViewWidget.setLayout(self.mainGrid(self.stack)) 

Смотрите self.mainGrid() там? Но self.mainGrid() звонит self.pushStack(), и нигде в вашем коде вы не выходите из этого цикла.

Вам нужно удалить один или другой вызов здесь или определить, что должен делать рекурсивный вызов, и создать условия, при которых один из двух методов выполняет , а не.

Скорее всего, вам не нужно воссоздавать self.mainViewWidget с нуля каждый раз, когда вы нажимаете что-то в стеке. Кроме того, если вы имели в виду self.pushStack называться, когда pushButton является щелкнул (а не тогда, когда вы подключить действие к кнопке), необходимо не назвать это непосредственно:

self.pushButton.clicked.connect(self.pushStack) 

Обратите внимание, что в настоящее время используется метод self.pushStack, а не возвращаемое значение.

Существует нет причин пройти self.stack до self.pushStack() здесь; этот метод может получить доступ к self.stack без stack аргумента слишком

def pushStack(self): 
    # ... 
    self.stack.push(item) 
+0

Спасибо, что вела меня с ума на века! Причина, по которой он повторно отображает экран, заключается в том, что когда программа будет завершена, он обновит окно редактирования текста, чтобы отобразить все данные в стеке.Если вы не имели в виду, что есть способ обновить его новыми данными, что упростит ситуацию, но я не знаю, как это сделать. – user1921942

+0

Я не слишком хорошо знаком с Qt, если честно. Помогает ли [этот вопрос] (http://stackoverflow.com/questions/10416582/replacing-layout-on-a-qwidget-with-another-layout)? –

+0

Это больше связано с изменением компоновки, чем с обновлением новых данных. – user1921942

Смежные вопросы