rbpop


Namerbpop JSON
Version 0.3.1 PyPI version JSON
download
home_pagehttps://github.com/EagleBaby/rbpop
SummaryA lightweight, modern PyQt6 popup notification library with smooth animations, queue management, and multiple preset styles.
upload_time2025-09-06 20:12:25
maintainerEagle'sBaby
docs_urlNone
authorEagle'sBaby
requires_python>=3.10
licenseMIT
keywords pyqt6 popup notification toast message dialog window
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # rbpop - Elegant PyQt6 Popup Notification Library

A lightweight, modern PyQt6 popup notification library with smooth animations, queue management, and multiple preset styles.

## 🚀 Quick Start

### 1. Installation

```bash
pip install rbpop
```

### 2. Create Popup in One Line

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPMsg

app = QApplication([])  # Must create QApplication first
QPop(QPMsg("Operation successful!"))  # That's it!
```

## 🎯 Pre-built Popup Components

### QPMsg - Basic Message Popup
Simple message notification with default blue theme

```python
from rbpop import QPop, QPMsg

# Basic usage
QPop(QPMsg("Task completed"))

# Full parameters
QPop(QPMsg("message content", title="Title", duration=3000))
```

### Preset Type Popups

| Type | Color | Use Case |
|------|-------|----------|
| `QPInfo` | 🟢 Green | Success messages |
| `QPWarn` | 🟡 Yellow | Warning alerts |
| `QPError` | 🔴 Red | Error notifications |

```python
from rbpop import QPop, QPInfo, QPWarn, QPError

# Success notification
QPop(QPInfo("Data saved successfully!"))

# Warning alert
QPop(QPWarn("Network connection unstable"))

# Error notification
QPop(QPError("Save failed, please retry"))
```

## 🎨 Custom Popups

### Inherit QPMsg for Custom Popups

Create custom popups with specific styles and functionality by inheriting `QPMsg`:

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPMsg

class MySuccessMsg(QPMsg):
    def __init__(self, msg):
        super().__init__(msg, title="✅ Success", duration=2500)
        self.setStyleSheet("""
            background-color: #2ecc71;
            color: white;
            border-radius: 8px;
            font-weight: bold;
        """)

# Use custom popup
app = QApplication([])
QPop(MySuccessMsg("File upload completed!"))
```

### Add Custom Components

Add buttons, input fields, and other interactive elements:

```python
from PyQt6.QtWidgets import QPushButton, QHBoxLayout
from rbpop import QPop, QPMsg

class ConfirmMsg(QPMsg):
    def __init__(self, msg, on_confirm=None):
        super().__init__(msg, title="Confirm Action", duration=0)  # 0 means don't auto-close
        self.on_confirm = on_confirm
        
        # Add confirm button
        self.btn_confirm = QPushButton("Confirm")
        self.btn_confirm.clicked.connect(self.confirm)
        self.layout().addWidget(self.btn_confirm)
    
    def confirm(self):
        if self.on_confirm:
            self.on_confirm()
        self.close()

# Use confirmation popup
app = QApplication([])
def handle_confirm():
    print("User confirmed the action")

QPop(ConfirmMsg("Are you sure you want to delete this file?", on_confirm=handle_confirm))
```

## 🎯 Real-world Usage Scenarios

### Scenario 1: User Action Feedback

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPInfo, QPError

app = QApplication([])

def save_data():
    try:
        # Save logic
        save_to_database()
        QPop(QPInfo("Data saved successfully!"))
    except Exception as e:
        QPop(QPError(f"Save failed: {str(e)}"))
```

### Scenario 2: Batch Processing Progress

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPInfo

app = QApplication([])

# Batch processing notifications (auto-queued)
for i in range(1, 6):
    QPop(QPInfo(f"Processing progress: {i}/5", duration=1000))
```

### Scenario 3: Custom Theme Popups

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPMsg

class DarkMsg(QPMsg):
    def __init__(self, text):
        super().__init__(text, title="Dark Mode")
        self.setStyleSheet("""
            background-color: #2c3e50;
            color: #ecf0f1;
            border: 1px solid #34495e;
            border-radius: 6px;
        """)

app = QApplication([])
QPop(DarkMsg("Switched to dark mode"))
```

## 📋 Complete API Reference

### QPMsg Parameters

```python
QPMsg(message, title=None, duration=4000, **kwargs)
```

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `message` | str | Required | Message content |
| `title` | str | None | Window title |
| `duration` | int | 4000 | Display duration in ms (0 = don't auto-close) |
| `close` | bool | False | Show close button |
| `slide_in` | bool | True | Enable slide-in animation |
| `slide_duration` | int | 800 | Animation duration in ms |

### Preset Type Shortcuts

```python
QPInfo(message, title=None, duration=4000)
QPWarn(message, title=None, duration=4000)
QPError(message, title=None, duration=4000)
```

## 🔧 Advanced Controls

### Batch Window Management

```python
from PyQt6.QtWidgets import QApplication
from rbpop.win import WinManager

app = QApplication([])
manager = WinManager.get_instance()

