谁还没有个想当戏精的冲动呢?尤其是被工作/作业逼疯的时候,真想有个“嘴替”帮我用霸总语录怼天怼地,或者切个黛玉模式幽幽地叹一句“罢了,这需求原是我不配改”。
那么问题来了:要是我能手搓一个会演戏的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,新建一个“对话窗口”工程,然后从工具箱里拖出以下控件:

操作步骤简单到令人发指:
- 从工具箱拽一个文本框当聊天记录区
- 再拽一个文本框调整大小作为聊天输入框
- 拽三个按钮:发送
- 拽一个下拉框,里面填上“霸道总裁”“林黛玉”“毒舌御姐”用来选择角色
- 调整一下大小和位置,搞定
全程零代码,比搭积木还简单。以前用代码吭哧吭哧调半天的活,现在一杯茶的功夫就完了。
四、注入灵魂:角色设定才是核心
界面搭好了,接下来是整篇文章最值钱的部分——角色设定。
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实例项目~