我正在编写一个简单的小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}}?
答案 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()函数完成时无响应。