2016-12-03 71 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

这是一个很好的方法来做到这一点,但我的程序有其他功能,从堆栈中获取元素,我可以做到这一点,但我认为它的代码比它的价值更高。 –