2016-03-21 143 views
1

リストボックスのデータを自動的に更新したいと思います。私のコードに何が問題なの?Tkinterリストボックスのテキスト変数を更新するには

import Tkinter,time 
from Tkinter import * 
window=Tk() 
box=Tkinter.Listbox(window,width=17,height=12,fg="black") 
data=0 
box.grid(row=0,column=0) 
box.insert(Tkinter.END,data) 
def monitor(): 
    global data 
    print data 
    while True: 
     time.sleep(1) 
     data=data+1 
     box.update() 
window.after(10,monitor) 
window.mainloop() 
+0

何が間違っていますか? – zondo

+0

リストボックスは常に0を表示します。 –

+0

これは、 'box'が渡されたオブジェクトの* name *には何の注意も払わないためです。オブジェクトにのみ注意を払っています。実際には、オブジェクトの名前が「データ」であることを知る方法はありません。 'data = data + 1'と言うと、オブジェクト自体は変更されていません。あなたは 'data'を別の番号を参照させています。 'data'を再度挿入する必要があります。私はそれが 'box.delete(Tkinter.END);を意味すると思います。 box.insert(Tkinter.END、data) ' – zondo

答えて

2

まず、コードと一致するようにしてください。

  • いずれかを使用し、ライブラリ
import Tkinter as tk 

第二のインポートの一種、while Trueの構築物は、可能な場合は省略されるべきです。 メインルーチンでwindow.afterを使用しましたが、なぜあなたのモニター機能でもそうしないのですか?

def monitor(): 
    global data 


    # do the work that needs to be done... 

    # after uses ms, to calling monitor 
    # after 1000 ms is the same as calling 
    # sleep(1) in your while true construct 
    window.after(1000, monitor) 

最後に、zodoが正しい場合、リストボックスのデータをたとえば削除/挿入の組み合わせ。

import Tkinter as tk 
window = tk.Tk() 
box = tk.Listbox(window, width=17, height=12, fg="black") 
data = 0 
box.grid(row=0, column=0) 
box.insert(tk.END, data) 

def monitor(): 
    global data 

    print data 

    data = data + 1 
    # Update the listbox 
    # 1. clear all 
    box.delete(0, tk.END) 
    # 2. insert new data 
    box.insert(tk.END, data) 
    window.after(1000, monitor) 

window.after(10, monitor) 
window.mainloop() 
+0

ボックスまたはウィンドウをグローバルとして宣言する必要はありません。 –

+0

それは私のために面白いです - どうですか、ブライアンですか? – R4PH43L

+0

Pythonは関数内にグローバル変数を自動的に公開します。変数を変更した場合にのみ宣言する必要があります。 'box.delete'を呼び出すと、変数を変更していないので、オブジェクトのメソッドを呼び出すだけです。 https://docs.python.org/2/faq/programming.html#what-are-the-rules-for-local-and-global-variables-in-python –

関連する問題