Tiếng Việt

Hướng dẫn tạo Trend Popup

Hướng dẫn chi tiết cách tạo ứng dụng popup tự động với Python và Tkinter, tạo hiệu ứng popup liên tục với màu sắc và nội dung ngẫu nhiên.

Yêu cầu

  • Python 3.x
  • Thư viện tkinter (thường đi kèm với Python)

Cấu trúc chương trình

Chương trình gồm các phần chính:

  1. Danh sách thông điệp: Lưu trữ các câu "I love you" bằng nhiều ngôn ngữ
  2. Danh sách màu pastel: Màu nền ngẫu nhiên cho popup
  3. Class StickyPopup: Quản lý việc tạo và đóng popup

Code hoàn chỉnh

import tkinter as tk
import random
import threading
import time

# Danh sách "I love you" bằng nhiều ngôn ngữ
LOVE_MESSAGES = [
    "I love you",  # English
    "Aku cinta kamu",  # Indonesian/Malay
    "Saya cinta kamu",  # Indonesian (formal)
    "Jag älskar dig",  # Swedish
    "Ich liebe dich",  # German
    "Je t'aime",  # French
    "Anh yêu em",  # Vietnamese
    "愛してる",  # Japanese
    "मैं तुमसे प्यार करता हू",  # Hindi
    "Taim i' ngra leat",  # Irish Gaelic
    "Σ' αγαπώ",  # Greek
    "Te amo",  # Spanish
    "Я люблю тебя",  # Russian
    "爱你",  # Chinese
    "Jeg elsker deg",  # Danish/Norwegian
    "Eu te amo",  # Portuguese
    "Ti amo",  # Italian
    "Ik hou van jou",  # Dutch
    "Seni seviyorum",  # Turkish
    "أحبك",  # Arabic
    "사랑해",  # Korean
    "Mahal kita",  # Filipino/Tagalog
    "Volim te",  # Croatian/Serbian
    "Miluji tě",  # Czech
    "Szeretlek",  # Hungarian
    "Te iubesc",  # Romanian
    "Kocham cię",  # Polish
    "Ég elska þig",  # Icelandic
    "Minä rakastan sinua",  # Finnish
    "Te quiero",  # Spanish (alternative)
]

# Màu pastel ngẫu nhiên
PASTEL_COLORS = [
    "#FFB6C1",  # Light pink
    "#FFA07A",  # Light salmon
    "#FFD700",  # Gold
    "#98FB98",  # Pale green
    "#87CEEB",  # Sky blue
    "#DDA0DD",  # Plum
    "#F0E68C",  # Khaki
    "#FFE4E1",  # Misty rose
    "#E0E0E0",  # Light gray
    "#B0E0E6",  # Powder blue
    "#FFEFD5",  # Papaya whip
    "#F5DEB3",  # Wheat
    "#D8BFD8",  # Thistle
    "#FFE4B5",  # Moccasin
    "#E6E6FA",  # Lavender
    "#FFF8DC",  # Cornsilk
    "#F0F8FF",  # Alice blue
    "#FFE4E1",  # Misty rose
    "#FFF0F5",  # Lavender blush
    "#F5FFFA",  # Mint cream
]

class StickyPopup:
    def __init__(self):
        self.root = tk.Tk()
        self.root.withdraw()  # Ẩn cửa sổ chính
        self.running = True
        self.popups = []  # Danh sách các popup đang mở
        
    def create_popup(self):
        """Tạo một popup mới với màu và text ngẫu nhiên"""
        if not self.running:
            return
            
        # Tạo cửa sổ popup
        popup = tk.Toplevel()
        popup.title("tk")
        
        # Thêm popup vào danh sách
        self.popups.append(popup)
        
        # Chọn màu và text ngẫu nhiên
        bg_color = random.choice(PASTEL_COLORS)
        message = random.choice(LOVE_MESSAGES)
        
        # Thiết lập kích thước cố định và vị trí ngẫu nhiên
        width = 250
        height = 100
        x = random.randint(0, self.root.winfo_screenwidth() - width)
        y = random.randint(0, self.root.winfo_screenheight() - height)
        
        popup.geometry(f"{width}x{height}+{x}+{y}")
        popup.configure(bg=bg_color)
        
        # Thêm label với text
        label = tk.Label(
            popup,
            text=message,
            bg=bg_color,
            font=("Arial", 12, "bold"),
            wraplength=width - 20,
            justify="center"
        )
        label.pack(expand=True, fill="both", padx=10, pady=10)
        
        # Đóng popup khi click vào nút X và xóa khỏi danh sách
        def on_close():
            if popup in self.popups:
                self.popups.remove(popup)
            popup.destroy()
        
        popup.protocol("WM_DELETE_WINDOW", on_close)
        
    def auto_close(self):
        """Tự động đóng tất cả popup và ứng dụng sau 10 giây"""
        self.running = False  # Dừng tạo popup mới
        
        # Đóng tất cả popup đang mở
        for popup in self.popups[:]:  # Copy list để tránh lỗi khi modify trong loop
            try:
                popup.destroy()
            except:
                pass
        
        self.popups.clear()
        
        # Đóng cửa sổ chính và thoát
        self.root.quit()
        self.root.destroy()
    
    def start_creating_popups(self):
        """Bắt đầu tạo popup liên tục"""
        def create_loop():
            while self.running:
                try:
                    self.create_popup()
                    time.sleep(0.05)  # Tạo popup mới mỗi 0.05 giây (20 popup/giây)
                except:
                    break
        
        # Chạy trong thread riêng để không block UI
        thread = threading.Thread(target=create_loop, daemon=True)
        thread.start()
        
    def run(self):
        """Chạy ứng dụng"""
        self.start_creating_popups()
        # Tự động tắt sau 10 giây (10000 milliseconds)
        self.root.after(10000, self.auto_close)
        try:
            self.root.mainloop()
        except KeyboardInterrupt:
            self.running = False