# Batch control all popups
manager.hide_all()   # Hide all
manager.show_all()   # Show all
manager.clear_all()  # Clear all
```

### Animation Effect Control

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPMsg, QPop

app = QApplication([])

# No animation (instant display)
QPop(QPMsg("No animation message", slide_in=False))

# Slow animation
QPop(QPMsg("Slow slide-in", slide_duration=1500))

# Long display time
QPop(QPMsg("Requires user reading", duration=10000))
```

## 🎮 Run Demo

Interactive demo interface included:

```bash
python ui_demo.py
```

Demo features:
- Real-time creation of various popup types
- Batch testing queue management
- Custom colors and styles
- Animation effect testing

## ⚙️ System Requirements

- Python 3.10+
- PyQt6
- Windows/Linux/macOS

## 📦 Project Structure

```
rbpop/
├── __init__.py          # Main entry (exports QPop and preset popups)
├── win/
│   ├── manager.py       # Window manager (WinManager)
│   └── popped.py        # Popup base class (PopWin)
├── prefab/
│   └── message.py       # Preset popup components (QPMsg/QPInfo/QPWarn/QPError)
└── ui_demo.py          # Demo program
```

## 🎯 Usage Summary

| Use Case | Recommended Approach |
|----------|---------------------|
| Quick message | `QPop(QPMsg("message"))` |
| Success/warning/error | `QPop(QPInfo("success"))` |
| Custom styling | Inherit `QPMsg` to create subclass |
| Full customization | Inherit `PopWin` to build from scratch |

## 🤝 Contributing

Issues and Pull Requests are welcome!

## 📄 License

MIT License - see LICENSE file for details

---

# rbpop - 优雅的PyQt6弹窗管理库

一个轻量级、现代化的PyQt6弹窗通知库,支持平滑动画、队列管理和多种预置样式。

## 🚀 快速上手

### 1. 安装

```bash
pip install rbpop
```

### 2. 一行代码创建弹窗

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPMsg

app = QApplication([])  # 必须先创建QApplication
QPop(QPMsg("操作成功!"))  # 就这么简单!
```

## 🎯 预置弹窗组件

### QPMsg - 基础消息弹窗
最简单的消息提示,默认蓝色主题

```python
from rbpop import QPop, QPMsg

# 基础用法
QPop(QPMsg("操作完成"))

# 完整参数
QPop(QPMsg("消息内容", title="标题", duration=3000))
```

### 预置类型弹窗

| 类型 | 颜色 | 用途 |
|------|------|------|
| `QPInfo` | 🟢 绿色 | 成功信息 |
| `QPWarn` | 🟡 黄色 | 警告提醒 |
| `QPError` | 🔴 红色 | 错误提示 |

```python
from rbpop import QPop, QPInfo, QPWarn, QPError

# 成功提示
QPop(QPInfo("数据保存成功!"))

# 警告提醒  
QPop(QPWarn("网络连接不稳定"))

# 错误提示
QPop(QPError("保存失败,请重试"))
```

## 🎨 自定义弹窗

### 继承QPMsg创建自定义弹窗

通过继承`QPMsg`类,可以快速创建具有特定样式和功能的弹窗:

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPMsg

class MySuccessMsg(QPMsg):
    def __init__(self, msg):
        super().__init__(msg, title="✅ 成功", duration=2500)
        self.setStyleSheet("""
            background-color: #2ecc71;
            color: white;
            border-radius: 8px;
            font-weight: bold;
        """)

# 使用自定义弹窗
app = QApplication([])
QPop(MySuccessMsg("文件上传完成!"))
```

### 添加自定义组件

在继承类中添加按钮、输入框等自定义组件:

```python
from PyQt6.QtWidgets import QPushButton, QHBoxLayout
from rbpop import QPop, QPMsg

class ConfirmMsg(QPMsg):
    def __init__(self, msg, on_confirm=None):
        super().__init__(msg, title="确认操作", duration=0)  # 0表示不自动关闭
        self.on_confirm = on_confirm
        
        # 添加确认按钮
        self.btn_confirm = QPushButton("确认")
        self.btn_confirm.clicked.connect(self.confirm)
        self.layout().addWidget(self.btn_confirm)
    
    def confirm(self):
        if self.on_confirm:
            self.on_confirm()
        self.close()

# 使用确认弹窗
app = QApplication([])
def handle_confirm():
    print("用户确认了操作")

QPop(ConfirmMsg("确定要删除这个文件吗?", on_confirm=handle_confirm))
```

## 🎯 实际应用场景

### 场景1:用户操作反馈

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPInfo, QPError

app = QApplication([])

def save_data():
    try:
        # 保存逻辑
        save_to_database()
        QPop(QPInfo("数据保存成功!"))
    except Exception as e:
        QPop(QPError(f"保存失败:{str(e)}"))
```

### 场景2:批量处理进度

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPInfo

app = QApplication([])

# 批量处理通知(自动排队)
for i in range(1, 6):
    QPop(QPInfo(f"处理进度:{i}/5", duration=1000))
```

### 场景3:自定义主题弹窗

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPop, QPMsg

