Python / Tkinter:延迟后更新按钮文本

时间:2017-07-09 21:48:21

标签: python tkinter

我正在编写一个简单的小slapjack游戏,以熟悉Python和Tkinter。我有一个让玩家轮到他的按钮,但是我仍然坚持如何让计算机轮流使用。

这将使计算机轮流使用,但在deal()返回之前不会更新lbl_btn上的文本,这意味着我从未看到人类玩过的卡片:

lbl_btn = Button(root, textvariable=varCard, command=lambda: slap()).pack()
deal_btn = Button(root, text="deal", command=lambda: deal()).pack()

def deal():
    varTurn.get() % 2 == 0
    pile.append(human.deck[0])
    human.deck.remove(human.deck[0])
    update_label()
    root.after(2000)
    pile.append(compy.deck[0])
    compy.deck.remove(compy.deck[0])
    update_label()


def update_label():
    varTurn.set(varTurn.get()+1)
    print(pile[len(pile)-1].name)
    varCard.set(pile[len(pile)-1].name)

此版本的deal()在每次点击按钮后显示正确的标签,但不是最佳标签,因为计算机需要单独点击:

def deal():
if varTurn.get() % 2 == 0:
    pile.append(human.deck[0])
    human.deck.remove(human.deck[0])
else:
    pile.append(compy.deck[0])
    compy.deck.remove(compy.deck[0])
varTurn.set(varTurn.get()+1)
print(pile[len(pile)-1].name)
varCard.set(pile[len(pile)-1].name)

我知道标签按钮在我的lambda完成之前不会更新,但在这种情况下,如何在延迟之后创建对deal的单独调用,这将导致更新{的值{1}}?

1 个答案:

答案 0 :(得分:2)

如果我理解您的要求,您可能正在寻找Tk.update()。如果你在root.after(2000)之前调用root.update(),这将执行强制刷新并导致Tkinter更新UI。

作为一个例子(我修改了你的代码):

from Tkinter import *

deck1 = ['A', 'B', 'C']
deck2 = ['D', 'E', 'F']
pile = []

def deal():
    varTurn.get() % 2 == 0
    pile.append(deck1[0])
    deck1.remove(deck1[0])
    update_label()
    root.update()
    root.after(2000)
    pile.append(deck2[0])
    deck2.remove(deck2[0])
    update_label()


def update_label():
    varTurn.set(varTurn.get()+1)
    print(pile[len(pile)-1])
    varCard.set(pile[len(pile)-1])

root = Tk()
varCard = StringVar()
varTurn = IntVar()
lbl_btn = Button(root, textvariable=varCard, command=lambda: slap()).pack()
deal_btn = Button(root, text="deal", command=lambda: deal()).pack()
root.mainloop()

这会导致在绘制新卡片后立即刷新顶部按钮文本。请注意,这最终可能不是实现游戏的最佳方式,因为即使按钮​​更新以显示新卡,GUI也会在等待deal()函数完成时无响应。