if __name__ == "__main__":
    app = StickyPopup()
    app.run()

Giải thích từng phần

1. Import thư viện

import tkinter as tk
import random
import threading
import time
  • tkinter: Tạo giao diện cửa sổ popup
  • random: Chọn ngẫu nhiên màu và thông điệp
  • threading: Tạo popup trong thread riêng để không block UI
  • time: Điều khiển tốc độ tạo popup

2. Khởi tạo class

def __init__(self):
    self.root = tk.Tk()
    self.root.withdraw()  # Ẩn cửa sổ chính
    self.running = True
    self.popups = []  # Danh sách các popup đang mở
  • self.root.withdraw(): Ẩn cửa sổ chính, chỉ hiển thị popup
  • self.running: Flag để kiểm soát việc tạo popup
  • self.popups: Lưu trữ danh sách popup để quản lý

3. Tạo popup

def create_popup(self):
    popup = tk.Toplevel()
    bg_color = random.choice(PASTEL_COLORS)
    message = random.choice(LOVE_MESSAGES)
    
    width = 250
    height = 100
    x = random.randint(0, self.root.winfo_screenwidth() - width)
    y = random.randint(0, self.root.winfo_screenheight() - height)
    
    popup.geometry(f"{width}x{height}+{x}+{y}")
    popup.configure(bg=bg_color)
  • tk.Toplevel(): Tạo cửa sổ popup mới
  • Vị trí ngẫu nhiên trên màn hình
  • Màu nền và thông điệp được chọn ngẫu nhiên

4. Tạo popup liên tục

def start_creating_popups(self):
    def create_loop():
        while self.running:
            self.create_popup()
            time.sleep(0.05)  # 20 popup/giây
    
    thread = threading.Thread(target=create_loop, daemon=True)
    thread.start()
  • Sử dụng thread riêng để không block UI
  • time.sleep(0.05): Tạo popup mới mỗi 0.05 giây (20 popup/giây)
  • daemon=True: Thread tự động dừng khi chương trình kết thúc

5. Tự động đóng

def auto_close(self):
    self.running = False
    for popup in self.popups[:]:
        popup.destroy()
    self.root.quit()
  • Dừng tạo popup mới
  • Đóng tất cả popup đang mở
  • Thoát ứng dụng

Cách chạy

  1. Lưu code vào file sticky_popup.py
  2. Chạy lệnh:
python sticky_popup.py

Tùy chỉnh

Thay đổi tốc độ tạo popup

time.sleep(0.05)  # Thay đổi giá trị này
# 0.1 = 10 popup/giây
# 0.05 = 20 popup/giây
# 0.02 = 50 popup/giây

Thay đổi thời gian tự động đóng

self.root.after(10000, self.auto_close)  # 10000 = 10 giây
# 5000 = 5 giây
# 30000 = 30 giây

Thay đổi kích thước popup

width = 250   # Chiều rộng
height = 100  # Chiều cao

Thêm thông điệp mới

Thêm vào danh sách LOVE_MESSAGES:

LOVE_MESSAGES = [
    # ... các thông điệp hiện có
    "Thông điệp mới của bạn",
]

Thêm màu mới

Thêm vào danh sách PASTEL_COLORS:

PASTEL_COLORS = [
    # ... các màu hiện có
    "#HEXCODE",  # Tên màu
]

Lưu ý

  • Popup sẽ tự động đóng sau 10 giây
  • Có thể đóng từng popup bằng nút X
  • Sử dụng Ctrl+C để dừng chương trình sớm
  • Tốc độ tạo popup cao có thể ảnh hưởng hiệu năng hệ thống
Posted onwith tags: