【问题标题】:Python/Tkinter: Update button text after delayPython/Tkinter:延迟后更新按钮文本
【发布时间】:2017-07-09 21:48:21
【问题描述】:

我正在编写一个简单的小游戏来熟悉 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 的单独调用,这将导致更新 lbl_btn 的值?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    如果我理解您的问题,您可能正在寻找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() 函数完成时无响应。

    【讨论】:

    • 在这两个方面都正确。这确实会产生我正在寻找的更新行为,并且还会使按钮在 deal() 返回之前无响应。关于如何重组的任何想法?我考虑过多线程计算机的轮到和“slap”机制(这对我来说将是另一个第一次......)
    • 您可能需要考虑在对 after() 的调用中添加第二个参数。看看这个问题here。这样,您可以将您的转牌交易逻辑分成两个函数并在相同的两秒后调用计算机交易函数,但您将在等待期间将控制权交还给 tkinter 主循环。请记住,如果用户在两秒到期之前再次点击交易,您将不得不处理会发生什么,因此它变得有点复杂。让我知道这是否有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-21
    相关资源
    最近更新 更多