class DarkMsg(QPMsg):
    def __init__(self, text):
        super().__init__(text, title="夜间模式")
        self.setStyleSheet("""
            background-color: #2c3e50;
            color: #ecf0f1;
            border: 1px solid #34495e;
            border-radius: 6px;
        """)

app = QApplication([])
QPop(DarkMsg("已切换到夜间模式"))
```

## 📋 完整API参数

### QPMsg 参数说明

```python
QPMsg(message, title=None, duration=4000, **kwargs)
```

| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| `message` | str | 必需 | 消息内容 |
| `title` | str | None | 窗口标题 |
| `duration` | int | 4000 | 显示时长(毫秒,0表示不自动关闭) |
| `close` | bool | False | 是否显示关闭按钮 |
| `slide_in` | bool | True | 是否启用滑入动画 |
| `slide_duration` | int | 800 | 动画时长(毫秒) |

### 预置类型快捷方式

```python
QPInfo(message, title=None, duration=4000)
QPWarn(message, title=None, duration=4000)  
QPError(message, title=None, duration=4000)
```

## 🔧 高级控制

### 批量窗口管理

```python
from PyQt6.QtWidgets import QApplication
from rbpop.win import WinManager

app = QApplication([])
manager = WinManager.get_instance()

# 批量控制所有弹窗
manager.hide_all()   # 隐藏全部
manager.show_all()   # 显示全部  
manager.clear_all()  # 清空全部
```

### 动画效果控制

```python
from PyQt6.QtWidgets import QApplication
from rbpop import QPMsg, QPop

app = QApplication([])

# 无动画(立即显示)
QPop(QPMsg("无动画消息", slide_in=False))

# 慢速动画
QPop(QPMsg("慢速滑入", slide_duration=1500))

