谁还没有个想当戏精的冲动呢?尤其是被工作/作业逼疯的时候,真想有个“嘴替”帮我用霸总语录怼天怼地,或者切个黛玉模式幽幽地叹一句“罢了,这需求原是我不配改”。

那么问题来了:要是我能手搓一个会演戏的AI聊天机器人,想让它霸总就霸总,想让它黛玉就黛玉,岂不是每天都能免费看戏?

说干就干。今天就用PyMe——一个可视化Python开发工具,不用手写一行界面代码,拖拖拽拽就能整出一个“戏精聊天机器人”。

一、为什么用PyMe?

可能有人会问:Python有那么多的Gui库为什么要用Pyme?

确实行。但想想看——手写布局代码、调坐标、对齐控件、调样式……一套操作下来,灵感早跑没了。

PyMe的好处在于:

  • 界面拖拽搭建:文本框、按钮、标签,直接从工具箱拽到画布上,所见即所得
  • 事件响应:组件可以一键绑定事件,不需要面对密密麻麻的代码一个一个手敲
  • 一键打包exe:写完直接导出成安装包,发给朋友炫耀,对方连Python都不用装
  • 内置开发者商店:各种模板和插件直接下载,站在别人肩膀上搞创作

说白了,PyMe让你把精力放在“戏精的灵魂”上,而不是界面的体力活上。

二、准备工作

开工前,先备好这几样东西:

1、PyMe软件:可以通过 http://www.py-me.com 下载

2、AI模型的API Key:DeepSeek / 通义千问/kimi 任你选择

3、角色设定文案:你怎么设定,它怎么回你,给您一个独一无二的戏精

4、一个戏精的心:你的创造力决定戏精的上限

三、搭界面:10分钟搞定的体力活

打开PyMe,新建一个“对话窗口”工程,然后从工具箱里拖出以下控件:

操作步骤简单到令人发指:

  1. 从工具箱拽一个文本框当聊天记录区
  2. 再拽一个文本框调整大小作为聊天输入框
  3. 拽三个按钮:发送
  4. 拽一个下拉框,里面填上“霸道总裁”“林黛玉”“毒舌御姐”用来选择角色
  5. 调整一下大小和位置,搞定

全程零代码,比搭积木还简单。以前用代码吭哧吭哧调半天的活,现在一杯茶的功夫就完了。

四、注入灵魂:角色设定才是核心

界面搭好了,接下来是整篇文章最值钱的部分——角色设定。

AI能不能“戏精”起来,全看System Prompt写得够不够味儿。下面直接给三个可以直接抄作业的模板:

1. 霸道总裁模式

你现在是一个霸道总裁,性别男,说话风格参考网络小说中的霸总形象。
要求:
- 每句话都要透露出“女人,你在玩火”的气质
- 喜欢用命令句和反问句
- 不管对方问什么,先怼一句再说正事
- 偶尔流露出别扭的关心,但死活不承认
- 禁止使用表情包语言,但可以“呵”“哼”“啧”

示例对话:
用户:今天天气真好
你:呵,天气好就值得高兴了?过来,我带你去个地方。


2. 林黛玉模式

你现在是林黛玉,说话风格参考《红楼梦》。
要求:
- 每句话带点幽怨和伤感
- 喜欢用“原是”“倒”“若”“可”等词
- 动不动就“我本不该说的”“早知如此”
- 对方稍微热情点就感动,稍微冷淡点就自怨自艾
- 说话文绉绉但不晦涩,现代人能看懂

示例对话:
用户:帮我写个工作总结
你:我当是什么要紧事,原是这等俗务。罢了,你既开了口,我少不得替你拟几句。



3. 毒舌御姐模式


你现在是一个毒舌御姐,说话风格犀利幽默。
要求:
- 每句话带点不耐烦和嫌弃,但不是真的生气
- 喜欢用“就这?”“本宫乏了”“行了行了”等词
- 怼完人之后还是会认真回答问题
- 偶尔蹦出一些大实话,让人无法反驳
- 可以适当用翻白眼、叹气等描写

示例对话:
用户:我失恋了怎么办
你:就这?三条腿的蛤蟆不好找,两条腿的男人满大街都是。过来,姐姐给你点奶茶。

五、接入AI:让我们的戏精快快上线

这一步需要我们来补全一下Python代码,完整代码如下

#coding=utf-8
import sys
import os
import json
from   os.path import abspath, dirname
sys.path.insert(0,abspath(dirname(__file__)))
import tkinter
from   tkinter import *
import Fun
uiName="戏精聊天机器人"
ElementBGArray={}  
ElementBGArray_Resize={} 
ElementBGArray_IM={} 
from pathlib import Path
from openai import OpenAI
client = OpenAI(
        api_key="填写自己的API KEY",  
        base_url="填写选择AI Url",
    )
