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

2024-09-30 05:23:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个简单的小游戏来熟悉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()在每次单击按钮后都会显示正确的标签,但不是最佳的,因为计算机的转弯需要单独的单击:

^{pr2}$

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


Tags: lambda计算机updateroot按钮labeldeckhuman
1条回答
网友
1楼 · 发布于 2024-09-30 05:23:12

如果我理解你的要求,你可能在找Tk.update()。如果你打电话根目录更新()就在前面根。后(2000),这将执行强制刷新并使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()函数完成时无响应。在

相关问题 更多 >

    热门问题