1

PyQt5とPython3.3を使ったGUI付きのシンプルなスタック表示プログラムです。間に強調表示された 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

Python が最大再帰深度を超えるまで、エラーは 62 行目と 71 行目で繰り返されます。

大規模なエラーは、追加した後にのみ発生したpushStackため、A2 レベルの Python の知識しかないため、これを修正する方法がわかりません。プログラムはStackに呼び出されMainWindowて使用されても問題ありませんでしたmainGrid

4

1 に答える 1

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()、コードのどこにもそのループから抜け出せません。

ここでどちらかの呼び出しを削除するか、再帰呼び出しが何を達成するかを決定し、2 つのメソッドの一方が他方を呼び出さない条件を作成する必要があります。

self.mainViewWidgetほとんどの場合、スタックに何かをプッシュするたびに を最初から再作成する必要はありません。また、(アクションをボタンに接続したときではなく) がクリックself.pushStackされたときに呼び出されることを意図している場合は、直接呼び出す必要はありません。pushButton

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

戻り値ではなく、self.pushStack メソッドが接続されていることに注意してください。

ここに行く理由はありません。そのメソッドも引数なしでアクセスできますself.stackself.pushStack()self.stackstack

def pushStack(self):
    # ...
    self.stack.push(item)
于 2013-11-07T16:50:30.850 に答える