2016-04-23 64 views
0

我试图在我的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()) 
+0

烨生病编辑我的回答 –

+0

我看到你的编辑,感谢,但你可以在文档中检查[队列](https://docs.python.org/2/library/queue.html)对象没有这样的'pop()'方法。 –

+0

哇,我刚刚意识到这一点。我只是尝试用self.canvas.dequeue(self.queue)替换它,但仍然出现错误 –

回答

2

你不需要写你自己的类。 Python在其标准库中提供Queue数据结构。您可以使用collectionsdeque数据结构。

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

请参阅dequehere的文档。

对于您的情况,只需创建一个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()) 
+0

所以我只需要去q = deque()self.canvas.q(self.queue)?? –

+0

当我尝试导入双端队列时,它给了我一个错误。 –

+0

@ M.Jones您正在使用哪种Python版本?如果您使用的是Python3,则需要从集合中导入双端队列。 – letmutx

0

我期待在Python文档队列现在(see here),我看不出一个名为方法流行。也许这就是你错误的原因。但是,我可以看到的是以下方法:

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

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

也许它符合你的目的。