队列

时间:2016-04-23 11:17:17

标签: python python-3.x tkinter-canvas

我试图在我的tkinter程序中从队列的前面出一个随机的形状。我尝试了is_empty()方法,但我似乎遇到了错误。

>>> AttributeError: 'Queue' object has no attribute 'pop'.

任何帮助都非常感谢!
这是我使用

的队列类
class Queue:
  def __init__(self):
    self.items = []
  def is_empty(self):
    return self.items == []
  def size(self):
    return len(self.items)
  def enqueue(self, item):
    self.items.insert(0, item)
  def dequeue(self):
    return self.items.pop(0)
  def peek(self):
    return self.items[0]

类Recta:

def __init__(self, height=60, width=80 ):
    self.height = height
    self.width = width
    self.create_buttons()
    self.canvas = Canvas(root)
    self.canvas.pack()
    self.queue = Queue()  



def remove_triangle(self):
    if not self.queue.is_empty(): 
         self.canvas.delete(self.queue.pop())

2 个答案:

答案 0 :(得分:4)

您不需要自己编写课程。 Python在其标准库中提供Queue数据结构。您可以使用deque中的collections数据结构。

from collections import deque
q = deque()
q.append(5)
print q.pop()

请参阅deque here的文档。

在您的情况下,只需创建一个deque对象而不是Queue对象。

from collections import deque
class Recta:
    def __init__(self, height=60, width=80 ):
        self.height = height
        self.width = width
        self.create_buttons()
        self.canvas = Canvas(root)
        self.canvas.pack()
        self.queue = deque()  



def remove_triangle(self):
    if not self.queue.is_empty(): 
         self.canvas.delete(self.queue.pop())

答案 1 :(得分:0)

我正在查看Queue的Python文档(see here)并且我看不到名为pop的方法。也许这就是你错误的原因。但是,我能看到的是以下方法:

Queue.get([block [,timeout]]) 从队列中删除并返回一个项目。如果可选的args块为true且timeout为None(默认值),则在必要时阻止,直到某个项可用为止。如果timeout是一个正数,它会阻止最多超时秒,如果在该时间内没有可用的项,则会引发Empty异常。否则(块为假),如果一个项立即可用,则返回一个项,否则引发Empty异常(在这种情况下忽略超时)。

2.3版中的新功能:超时参数。

也许它符合你的目的。