1

Tkinter after() メソッドで問題が発生しています。実は、私がやりたいのは、時間の経過とともにいくつかのエントリ ボックスの背景色を変更することです。このコードを見てみましょう (これは私が取り組んでいるスクリプトとは異なりますが、説明されている状況は同じです)。

import Tkinter as tk

root = tk.Tk()
root.option_add("*Entry.Font","Arial 32 bold")

emptyLabel=tk.Label()
emptyLabel.grid(row=4) #Empty label for geometry purpose
entryList=[]

for x in range(4):
    entryList.append([])
    for y in range(4):
        entryList[x].append('')
        entryList[x][y]=tk.Entry(root, bg="white",width=2,justify="center",
                                 takefocus=True,insertofftime=True)
        entryList[x][y].grid(row=x,column=y)

solvebt=tk.Button(root,text='Solve').grid(row=5,column=2)
newgamebt=tk.Button(root,text='New').grid(row=5,column=1)

#BROKEN PART STARTS HERE 

def changebg(x,y):
    entryList[x][y]['bg']='yellow'

for x in range(4):
    for y in range(4):
        entryList[x][y].after(300,changebg(x,y))
        #Same result with root.after(300,changebg(x,y))


root.mainloop()

問題は、プログラムを起動すると、すべてのエントリ ボックスが一度に 1 つずつ黄色で "ペイント" されることを期待することです。代わりに、プログラムが (300*16) ミリ秒間フリーズし、すべてのエントリ ボックスが突然黄色になります。

4

1 に答える 1

1

問題はここにあります:

def changebg(x,y):
    entryList[x][y]['bg']='yellow'

for x in range(4):
    for y in range(4):
        entryList[x][y].after(300,changebg(x,y))
        #Same result with root.after(300,changebg(x,y))

double for ループですぐに を呼び出しchangebgています。次に、戻り値 ( None) を に渡していますroot.after。これは、あなたが説明する遅延にはつながりません。おそらく、実際のコードは次のようになります。

for x in range(4):
    for y in range(4):
        entryList[x][y].after(300,lambda x=x,y=y : changebg(x,y))

それはあなたが実際に説明する行動につながります。最終的に必要なのは、ウィジェットのリストを平坦化してから、一度に 1 つずつ渡すことです。次のものが存在する場合は登録します。

import itertools
all_entries = itertools.chain.from_iterable(entryList)
def changebg(ientries):
    ientries = iter(ientries) #allow passing a list in as well ...
    entry = next(ientries,None)
    if entry is not None:
        entry['bg'] = 'yellow' #change the color of this widget
        root.after(300,lambda : changebg(ientries)) #wait 300ms and change color of next one.

changebg(all_entries)
于 2013-02-24T19:50:12.613 に答える