【问题标题】:Why does my tkinter label suddenly disappear?为什么我的 tkinter 标签突然消失了?
【发布时间】:2020-08-19 18:56:04
【问题描述】:

我正在尝试制作一个国际象棋 AI。我需要一套国际象棋才能下棋。我制作了棋子(它们可以拖动)、棋盘、时钟等。现在,我正试图让时钟在有人演奏时交替出现。在我的一项让时钟交替的测试中,ai 的时钟突然消失了。我检查了是否忘记添加网格方法,将其放入根目录,保存等。我做了所有这些。我尝试更改行中的数字。原来是0。我试了1,又出现了。但它不在我想要的位置,所以我再次将数字从 1 更改为 2,看看它是否仍然有效。但它消失了。我放了一个,但它仍然不见了(如果我保存了,我检查了两次)。这是ai时钟的代码:

from root_frame import Root
from tkinter import Label

ai_turn = False

class AI: 
    def __init__(self):      
        self.the_screen = Root()       
        self.ai_label = Label(self.the_screen.root, text = "AI", font = "Helvetica 18 bold", width = 40)
        self.ai_clock = Label(self.the_screen.root, font = "Helvetica 18 bold")
    
    def set_timer(self):
        self.t = 600
        return self.t

    def countdown(self):
        global ai_turn

        if self.t > 0 and ai_turn == True:
            self.convert()
            self.t = self.t - 1
            self.ai_clock.after(1000, lambda: self.countdown())
            print("it's running dum dum")

        elif self.t == 0:
            self.ai_clock.config(text = "ai loose")
        
        elif ai_turn == False:
            print("it's not running dum dum")
            self.t = self.t

    def convert(self): 
        self.seconds = self.t % (24 * 3600) 
        self.seconds %= 3600
        self.minutes = self.t // 60
        self.seconds %= 60
        self.ai_clock.config(text = "%02d:%02d" % (self.minutes, self.seconds))

    def stop(self):
        global ai_turn
        ai_turn = False
        if ai_turn == False:
            print("ai stopped, value: {}".format(ai_turn))

    def go(self):
        global ai_turn
        ai_turn = True
        if ai_turn == True:
            print("ai active, value: {}".format(ai_turn))

这里是我对它们进行网格划分的地方:

class Screen:
    def __init__(self):
        self.AI = AI()
        self.Human = Human()
        self.AI.ai_clock.grid(row = 0, column = 9)
        self.Human.human_clock.grid(row = 7, column = 8)

        "Run functions to activate the clocks"
        self.AI.set_timer()
        self.AI.countdown()
        self.Human.set_timer()
        self.Human.countdown()

最后,这里是 root_frame:

from tkinter import Tk

class Root:
    root = Tk()

(有缩进,因为它在方法中)谢谢!

【问题讨论】:

  • 这是我存储 root = Tk() 的地方。
  • 我的代码中很多地方都用到了它,所以我决定把它放在一个文件中。这是它唯一包含的东西
  • 这是我的一项测试。当我添加go方法时,时钟没有走,所以我认为它没有改变什么的。所以我通过 if 语句确定了这一点。而self.t是一个错误,我会删除它。
  • 我添加了它。它只包含 root = Tk()
  • 构建 MRE 是您排除故障的一部分。通过将问题缩小到更小的问题,您可能会自己发现它为什么不起作用。如果没有,那么您可以在此处发布该 MRE。使用现在的代码方式,我们无法运行它,因此无法测试问题。如果您根本无法减少代码或不知道如何在问题中发布指向 pastebin 的链接,并注意您不确定如何将其减少为 MRE。我不能说它不会被否决,但有人可能会帮助您学习如何使用该代码发布。

标签: python tkinter label


【解决方案1】:

您只调用一次self.AI.countdown()。在其中,您仅在 self.t>0ai_turn == True 时启动计时器。但是,ai_turnFalse,因此计时器永远不会启动。如果在程序开始时将 ai_turn 设置为 True,则计时器将起作用。

要发现这一点,您只需在 if 语句之前放置一个 print 语句,以验证您对这些变量的假设。此外,如果你给标签一个不同的颜色,你会看到它在屏幕上但很小,因为默认情况下它没有文本。

换句话说,标签看起来很好,只要你有启动计时器的逻辑,它就会正确更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2012-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多