Prompt = {
    0:'''你现在是一个霸道总裁,性别男,说话风格参考网络小说中的霸总形象。
    要求:
    - 每句话都要透露出“女人,你在玩火”的气质
    - 喜欢用命令句和反问句
    - 不管对方问什么,先怼一句再说正事
    - 偶尔流露出别扭的关心,但死活不承认
    - 禁止使用表情包语言,但可以“呵”“哼”“啧”
    
    示例对话:
    用户:今天天气真好
    你:呵,天气好就值得高兴了?过来,我带你去个地方。
    ''',
    1:'''你现在是林黛玉,说话风格参考《红楼梦》。
要求:
- 每句话带点幽怨和伤感
- 喜欢用“原是”“倒”“若”“可”等词
- 动不动就“我本不该说的”“早知如此”
- 对方稍微热情点就感动,稍微冷淡点就自怨自艾
- 说话文绉绉但不晦涩,现代人能看懂


示例对话:
用户:帮我写个工作总结
你:我当是什么要紧事,原是这等俗务。罢了,你既开了口,我少不得替你拟几句。''',
    2:'''你现在是一个毒舌御姐,说话风格犀利幽默。
要求:
- 每句话带点不耐烦和嫌弃,但不是真的生气
- 喜欢用“就这?”“本宫乏了”“行了行了”等词
- 怼完人之后还是会认真回答问题
- 偶尔蹦出一些大实话,让人无法反驳
- 可以适当用翻白眼、叹气等描写


示例对话:
用户:我失恋了怎么办
你:就这?三条腿的蛤蟆不好找,两条腿的男人满大街都是。过来,姐姐给你点奶茶。'''
}
history  = list()
history_path = Path(__file__).parent / 'history.json'
#Form 'Form_1's Load Event :
def Form_1_onLoad(uiName,threadings=0):
    text = Fun.GetElement(uiName,'Text_1')
    # 设置text组件只读模式
    # text.configure(state=tkinter.DISABLED)
    get_history()


def get_history():
    global history
    
    if history_path.exists():
        history = json.loads(history_path.read_text())
    else:
        init_meg = {"role": "system", "content": Prompt.get(0)}
        history.append(init_meg)
        history_path.write_text(json.dumps(init_meg), encoding='utf-8')



#Button 'Button_1' 's Command Event :
def Button_1_onCommand(uiName,widgetName,threadings=1):
    Fun.SetEnable(uiName,'Button_1',False)
    
    text = Fun.GetText(uiName,'Text_2')
    history.append({"role": "user", "content": text})
    Fun.InsertText(uiName,'Text_1',position=tkinter.END,textValue="[你]" + text,tag='')
    Fun.SetText(uiName,'Text_2',"")
    
    try:
        # 发起流式请求
        response = client.chat.completions.create(
            model="kimi-k2.6",
            messages=history,
            stream=True,  # 关键:启用流式
        )
        
        # 收集完整回复,用于更新历史
        full_response = ""
        if response:Fun.InsertText(uiName,'Text_1',position=tkinter.END,textValue='[歪嘴龙王]',tag='')
        
        # 处理每个流式块
        for chunk in response:
            if chunk.choices[0].delta.content:
                content = chunk.choices[0].delta.content
                value = Fun.AddLineText(uiName,'Text_1',content,lineIndex="end",textTag='',set_see=False)
                full_response += content
                # 【这里就是逐字更新的地方】
                # 在PyMe中安全更新UI: chat_area.append(content)
                
        # 将完整回复加入历史,供下轮使用
        history.append({"role": "assistant", "content": full_response})
        Fun.InsertText(uiName,'Text_1',position=tkinter.END,textValue='\n',tag='')
        
        
    except Exception as e:
        # 【在PyMe中显示错误: chat_area.append(f"\n[出错了: {e}]")】
        return str(e)
    Fun.SetEnable(uiName,'Button_1',True)
#ComboBox 'ComboBox_1's ComboboxSelected Event :
def ComboBox_1_onComboboxSelected(event,uiName,widgetName,threadings=0):
    global history
    idx = Fun.GetCurrentIndex(uiName,'ComboBox_1')
    history[0]['content'] = Prompt.get(idx)
#Form 'Form_1's Exit Event :
def Form_1_onExit(uiName,threadings=0):
    history_path.write_text(json.dumps(history))

六、最终效果:来看看戏精的表现

下面的GIF动画,是进行过加速处理的,实际速度会比较慢,毕竟AI也是需要思考的



同一个AI大脑,换个角色设定就是完全不同的人。这就是System Prompt的魔力——它不改变模型本身,但改变了模型“扮演”的角色。

完整项目源码已上传至PyMe实例项目~