这是一个简单的堆栈显示程序,带有使用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
只有在python超过其最大递归深度时,错误才会继续重复第62行和第71行。
只有在添加pushStack
后才会发生大量错误,所以我不知道如何解决这个问题,因为我只有A2级python知识。该计划很好,Stack
被调入MainWindow
并在mainGrid
中使用。
答案 0 :(得分: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
(而不是在将操作连接到按钮时),则需要 not 直接调用它:
self.pushButton.clicked.connect(self.pushStack)
请注意,现在连接了self.pushStack
方法,而不是返回值。
此处无理由将self.stack
传递给self.pushStack()
;该方法也可以在没有self.stack
参数的情况下访问stack
def pushStack(self):
# ...
self.stack.push(item)