2016-12-03 45 views
0

我有這個程序模擬一個堆棧,我用listbox來表示這個,唯一的問題是當我添加第一個元素時,它添加到頂部的listbox而不是底端。添加到列表框的底部

這是我的計劃是什麼樣子:

enter image description here

紅色是被添加的元素,其中,該綠色是其中的要素應加

我需要改變的功能是Add(),我已經添加了整個代碼,因爲沒有很多,任何人都可以複製它。

對於這個問題,我已經試過stack.insert("end", data),我已經試過stack.insert(END, data),但它仍然添加到列表框中

這裏的頂部是代碼

from tkinter import * 

Window = Tk() # window 

Window.geometry("400x200+50+50") # heightxwidth+x+y 
Window.title("Stack Emulator") 

mainPanel = Canvas(Window, width = 400, height = 200) # :) 
mainPanel.pack() # :) 

global stack 
stack = Listbox(height = 8) 

# methods 
def Add(data): 
    data = data.get() 
    stack.insert(0, data) 
    stack.see(0) 

def Remove(): 
    stack.delete(0) 
    stack.see(0) 

# buttons 
data = StringVar() 
enter = Entry(width = 10, textvariable = data) 
add = Button(text = "Push", command = lambda *args: Add(data)) 
remove = Button(text = "Pop", command = lambda *args: Remove()) 

# stack 
mainPanel.create_text(100, 20, text = "Stack", font = ("Purisa", 14, "bold")) 
mainPanel.create_window(100, 35, window = stack, anchor = "n") 
mainPanel.create_rectangle(37, 34, 162, 167) 

# methods 
mainPanel.create_text(180, 40, text = "Element:", font = ("Purisa", 12), anchor = "nw") 
mainPanel.create_window(250, 40, window = enter, anchor = "nw") 
mainPanel.create_window(180, 60, window = add, anchor = "nw") 
mainPanel.create_window(180, 90, window = remove, anchor = "nw") 

回答

0

列表框不以這種方式工作。您只能從上往下添加項目。

+0

這是一個恥辱:(這不是我的倒票btw –

+0

除了'insert(END,data)'實際上工作,就像'delete(END)'一樣,有一些文檔支持up,http ://effbot.org/tkinterbook/listbox.htm,其中聲明使用'END'附加到列表框中。 – mhawke

+1

@mhawke:是,「end」(或常量'END')附加到列表框的末尾。列表框的「結尾」與列表框的「底部」不一樣,OP希望數據從底部向上滾動,而不是從頂部向下滾動。 –

1

由於@BryanOakley在his answer中指出,列表框通常不允許將行添加到列表框小部件的底部。有一個變通不過,那就是先墊空字符串的框,然後使用END從末端添加/刪除/:

#global stack 
stack = Listbox(height=8) 
stack.count = 0 
# fill the listbox with empty lines 
for i in range(stack.cget('height')-1): 
    stack.insert(END, '') 

# methods 
def Add(data): 
    stack.insert(END, data.get()) 
    stack.see(END) 
    stack.count += 1 

def Remove(): 
    if stack.count > 0: 
     stack.delete(END) 
     stack.see(END) 
     stack.count -= 1 

此代碼初始化有足夠的空列表框使得附加到它的字符串將出現在底部。在列表框對象上創建屬性count以跟蹤堆棧上的項目數。這是因爲彈出空的堆棧不會刪除填充行。

+0

這是一個很好的方法來做到這一點,但我的程序有其他功能,從堆棧中獲取元素,我可以做到這一點,但我認爲它的代碼比它的價值更高。 –