2016-04-23 65 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中的新功能:超時參數。

也許它符合你的目的。