# 长时间显示
QPop(QPMsg("需要用户阅读", duration=10000))
```

## 🎮 运行演示

项目内置完整的交互式演示界面:

```bash
python ui_demo.py
```

演示功能:
- 实时创建各种类型弹窗
- 批量测试队列管理  
- 自定义颜色和样式
- 动画效果测试

## ⚙️ 系统要求

- Python 3.10+
- PyQt6
- Windows/Linux/macOS

## 📦 项目结构

```
rbpop/
├── __init__.py          # 主入口(导出QPop和预置弹窗)
├── win/
│   ├── manager.py       # 窗口管理器(WinManager)
│   └── popped.py        # 弹窗基类(PopWin)
├── prefab/
│   └── message.py       # 预置弹窗组件(QPMsg/QPInfo/QPWarn/QPError)
└── ui_demo.py          # 演示程序
```

## 🎯 使用总结

| 需求场景 | 推荐用法 |
|----------|----------|
| 快速消息提示 | `QPop(QPMsg("消息"))` |
| 成功/警告/错误 | `QPop(QPInfo("成功"))` |
| 自定义样式 | 继承`QPMsg`创建子类 |
| 完全自定义 | 继承`PopWin`从零构建 |

## 🤝 参与贡献

欢迎提交Issue和Pull Request!

## 📄 许可证

MIT License - 详见LICENSE文件

            

Raw data

            {
    "_id": null,
    "home_page": "https://github.com/EagleBaby/rbpop",
    "name": "rbpop",
    "maintainer": "Eagle'sBaby",
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "2229066748@qq.com",
    "keywords": "pyqt6, popup, notification, toast, message, dialog, window",
    "author": "Eagle'sBaby",
    "author_email": "2229066748@qq.com",
    "download_url": "https://files.pythonhosted.org/packages/36/70/3d37a7af6227fe904ae7ae396649880f0f4e4a1c04310f8314e3c517f76c/rbpop-0.3.1.tar.gz",
    "platform": null,
    "description": "# rbpop - Elegant PyQt6 Popup Notification Library\r\n\r\nA lightweight, modern PyQt6 popup notification library with smooth animations, queue management, and multiple preset styles.\r\n\r\n## \ud83d\ude80 Quick Start\r\n\r\n### 1. Installation\r\n\r\n```bash\r\npip install rbpop\r\n```\r\n\r\n### 2. Create Popup in One Line\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPMsg\r\n\r\napp = QApplication([])  # Must create QApplication first\r\nQPop(QPMsg(\"Operation successful!\"))  # That's it!\r\n```\r\n\r\n## \ud83c\udfaf Pre-built Popup Components\r\n\r\n### QPMsg - Basic Message Popup\r\nSimple message notification with default blue theme\r\n\r\n```python\r\nfrom rbpop import QPop, QPMsg\r\n\r\n# Basic usage\r\nQPop(QPMsg(\"Task completed\"))\r\n\r\n# Full parameters\r\nQPop(QPMsg(\"message content\", title=\"Title\", duration=3000))\r\n```\r\n\r\n### Preset Type Popups\r\n\r\n| Type | Color | Use Case |\r\n|------|-------|----------|\r\n| `QPInfo` | \ud83d\udfe2 Green | Success messages |\r\n| `QPWarn` | \ud83d\udfe1 Yellow | Warning alerts |\r\n| `QPError` | \ud83d\udd34 Red | Error notifications |\r\n\r\n```python\r\nfrom rbpop import QPop, QPInfo, QPWarn, QPError\r\n\r\n# Success notification\r\nQPop(QPInfo(\"Data saved successfully!\"))\r\n\r\n# Warning alert\r\nQPop(QPWarn(\"Network connection unstable\"))\r\n\r\n# Error notification\r\nQPop(QPError(\"Save failed, please retry\"))\r\n```\r\n\r\n## \ud83c\udfa8 Custom Popups\r\n\r\n### Inherit QPMsg for Custom Popups\r\n\r\nCreate custom popups with specific styles and functionality by inheriting `QPMsg`:\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPMsg\r\n\r\nclass MySuccessMsg(QPMsg):\r\n    def __init__(self, msg):\r\n        super().__init__(msg, title=\"\u2705 Success\", duration=2500)\r\n        self.setStyleSheet(\"\"\"\r\n            background-color: #2ecc71;\r\n            color: white;\r\n            border-radius: 8px;\r\n            font-weight: bold;\r\n        \"\"\")\r\n\r\n# Use custom popup\r\napp = QApplication([])\r\nQPop(MySuccessMsg(\"File upload completed!\"))\r\n```\r\n\r\n### Add Custom Components\r\n\r\nAdd buttons, input fields, and other interactive elements:\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QPushButton, QHBoxLayout\r\nfrom rbpop import QPop, QPMsg\r\n\r\nclass ConfirmMsg(QPMsg):\r\n    def __init__(self, msg, on_confirm=None):\r\n        super().__init__(msg, title=\"Confirm Action\", duration=0)  # 0 means don't auto-close\r\n        self.on_confirm = on_confirm\r\n        \r\n        # Add confirm button\r\n        self.btn_confirm = QPushButton(\"Confirm\")\r\n        self.btn_confirm.clicked.connect(self.confirm)\r\n        self.layout().addWidget(self.btn_confirm)\r\n    \r\n    def confirm(self):\r\n        if self.on_confirm:\r\n            self.on_confirm()\r\n        self.close()\r\n\r\n# Use confirmation popup\r\napp = QApplication([])\r\ndef handle_confirm():\r\n    print(\"User confirmed the action\")\r\n\r\nQPop(ConfirmMsg(\"Are you sure you want to delete this file?\", on_confirm=handle_confirm))\r\n```\r\n\r\n## \ud83c\udfaf Real-world Usage Scenarios\r\n\r\n### Scenario 1: User Action Feedback\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPInfo, QPError\r\n\r\napp = QApplication([])\r\n\r\ndef save_data():\r\n    try:\r\n        # Save logic\r\n        save_to_database()\r\n        QPop(QPInfo(\"Data saved successfully!\"))\r\n    except Exception as e:\r\n        QPop(QPError(f\"Save failed: {str(e)}\"))\r\n```\r\n\r\n### Scenario 2: Batch Processing Progress\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPInfo\r\n\r\napp = QApplication([])\r\n\r\n# Batch processing notifications (auto-queued)\r\nfor i in range(1, 6):\r\n    QPop(QPInfo(f\"Processing progress: {i}/5\", duration=1000))\r\n```\r\n\r\n### Scenario 3: Custom Theme Popups\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPMsg\r\n\r\nclass DarkMsg(QPMsg):\r\n    def __init__(self, text):\r\n        super().__init__(text, title=\"Dark Mode\")\r\n        self.setStyleSheet(\"\"\"\r\n            background-color: #2c3e50;\r\n            color: #ecf0f1;\r\n            border: 1px solid #34495e;\r\n            border-radius: 6px;\r\n        \"\"\")\r\n\r\napp = QApplication([])\r\nQPop(DarkMsg(\"Switched to dark mode\"))\r\n```\r\n\r\n## \ud83d\udccb Complete API Reference\r\n\r\n### QPMsg Parameters\r\n\r\n```python\r\nQPMsg(message, title=None, duration=4000, **kwargs)\r\n```\r\n\r\n| Parameter | Type | Default | Description |\r\n|-----------|------|---------|-------------|\r\n| `message` | str | Required | Message content |\r\n| `title` | str | None | Window title |\r\n| `duration` | int | 4000 | Display duration in ms (0 = don't auto-close) |\r\n| `close` | bool | False | Show close button |\r\n| `slide_in` | bool | True | Enable slide-in animation |\r\n| `slide_duration` | int | 800 | Animation duration in ms |\r\n\r\n### Preset Type Shortcuts\r\n\r\n```python\r\nQPInfo(message, title=None, duration=4000)\r\nQPWarn(message, title=None, duration=4000)\r\nQPError(message, title=None, duration=4000)\r\n```\r\n\r\n## \ud83d\udd27 Advanced Controls\r\n\r\n### Batch Window Management\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop.win import WinManager\r\n\r\napp = QApplication([])\r\nmanager = WinManager.get_instance()\r\n\r\n# Batch control all popups\r\nmanager.hide_all()   # Hide all\r\nmanager.show_all()   # Show all\r\nmanager.clear_all()  # Clear all\r\n```\r\n\r\n### Animation Effect Control\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPMsg, QPop\r\n\r\napp = QApplication([])\r\n\r\n# No animation (instant display)\r\nQPop(QPMsg(\"No animation message\", slide_in=False))\r\n\r\n# Slow animation\r\nQPop(QPMsg(\"Slow slide-in\", slide_duration=1500))\r\n\r\n# Long display time\r\nQPop(QPMsg(\"Requires user reading\", duration=10000))\r\n```\r\n\r\n## \ud83c\udfae Run Demo\r\n\r\nInteractive demo interface included:\r\n\r\n```bash\r\npython ui_demo.py\r\n```\r\n\r\nDemo features:\r\n- Real-time creation of various popup types\r\n- Batch testing queue management\r\n- Custom colors and styles\r\n- Animation effect testing\r\n\r\n## \u2699\ufe0f System Requirements\r\n\r\n- Python 3.10+\r\n- PyQt6\r\n- Windows/Linux/macOS\r\n\r\n## \ud83d\udce6 Project Structure\r\n\r\n```\r\nrbpop/\r\n\u251c\u2500\u2500 __init__.py          # Main entry (exports QPop and preset popups)\r\n\u251c\u2500\u2500 win/\r\n\u2502   \u251c\u2500\u2500 manager.py       # Window manager (WinManager)\r\n\u2502   \u2514\u2500\u2500 popped.py        # Popup base class (PopWin)\r\n\u251c\u2500\u2500 prefab/\r\n\u2502   \u2514\u2500\u2500 message.py       # Preset popup components (QPMsg/QPInfo/QPWarn/QPError)\r\n\u2514\u2500\u2500 ui_demo.py          # Demo program\r\n```\r\n\r\n## \ud83c\udfaf Usage Summary\r\n\r\n| Use Case | Recommended Approach |\r\n|----------|---------------------|\r\n| Quick message | `QPop(QPMsg(\"message\"))` |\r\n| Success/warning/error | `QPop(QPInfo(\"success\"))` |\r\n| Custom styling | Inherit `QPMsg` to create subclass |\r\n| Full customization | Inherit `PopWin` to build from scratch |\r\n\r\n## \ud83e\udd1d Contributing\r\n\r\nIssues and Pull Requests are welcome!\r\n\r\n## \ud83d\udcc4 License\r\n\r\nMIT License - see LICENSE file for details\r\n\r\n---\r\n\r\n# rbpop - \u4f18\u96c5\u7684PyQt6\u5f39\u7a97\u7ba1\u7406\u5e93\r\n\r\n\u4e00\u4e2a\u8f7b\u91cf\u7ea7\u3001\u73b0\u4ee3\u5316\u7684PyQt6\u5f39\u7a97\u901a\u77e5\u5e93\uff0c\u652f\u6301\u5e73\u6ed1\u52a8\u753b\u3001\u961f\u5217\u7ba1\u7406\u548c\u591a\u79cd\u9884\u7f6e\u6837\u5f0f\u3002\r\n\r\n## \ud83d\ude80 \u5feb\u901f\u4e0a\u624b\r\n\r\n### 1. \u5b89\u88c5\r\n\r\n```bash\r\npip install rbpop\r\n```\r\n\r\n### 2. \u4e00\u884c\u4ee3\u7801\u521b\u5efa\u5f39\u7a97\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPMsg\r\n\r\napp = QApplication([])  # \u5fc5\u987b\u5148\u521b\u5efaQApplication\r\nQPop(QPMsg(\"\u64cd\u4f5c\u6210\u529f\uff01\"))  # \u5c31\u8fd9\u4e48\u7b80\u5355\uff01\r\n```\r\n\r\n## \ud83c\udfaf \u9884\u7f6e\u5f39\u7a97\u7ec4\u4ef6\r\n\r\n### QPMsg - \u57fa\u7840\u6d88\u606f\u5f39\u7a97\r\n\u6700\u7b80\u5355\u7684\u6d88\u606f\u63d0\u793a\uff0c\u9ed8\u8ba4\u84dd\u8272\u4e3b\u9898\r\n\r\n```python\r\nfrom rbpop import QPop, QPMsg\r\n\r\n# \u57fa\u7840\u7528\u6cd5\r\nQPop(QPMsg(\"\u64cd\u4f5c\u5b8c\u6210\"))\r\n\r\n# \u5b8c\u6574\u53c2\u6570\r\nQPop(QPMsg(\"\u6d88\u606f\u5185\u5bb9\", title=\"\u6807\u9898\", duration=3000))\r\n```\r\n\r\n### \u9884\u7f6e\u7c7b\u578b\u5f39\u7a97\r\n\r\n| \u7c7b\u578b | \u989c\u8272 | \u7528\u9014 |\r\n|------|------|------|\r\n| `QPInfo` | \ud83d\udfe2 \u7eff\u8272 | \u6210\u529f\u4fe1\u606f |\r\n| `QPWarn` | \ud83d\udfe1 \u9ec4\u8272 | \u8b66\u544a\u63d0\u9192 |\r\n| `QPError` | \ud83d\udd34 \u7ea2\u8272 | \u9519\u8bef\u63d0\u793a |\r\n\r\n```python\r\nfrom rbpop import QPop, QPInfo, QPWarn, QPError\r\n\r\n# \u6210\u529f\u63d0\u793a\r\nQPop(QPInfo(\"\u6570\u636e\u4fdd\u5b58\u6210\u529f\uff01\"))\r\n\r\n# \u8b66\u544a\u63d0\u9192  \r\nQPop(QPWarn(\"\u7f51\u7edc\u8fde\u63a5\u4e0d\u7a33\u5b9a\"))\r\n\r\n# \u9519\u8bef\u63d0\u793a\r\nQPop(QPError(\"\u4fdd\u5b58\u5931\u8d25\uff0c\u8bf7\u91cd\u8bd5\"))\r\n```\r\n\r\n## \ud83c\udfa8 \u81ea\u5b9a\u4e49\u5f39\u7a97\r\n\r\n### \u7ee7\u627fQPMsg\u521b\u5efa\u81ea\u5b9a\u4e49\u5f39\u7a97\r\n\r\n\u901a\u8fc7\u7ee7\u627f`QPMsg`\u7c7b\uff0c\u53ef\u4ee5\u5feb\u901f\u521b\u5efa\u5177\u6709\u7279\u5b9a\u6837\u5f0f\u548c\u529f\u80fd\u7684\u5f39\u7a97\uff1a\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPMsg\r\n\r\nclass MySuccessMsg(QPMsg):\r\n    def __init__(self, msg):\r\n        super().__init__(msg, title=\"\u2705 \u6210\u529f\", duration=2500)\r\n        self.setStyleSheet(\"\"\"\r\n            background-color: #2ecc71;\r\n            color: white;\r\n            border-radius: 8px;\r\n            font-weight: bold;\r\n        \"\"\")\r\n\r\n# \u4f7f\u7528\u81ea\u5b9a\u4e49\u5f39\u7a97\r\napp = QApplication([])\r\nQPop(MySuccessMsg(\"\u6587\u4ef6\u4e0a\u4f20\u5b8c\u6210\uff01\"))\r\n```\r\n\r\n### \u6dfb\u52a0\u81ea\u5b9a\u4e49\u7ec4\u4ef6\r\n\r\n\u5728\u7ee7\u627f\u7c7b\u4e2d\u6dfb\u52a0\u6309\u94ae\u3001\u8f93\u5165\u6846\u7b49\u81ea\u5b9a\u4e49\u7ec4\u4ef6\uff1a\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QPushButton, QHBoxLayout\r\nfrom rbpop import QPop, QPMsg\r\n\r\nclass ConfirmMsg(QPMsg):\r\n    def __init__(self, msg, on_confirm=None):\r\n        super().__init__(msg, title=\"\u786e\u8ba4\u64cd\u4f5c\", duration=0)  # 0\u8868\u793a\u4e0d\u81ea\u52a8\u5173\u95ed\r\n        self.on_confirm = on_confirm\r\n        \r\n        # \u6dfb\u52a0\u786e\u8ba4\u6309\u94ae\r\n        self.btn_confirm = QPushButton(\"\u786e\u8ba4\")\r\n        self.btn_confirm.clicked.connect(self.confirm)\r\n        self.layout().addWidget(self.btn_confirm)\r\n    \r\n    def confirm(self):\r\n        if self.on_confirm:\r\n            self.on_confirm()\r\n        self.close()\r\n\r\n# \u4f7f\u7528\u786e\u8ba4\u5f39\u7a97\r\napp = QApplication([])\r\ndef handle_confirm():\r\n    print(\"\u7528\u6237\u786e\u8ba4\u4e86\u64cd\u4f5c\")\r\n\r\nQPop(ConfirmMsg(\"\u786e\u5b9a\u8981\u5220\u9664\u8fd9\u4e2a\u6587\u4ef6\u5417\uff1f\", on_confirm=handle_confirm))\r\n```\r\n\r\n## \ud83c\udfaf \u5b9e\u9645\u5e94\u7528\u573a\u666f\r\n\r\n### \u573a\u666f1\uff1a\u7528\u6237\u64cd\u4f5c\u53cd\u9988\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPInfo, QPError\r\n\r\napp = QApplication([])\r\n\r\ndef save_data():\r\n    try:\r\n        # \u4fdd\u5b58\u903b\u8f91\r\n        save_to_database()\r\n        QPop(QPInfo(\"\u6570\u636e\u4fdd\u5b58\u6210\u529f\uff01\"))\r\n    except Exception as e:\r\n        QPop(QPError(f\"\u4fdd\u5b58\u5931\u8d25\uff1a{str(e)}\"))\r\n```\r\n\r\n### \u573a\u666f2\uff1a\u6279\u91cf\u5904\u7406\u8fdb\u5ea6\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPInfo\r\n\r\napp = QApplication([])\r\n\r\n# \u6279\u91cf\u5904\u7406\u901a\u77e5\uff08\u81ea\u52a8\u6392\u961f\uff09\r\nfor i in range(1, 6):\r\n    QPop(QPInfo(f\"\u5904\u7406\u8fdb\u5ea6\uff1a{i}/5\", duration=1000))\r\n```\r\n\r\n### \u573a\u666f3\uff1a\u81ea\u5b9a\u4e49\u4e3b\u9898\u5f39\u7a97\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPop, QPMsg\r\n\r\nclass DarkMsg(QPMsg):\r\n    def __init__(self, text):\r\n        super().__init__(text, title=\"\u591c\u95f4\u6a21\u5f0f\")\r\n        self.setStyleSheet(\"\"\"\r\n            background-color: #2c3e50;\r\n            color: #ecf0f1;\r\n            border: 1px solid #34495e;\r\n            border-radius: 6px;\r\n        \"\"\")\r\n\r\napp = QApplication([])\r\nQPop(DarkMsg(\"\u5df2\u5207\u6362\u5230\u591c\u95f4\u6a21\u5f0f\"))\r\n```\r\n\r\n## \ud83d\udccb \u5b8c\u6574API\u53c2\u6570\r\n\r\n### QPMsg \u53c2\u6570\u8bf4\u660e\r\n\r\n```python\r\nQPMsg(message, title=None, duration=4000, **kwargs)\r\n```\r\n\r\n| \u53c2\u6570 | \u7c7b\u578b | \u9ed8\u8ba4\u503c | \u8bf4\u660e |\r\n|------|------|--------|------|\r\n| `message` | str | \u5fc5\u9700 | \u6d88\u606f\u5185\u5bb9 |\r\n| `title` | str | None | \u7a97\u53e3\u6807\u9898 |\r\n| `duration` | int | 4000 | \u663e\u793a\u65f6\u957f\uff08\u6beb\u79d2\uff0c0\u8868\u793a\u4e0d\u81ea\u52a8\u5173\u95ed\uff09 |\r\n| `close` | bool | False | \u662f\u5426\u663e\u793a\u5173\u95ed\u6309\u94ae |\r\n| `slide_in` | bool | True | \u662f\u5426\u542f\u7528\u6ed1\u5165\u52a8\u753b |\r\n| `slide_duration` | int | 800 | \u52a8\u753b\u65f6\u957f\uff08\u6beb\u79d2\uff09 |\r\n\r\n### \u9884\u7f6e\u7c7b\u578b\u5feb\u6377\u65b9\u5f0f\r\n\r\n```python\r\nQPInfo(message, title=None, duration=4000)\r\nQPWarn(message, title=None, duration=4000)  \r\nQPError(message, title=None, duration=4000)\r\n```\r\n\r\n## \ud83d\udd27 \u9ad8\u7ea7\u63a7\u5236\r\n\r\n### \u6279\u91cf\u7a97\u53e3\u7ba1\u7406\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop.win import WinManager\r\n\r\napp = QApplication([])\r\nmanager = WinManager.get_instance()\r\n\r\n# \u6279\u91cf\u63a7\u5236\u6240\u6709\u5f39\u7a97\r\nmanager.hide_all()   # \u9690\u85cf\u5168\u90e8\r\nmanager.show_all()   # \u663e\u793a\u5168\u90e8  \r\nmanager.clear_all()  # \u6e05\u7a7a\u5168\u90e8\r\n```\r\n\r\n### \u52a8\u753b\u6548\u679c\u63a7\u5236\r\n\r\n```python\r\nfrom PyQt6.QtWidgets import QApplication\r\nfrom rbpop import QPMsg, QPop\r\n\r\napp = QApplication([])\r\n\r\n# \u65e0\u52a8\u753b\uff08\u7acb\u5373\u663e\u793a\uff09\r\nQPop(QPMsg(\"\u65e0\u52a8\u753b\u6d88\u606f\", slide_in=False))\r\n\r\n# \u6162\u901f\u52a8\u753b\r\nQPop(QPMsg(\"\u6162\u901f\u6ed1\u5165\", slide_duration=1500))\r\n\r\n# \u957f\u65f6\u95f4\u663e\u793a\r\nQPop(QPMsg(\"\u9700\u8981\u7528\u6237\u9605\u8bfb\", duration=10000))\r\n```\r\n\r\n## \ud83c\udfae \u8fd0\u884c\u6f14\u793a\r\n\r\n\u9879\u76ee\u5185\u7f6e\u5b8c\u6574\u7684\u4ea4\u4e92\u5f0f\u6f14\u793a\u754c\u9762\uff1a\r\n\r\n```bash\r\npython ui_demo.py\r\n```\r\n\r\n\u6f14\u793a\u529f\u80fd\uff1a\r\n- \u5b9e\u65f6\u521b\u5efa\u5404\u79cd\u7c7b\u578b\u5f39\u7a97\r\n- \u6279\u91cf\u6d4b\u8bd5\u961f\u5217\u7ba1\u7406  \r\n- \u81ea\u5b9a\u4e49\u989c\u8272\u548c\u6837\u5f0f\r\n- \u52a8\u753b\u6548\u679c\u6d4b\u8bd5\r\n\r\n## \u2699\ufe0f \u7cfb\u7edf\u8981\u6c42\r\n\r\n- Python 3.10+\r\n- PyQt6\r\n- Windows/Linux/macOS\r\n\r\n## \ud83d\udce6 \u9879\u76ee\u7ed3\u6784\r\n\r\n```\r\nrbpop/\r\n\u251c\u2500\u2500 __init__.py          # \u4e3b\u5165\u53e3\uff08\u5bfc\u51faQPop\u548c\u9884\u7f6e\u5f39\u7a97\uff09\r\n\u251c\u2500\u2500 win/\r\n\u2502   \u251c\u2500\u2500 manager.py       # \u7a97\u53e3\u7ba1\u7406\u5668\uff08WinManager\uff09\r\n\u2502   \u2514\u2500\u2500 popped.py        # \u5f39\u7a97\u57fa\u7c7b\uff08PopWin\uff09\r\n\u251c\u2500\u2500 prefab/\r\n\u2502   \u2514\u2500\u2500 message.py       # \u9884\u7f6e\u5f39\u7a97\u7ec4\u4ef6\uff08QPMsg/QPInfo/QPWarn/QPError\uff09\r\n\u2514\u2500\u2500 ui_demo.py          # \u6f14\u793a\u7a0b\u5e8f\r\n```\r\n\r\n## \ud83c\udfaf \u4f7f\u7528\u603b\u7ed3\r\n\r\n| \u9700\u6c42\u573a\u666f | \u63a8\u8350\u7528\u6cd5 |\r\n|----------|----------|\r\n| \u5feb\u901f\u6d88\u606f\u63d0\u793a | `QPop(QPMsg(\"\u6d88\u606f\"))` |\r\n| \u6210\u529f/\u8b66\u544a/\u9519\u8bef | `QPop(QPInfo(\"\u6210\u529f\"))` |\r\n| \u81ea\u5b9a\u4e49\u6837\u5f0f | \u7ee7\u627f`QPMsg`\u521b\u5efa\u5b50\u7c7b |\r\n| \u5b8c\u5168\u81ea\u5b9a\u4e49 | \u7ee7\u627f`PopWin`\u4ece\u96f6\u6784\u5efa |\r\n\r\n## \ud83e\udd1d \u53c2\u4e0e\u8d21\u732e\r\n\r\n\u6b22\u8fce\u63d0\u4ea4Issue\u548cPull Request\uff01\r\n\r\n## \ud83d\udcc4 \u8bb8\u53ef\u8bc1\r\n\r\nMIT License - \u8be6\u89c1LICENSE\u6587\u4ef6\r\n",
    "bugtrack_url": null,
    "license": "MIT",
    "summary": "A lightweight, modern PyQt6 popup notification library with smooth animations, queue management, and multiple preset styles.",
    "version": "0.3.1",
    "project_urls": {
        "Homepage": "https://github.com/EagleBaby/rbpop"
    },
    "split_keywords": [
        "pyqt6",
        " popup",
        " notification",
        " toast",
        " message",
        " dialog",
        " window"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "fe2b27a1ebe034cb6758957f5e6fb725876f9174bc00bd9472de7f41f54d3b1f",
                "md5": "9fdc4f46a7797e8098d87550e97aaefa",
                "sha256": "a8fd5cba3936e9ee37508f8110af98125d9e9f1a30982c93120f002ccf7759da"
            },
            "downloads": -1,
            "filename": "rbpop-0.3.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "9fdc4f46a7797e8098d87550e97aaefa",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 19985,
            "upload_time": "2025-09-06T20:12:24",
            "upload_time_iso_8601": "2025-09-06T20:12:24.745841Z",
            "url": "https://files.pythonhosted.org/packages/fe/2b/27a1ebe034cb6758957f5e6fb725876f9174bc00bd9472de7f41f54d3b1f/rbpop-0.3.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "36703d37a7af6227fe904ae7ae396649880f0f4e4a1c04310f8314e3c517f76c",
                "md5": "53a8b484ac9b9b0babd8a9dcad5228fe",
                "sha256": "d1d491b5a75ec03994b3de4997bc2de857d858232501fd23edaef954186e8fa0"
            },
            "downloads": -1,
            "filename": "rbpop-0.3.1.tar.gz",
            "has_sig": false,
            "md5_digest": "53a8b484ac9b9b0babd8a9dcad5228fe",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 22631,
            "upload_time": "2025-09-06T20:12:25",
            "upload_time_iso_8601": "2025-09-06T20:12:25.835224Z",
            "url": "https://files.pythonhosted.org/packages/36/70/3d37a7af6227fe904ae7ae396649880f0f4e4a1c04310f8314e3c517f76c/rbpop-0.3.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-06 20:12:25",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "EagleBaby",
    "github_project": "rbpop",
    "github_not_found": true,
    "lcname": "rbpop"
}
        
Elapsed time: 2.08898s