2016-12-03 2 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)'と同様に動作します。 ://effbot.org/tkinterbook/listbox.htm、リストボックスの最後に 'END'を追加するとリストボックスに追加されます。 – mhawke

+1

@mhawke:" end "(または定数' END')リストボックスの「終わり」はリストボックスの「ボトム」と同じではありません。オペレータはデータを上から上にではなく下から上にスクロールしたいと考えています –

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

これは良い方法ですが、私のプログラムはスタックから要素を得る他の機能を持っていますが、私はこれを行うことができますが、その価値よりも多くのコードを考えています。 –

関連する問題