背景在具有 counter-tkinter 的单独窗口中透明

Posted

技术标签:

【中文标题】背景在具有 counter-tkinter 的单独窗口中透明【英文标题】:background transparent in separate window which has counter-tkinter 【发布时间】:2020-11-07 12:25:27 【问题描述】:

我想在我的框架上进行倒计时,但为了创建计数器,我必须使用文本或标签或其他有背景的小部件,但我只需要在框架上显示数字,所以我想创建当前框架上的另一个窗口,我尝试使用 Toplevel() 和 grab_set 并在几秒钟后销毁框架。但是我在调​​用 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)

【问题讨论】:

为什么不用self.canvas.create_text(...)在主窗口显示倒计时? 【参考方案1】:

一旦知道如何/何时调用倒计时,就可以实现更好的解决方案。但这是一个基于您的代码的版本:

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()

【讨论】:

感谢您的回答,但在您的代码中,您正在创建两个窗口,但倒计时显示在第一个窗口中,而我希望它在第二个窗口上,并且第二个窗口需要完全透明为它应该只显示数字。 我刚刚编辑了我的答案。试试这个版本。但从一开始,倒计时就显示在第二个窗口中。我为两个窗口添加了标题。因此,您现在更容易识别。在您的代码中,一旦定义了标签,您就忘记将 self.canvas 分配给它。我现在更正了。如果需要,您也可以将标签的位置设置为 x=0 和 y=0。 另外一个建议: 倒计时从两位数变为一位数(10 到 9)时,您可以通过将数字设置为两位数来摆脱黑色背景像(09 08 ..等)。您需要做的是将 label.configure 中的 %d 替换为 %02d。祝你好运

以上是关于背景在具有 counter-tkinter 的单独窗口中透明的主要内容,如果未能解决你的问题,请参考以下文章

使用 ImageMagick 创建的动画 gif 具有故障块颜色背景

使用图像中的轮廓创建单独的图像?

Flexbox 高度和背景图像高度

从简单/普通的背景中提取图像

SVN单独用户具有某个文件夹的单独权限设置

如何在 Java 中调用具有单独线程的方法?