Python 背景在单独的窗口中透明,该窗口具有计数器tkinter

Python 背景在单独的窗口中透明,该窗口具有计数器tkinter,python,function,tkinter,tkinter-canvas,python-class,Python,Function,Tkinter,Tkinter Canvas,Python Class,我想在帧上倒计时,但为了创建计数器,我必须使用文本、标签或其他有背景的小部件,但我只需要在帧上显示数字,因此我考虑在当前帧上创建另一个窗口,并尝试使用Toplevel()几秒钟后抓取并销毁帧。但是我在调用倒计时()和编写定义时遇到了困难。 我只想倒计时数字显示在我的框架,这些数字应该有透明的背景。 我一直在调用countdown()并根据新的框架顶部定义countdown。在我的代码中,我试图在画布上显示数字 class ExampleApp(Tk): def __init__(self

我想在帧上倒计时,但为了创建计数器,我必须使用文本、标签或其他有背景的小部件,但我只需要在帧上显示数字,因此我考虑在当前帧上创建另一个窗口,并尝试使用Toplevel()几秒钟后抓取并销毁帧。但是我在调用倒计时()和编写定义时遇到了困难。 我只想倒计时数字显示在我的框架,这些数字应该有透明的背景。 我一直在调用countdown()并根据新的框架顶部定义countdown。在我的代码中,我试图在画布上显示数字

class ExampleApp(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.canvas = Canvas(self, width=2085, height=1080, bg='#020A2E')
        self.canvas.pack()
        top = Toplevel(self)
        top.grab_set()
        top.label = Label(self, text="", font='Arial 90 bold', fg='red',bg='black')
        top.label.place(x=100,y=100)
        top.wm_attributes("-transparentcolor", "black")
        top.remaining = 1
        self.countdown(3)
        top.grab_release()

    def countdown(self, remaining = None):
        if remaining is not None:
            self.remaining = remaining

        if self.remaining <= 0:
            self.label.configure(text="")
            self.label.destroy()
        else:
            self.top.label.configure(text="%d" % self.remaining)
            self.remaining = self.remaining - 1
            self.after(1000, self.countdown)
类示例应用程序(Tk):
定义初始化(自):
Tk.\uuuuuu初始(自我)
self.canvas=canvas(self,宽度=2085,高度=1080,背景=020A2E)
self.canvas.pack()
顶层=顶层(自我)
顶部。抓斗集()
top.label=label(self,text=”“,font='Arial 90 bold',fg='red',bg='black')
顶部标签位置(x=100,y=100)
top.wm_属性(“透明色”、“黑色”)
顶部剩余=1
自我倒计时(3)
顶部。抓斗释放()
def倒计时(自身,剩余=无):
如果剩余值不是无:
自我剩余=剩余

如果self.remaining一旦知道如何/何时调用倒计时,就可以获得更好的解决方案。但这里有一个基于您的代码的版本:

class TopWin(Toplevel):
    def __init__(self):
        Toplevel.__init__(self)
        self.title('Window 2')
        self.geometry()
        self.canvas = Canvas(self, width=150, height=150, bg='#020A2E')
        self.canvas.pack()
        self.grab_set()
        self.label = Label(self.canvas, font='Arial 90 bold', fg='red',bg='black')
        self.label.place(x=5,y=5)
        self.wm_attributes("-transparentcolor", "black")
        self.remaining = 1
        self.countdown(3)
        self.grab_release()
        
    def countdown(self, remaining = None):
        if remaining is not None:
            self.remaining = remaining

        if self.remaining <= 0:
            self.label.configure(text="")
            self.destroy()
        else:
            self.label.configure(text="%d" % self.remaining)
            self.remaining = self.remaining - 1
            self.after(1000, self.countdown)
           
class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.master = master
        self.master.title('Window 1')
        self.master.geometry('500x500')
        self.label = Label(self.master)
        self.label.pack()
        self.topWin = TopWin()
        
      
root = Tk()
app = App(root)
app.topWin.countdown(15)
root.mainloop()
class TopWin(顶级):
定义初始化(自):
顶层初始化(自)
self.title(“窗口2”)
self.geometry()
self.canvas=canvas(self,宽度=150,高度=150,背景=020A2E)
self.canvas.pack()
self.grab_set()
self.label=label(self.canvas,font='Arial 90 bold',fg='red',bg='black')
self.label.place(x=5,y=5)
self.wm_属性(“透明色”、“黑色”)
自剩余=1
自我倒计时(3)
self.grab_release()
def倒计时(自身,剩余=无):
如果剩余值不是无:
自我剩余=剩余

如果self.remaining感谢您的回答,但在您的代码中,您创建了两个窗口,但倒计时显示在第一个窗口中,而我希望倒计时显示在第二个窗口上,此第二个窗口需要完全透明,因为它应该只显示数字。我刚刚编辑了我的答案。试试这个版本。但从一开始,倒计时就显示在第二个窗口中。我为两个窗口都添加了标题。所以你现在更容易识别。在代码中,一旦定义了self.canvas,就忘了将其分配给标签。我现在改正了。如果需要,标签的位置也可以设置为x=0和y=0。还有一个建议:当倒计时从两位数变为一位数(10到9)时,可以将数字设置为两位数,如(09 08..etc)。您需要做的是将label.configure中的%d替换为%02d。好运气你为什么不使用self.canvas.create_text(…)
在主窗口上显示倒计时?