Python结合wxPython实现AI绘图提示词生成器

作者:

文章目录
  • 这是一个基于wxPython开发的AI绘图提示词(Prompt)生成器,专门用于帮助用户快速构建和管理Stable Diffusion、Midjourney等AI绘图工具的提示词。程序提供了两种生成模式:随机生成和手动选择,极大提升了提示词创作效率。 运行结果如下:
  • 用户输入文本    ↓点击"生成下拉框"    ↓解析每行文本 → 分割词组 → 识别分类    ↓创建下拉框 + 添加翻译 → 绑定事件    ↓用户选择词组    ↓触发on_combo_change事件    ↓遍历所有下拉框 → 提取英文值    ↓更新memo2显示    ↓用户点击复制 → 写入剪贴板
  • 清晰的职责分离:翻译、分类、UI逻辑分别封装 防御性编程:处理空输入、边界情况 用户友好:提供提示消息、默认值、示例数据 数据与显示分离:combo_values存储实际值,显示中英文 以上就是Python结合wxPython实现AI绘图提示词生成器的详细内容,更多关于Python AI绘图提示词生成器的资料请关注风君子博客其它相关文章! 您可能感兴趣的文章: 基于Python实现一个具有记忆功能的AI对话代理 基于Python+PyQt5开发一个AI智能截图解答工具 使用Python开发一个可调用工具的AI Agent Python基于wxPython开发一个图片PDF生成器 Python使用FastAPI+SQLite构建一个短链接生成器服务 基于Python开发一个小说图片PDF生成器
  • 目录
    • 项目概述
    • 核心功能
      • 1. 双模式生成系统
      • 2. 智能分类系统
      • 3. 双语显示机制
    • 技术架构详解
      • 界面布局结构
      • 核心类设计
      • 关键技术点
        • 1. 动态创建控件
        • 2. 实时更新机制
        • 3. 随机生成算法
        • 4. 剪贴板操作
    • 数据流程图
      • 使用场景示例
        • AI绘图工作流
        • 扩展建议
          • 1. 增加提示词权重
            • 2. 保存/加载配置
              • 3. 负面提示词支持
                • 4. 预设模板系统
                  • 5. 批量生成
                  • 性能优化
                    • 1. 控件复用
                      • 2. 延迟更新
                        • 3. 虚拟滚动
                        • 代码规范亮点

                          这是一个基于wxPython开发的AI绘图提示词(Prompt)生成器,专门用于帮助用户快速构建和管理Stable Diffusion、Midjourney等AI绘图工具的提示词。程序提供了两种生成模式:随机生成和手动选择,极大提升了提示词创作效率。

                          运行结果如下:

                          随机生成模式

                          • 用户设置每行抽取数量(1-5个词组)
                          • 程序从每行随机选择指定数量的词组
                          • 自动组合成完整的提示词

                          手动选择模式

                          • 为每一行生成独立的下拉框
                          • 实时预览选择效果
                          • 支持空选项,灵活控制输出

                          程序能够自动识别提示词类型,并为每个下拉框添加有意义的分类标签:

                          def get_category_name(self, words):
                              """根据词组内容推断分类名称"""
                              first_words = ' '.join(words[:3]).lower()
                              
                              if any(kw in first_words for kw in ['masterpiece', 'quality', 'detailed']):
                                  return "画质质量"
                              elif any(kw in first_words for kw in ['face', 'skin', 'eyes']):
                                  return "面部特征"
                              # ... 更多分类逻辑
                          

                          支持的分类包括:

                          • 画质质量(masterpiece, 8k, HDR等)
                          • 面部特征(perfect face, smooth skin等)
                          • 光照效果(soft lighting, cinematic lighting等)
                          • 赛博朋克(cyberpunk, neon lights等)
                          • 景深效果(depth of field, bokeh等)
                          • 背景设置(simple background, white background等)
                          • 风格类别(anime style, oil painting, sketch等)
                          • 人物特征(服装、发型等)
                          • 场景环境(scenery, forest等)

                          这是程序的一大亮点:下拉框显示中英文,但输出纯英文

                          def translate_to_chinese(self, text):
                              """将英文提示词翻译成中文"""
                              translations = {
                                  'masterpiece': '杰作',
                                  'best quality': '最佳质量',
                                  'soft lighting': '柔和光照',
                                  # ... 50+个翻译条目
                              }
                              return translations.get(text, text)
                          

                          实现原理:

                          • 创建两个列表:combo_choices_display(显示用)和combo_choices_value(值用)
                          • 显示格式:masterpiece (杰作)
                          • 选择时获取索引,从值列表中提取纯英文
                          • 最终输出:masterpiece, best quality, soft lighting
                          # 构建下拉框选项
                          for word in words:
                              chinese = self.translate_to_chinese(word)
                              display_text = f'{word} ({chinese})'  # 显示:英文(中文)
                              combo_choices_display.append(display_text)
                              combo_choices_value.append(word)  # 保存:纯英文
                          
                          # 获取选择时使用英文值
                          english_value = combo.combo_values[selection_index]
                          

                          Frame (主窗口)
                          ├── Panel (主面板)
                              ├── StaticText (输入区标签)
                              ├── TextCtrl (memo1 – 多行输入框)
                              ├── BoxSizer (控制区域)
                              │   ├── SpinCtrl (数量选择器)
                              │   ├── Button (随机生成)
                              │   └── Button (生成下拉框)
                              ├── ScrolledWindow (可滚动下拉框区域)
                              │   └── BoxSizer (垂直布局)
                              │       ├── BoxSizer (每行水平布局)
                              │       │   ├── StaticText (分类标签)
                              │       │   └── ComboBox (下拉选择框)
                              │       └── … (多行重复)
                              ├── TextCtrl (memo2 – 只读输出框)
                              └── Button (复制按钮)

                          class RandomWordPicker(wx.Frame):
                              def __init__(self):
                                  # 初始化窗口和控件
                                  self.combo_boxes = []      # 存储所有下拉框
                                  self.line_data = []        # 存储每行的词组数据
                                  
                              # 翻译系统
                              def translate_to_chinese(self, text)
                              
                              # 分类识别
                              def get_category_name(self, words)
                              
                              # 生成下拉框
                              def on_create_combos(self, event)
                              
                              # 监听下拉框变化
                              def on_combo_change(self, event)
                              
                              # 更新输出区域
                              def update_memo2(self)
                              
                              # 随机生成
                              def on_generate(self, event)
                              
                              # 复制到剪贴板
                              def on_copy(self, event)
                          

                          def on_create_combos(self, event):
                              # 清空现有控件
                              self.combo_sizer.Clear(True)
                              self.combo_boxes = []
                              
                              # 动态创建每行的下拉框
                              for i, line in enumerate(lines):
                                  words = [w.strip() for w in line.split(',') if w.strip()]
                                  
                                  # 创建布局和控件
                                  row_sizer = wx.BoxSizer(wx.HORIZONTAL)
                                  label = wx.StaticText(...)
                                  combo = wx.ComboBox(...)
                                  
                                  # 绑定事件
                                  combo.Bind(wx.EVT_COMBOBOX, self.on_combo_change)
                                  
                                  self.combo_boxes.append(combo)
                          

                          要点:

                          • 使用Clear(True)清空并销毁旧控件
                          • 循环创建控件并绑定事件
                          • 使用列表存储控件引用,便于后续访问

                          def on_combo_change(self, event):
                              # 任何下拉框改变都触发此函数
                              self.update_memo2()
                          
                          def update_memo2(self):
                              selected_words = []
                              for combo in self.combo_boxes:
                                  selection_index = combo.GetSelection()
                                  if selection_index > 0:  # 跳过空选项
                                      english_value = combo.combo_values[selection_index]
                                      selected_words.append(english_value)
                              
                              result = ', '.join(selected_words)
                              self.memo2.SetValue(result)
                          

                          实现逻辑:

                          • 所有下拉框共享同一个事件处理函数
                          • 事件触发时遍历所有下拉框
                          • 提取选中项的英文值
                          • 组合成字符串更新到memo2

                          def on_generate(self, event):
                              num_to_pick = self.spin_ctrl.GetValue()
                              all_selected = []
                              
                              for line in lines:
                                  words = [w.strip() for w in line.split(',') if w.strip()]
                                  
                                  if len(words) < num_to_pick:
                                      selected = words  # 不足时全选
                                  else:
                                      selected = random.sample(words, num_to_pick)  # 随机抽取
                                  
                                  all_selected.extend(selected)
                              
                              result_text = ', '.join(all_selected)
                          

                          特点:

                          • 使用random.sample()保证不重复
                          • 处理词组数量不足的边界情况
                          • 按行顺序组合结果

                          def on_copy(self, event):
                              text = self.memo2.GetValue()
                              
                              if wx.TheClipboard.Open():
                                  wx.TheClipboard.SetData(wx.TextDataObject(text))
                                  wx.TheClipboard.Close()
                                  wx.MessageBox('已复制到剪贴板!', '成功', wx.OK | wx.ICON_INFORMATION)
                          

                          wxPython剪贴板API:

                          • wx.TheClipboard.Open() – 打开剪贴板
                          • wx.TextDataObject(text) – 创建文本数据对象
                          • SetData() – 设置数据
                          • Close() – 关闭剪贴板

                          用户输入文本
                              ↓
                          点击"生成下拉框"
                              ↓
                          解析每行文本 → 分割词组 → 识别分类
                              ↓
                          创建下拉框 + 添加翻译 → 绑定事件
                              ↓
                          用户选择词组
                              ↓
                          触发on_combo_change事件
                              ↓
                          遍历所有下拉框 → 提取英文值
                              ↓
                          更新memo2显示
                              ↓
                          用户点击复制 → 写入剪贴板

                          步骤1:准备提示词库

                          masterpiece, best quality, ultra-detailed, 8k
                          anime style, cel shaded, flat color
                          soft lighting, natural light, cinematic lighting
                          red hair, vibrant red hair, detailed hair
                          

                          步骤2:生成下拉框

                          • 画质质量:masterpiece (杰作)
                          • 动漫风格:anime style (动漫风格)
                          • 光照效果:soft lighting (柔和光照)
                          • 发型发色:red hair (红发)

                          步骤3:选择组合

                          点击下拉框选择想要的效果

                          步骤4:导出使用

                          masterpiece, anime style, soft lighting, red hair
                          

                          复制到Stable Diffusion或Midjourney使用

                          # 支持(word:1.2)格式
                          combo_choices_display.append(f'{word} ({chinese}) [权重]')
                          

                          def save_config(self):
                              config = {
                                  'selections': [combo.GetSelection() for combo in self.combo_boxes]
                              }
                              with open('config.json', 'w') as f:
                                  json.dump(config, f)
                          

                          添加第二个memo区域用于生成negative prompts。

                          templates = {
                              '人物肖像': ['masterpiece', 'perfect face', 'soft lighting'],
                              '风景场景': ['scenery', 'detailed environment', 'natural light'],
                          }
                          

                          添加循环生成功能,一次生成多组不同的提示词。

                          对于频繁切换的场景,考虑复用控件而不是销毁重建:

                          # 只更新choices而不是重建控件
                          combo.Clear()
                          combo.Append(new_choices)
                          

                          用户快速切换下拉框时避免频繁更新:

                          def on_combo_change(self, event):
                              if hasattr(self, 'update_timer'):
                                  self.update_timer.Stop()
                              
                              self.update_timer = wx.CallLater(300, self.update_memo2)
                          

                          当行数超过100时,考虑使用虚拟列表控件。

                          • 清晰的职责分离:翻译、分类、UI逻辑分别封装
                          • 防御性编程:处理空输入、边界情况
                          • 用户友好:提供提示消息、默认值、示例数据
                          • 数据与显示分离combo_values存储实际值,显示中英文

                          以上就是Python结合wxPython实现AI绘图提示词生成器的详细内容,更多关于Python AI绘图提示词生成器的资料请关注风君子博客其它相关文章!

                          您可能感兴趣的文章:

                          • 基于Python实现一个具有记忆功能的AI对话代理
                          • 基于Python+PyQt5开发一个AI智能截图解答工具
                          • 使用Python开发一个可调用工具的AI Agent
                          • Python基于wxPython开发一个图片PDF生成器
                          • Python使用FastAPI+SQLite构建一个短链接生成器服务
                          • 基于Python开发一个小说图片PDF生成器

                          站内搜索