Python Forum

Full Version: Tkinter fading bubble text
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
Was just playing around with popup bubble text. Cant seem to get more than one at a time to popup but, all will popup after the one before fades.
All thoughts are welcome.


Added a move up effect while bubble fades

import tkinter as tk
from random import randrange, uniform, choice
from time import time

class Bubble(tk.Tk):
    ''' Class creates popup window '''
    def __init__(self, *args, text='Default Text', **kwargs):
        super().__init__(*args, **kwargs)

        # Instance variables removes titlebar and grabs focus of window
        self.wait_visibility(self)
        self.wm_attributes('-topmost', True)
        self.wm_attributes('-alpha', 0.9)
        self.wm_attributes('-type', 'splash')
        self.focus_force()

        # Get time window opens, set duration for window, and set opacity of window
        self.start = time()
        self.duration = 5
        self.opacity = float(0.9)

        self.label = tk.Label(self, text=text, padx=10, pady=10, bg='#fffdd0')
        self.label.pack(fill='x', expand=True)
        self.label.configure(
            wraplength = 300,
            justify = 'left',
            font = (None, 14, 'normal')
        )

        # get window info for positioning of window
        self.update()

        # Calculations for window geometry
        x = self.winfo_screenwidth()//2, self.winfo_screenwidth()-int(self.winfo_screenwidth())
        self.xpos = randrange(x[0], self.winfo_screenwidth()-int(self.label.winfo_width()*0.9))
        
        self.ypos = int(self.winfo_screenheight()*uniform(0.2, 0.4))
        
        # Set window geometry
        self.geometry(f'{self.label.winfo_width()}x{self.label.winfo_height()}+{self.xpos}+{self.ypos}')

        # Start timer and mainloop
        self.timer()
        self.mainloop()
        


    def timer(self):
        ''' Method for countdown timer '''
        counter = self.duration + self.start - time()
        seconds = int(divmod(counter, 60)[1])

        # Call timer every one second
        self._timer = self.after(1000, self.timer)

        if seconds == 1:
            self.fade()

    def move(self):
        ''' Method for moving bubble up '''
        self.ypos -= 20

    def fade(self):
        ''' Method for creating fade and move up effect '''
        self.opacity -= float(0.1)
        self.wm_attributes('-alpha', self.opacity)
        disolve = self.after(100, self.fade)
        up = self.after(0, self.move)
        self.geometry(f'{self.label.winfo_width()}x{self.label.winfo_height()}+{self.xpos}+{self.ypos}')

        if self.opacity <= float(0.0):
            self.after_cancel(self._timer)
            self.after_cancel(disolve)
            self.after_cancel(up)
            self.destroy()

messages = [
    'Hello World! This is a random messages.',
    'The skys are blue and the clouds are white and fluffy.',
    'I look at you and my blood boils hot, I feel my temperature rise.',
    'Who\'s that knocking at the door? Is it you again? You can love me tonight, \
if you want. In the moring make sure your gone.'
]

t = Bubble(text=choice(messages))
Thought I would add a video. Used a loop to do five popups