# 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"
}