python+tkinter实现GUI界面调用即梦AI文生图片API接口

背景

目前字节跳动公司提供了即梦AI的接口免费试用,但是并发量只有1,不过足够我们使用了。我这里想做个使用python+tkinter实现的GUI可视化界面客户端,这样就不用每次都登录官方网站去进行文生图片,当然文生视频,或者图生视频也是如此的逻辑。

实现思路

1. 编写一个窗口

2. 窗口放置一个文本输入框,一个按钮和一个消息对话框就可以了

最后界面如下:

3. 给按钮绑定事件函数,当用户输入文字提示词后,点击按钮则生成对应的图片

4. 获取生成的图片链接地址,然后通过打开图片将图片写入对话框中 

Tkinter的python实现代码 

import time
import tkinter
from tkinter import scrolledtext, END, RAISED
from io import BytesIO
import requests
from tttt.ai_chat import AI_chat
from PIL import Image, ImageTk
from tttt.play_voice import play_audio
from tttt.record_voice import record_audio
from tttt.streaming_asr_demo import test_one
from tttt.voice_generate import txt_to_voice
from tttt.即梦AI文生图片 import txt_to_image# 创建根窗口
root = tkinter.Tk()
# 设置属性
root.title('即梦AI文生图片python客户端')
# 设置窗口大小
root.geometry("650x560")# 文本历史记录
txt_history = scrolledtext.ScrolledText(root, width=80, height=30)
txt_history.tag_config('green', foreground='#008B00')
txt_history.tag_config('red', foreground='#FF0000')
txt_history.grid(column=0, row=0, columnspan=3, padx=10, pady=10)# 标签
lbl = tkinter.Label(root, text="请输入文字:")
lbl.grid(column=0, row=1, padx=5, pady=5)# 文本输入框
txt_input = tkinter.Entry(root, width=50)
txt_input.grid(column=1, row=1, padx=5, pady=5)# 按钮样式
button_style = {"font": ("Arial", 10, "bold"),  # 字体样式"bg": "#4CAF50",  # 背景颜色"fg": "white",  # 文字颜色"activebackground": "#45a049",  # 按钮按下时的背景颜色"activeforeground": "white",  # 按钮按下时的文字颜色"relief": RAISED,  # 按钮边框样式"bd": 2,  # 按钮边框宽度"padx": 5,  # 按钮内部水平方向的填充"pady": 5  # 按钮内部垂直方向的填充
}# 从网页下载图片并加载
def download_and_display_image(url):try:response = requests.get(url)response.raise_for_status()  # 确保请求成功image_data = BytesIO(response.content)image = Image.open(image_data)photo = ImageTk.PhotoImage(image)# 在历史消息对话框中插入图片txt_history.image = photo  # 保持对PhotoImage的引用,防止被垃圾回收txt_history.insert(END, "\n")txt_history.image_create(END, image=photo)txt_history.insert(END, "\n")except requests.RequestException as e:txt_history.insert(END, f"无法下载图片: {e}\n")# 发送文生图片
def txt_generate_image():# 获取输入框文本内容user_message = txt_input.get()# 将用户输入的内容插入对话框中txt_history.insert(END, '即梦AI:' + time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + '\n','purple')  # 将输入的内容添加到文本历史记录中txt_history.insert(END, "正在请求处理中..." + "\n")try:# 文生图片接口image_path = txt_to_image(user_message)if image_path:# 清空输入框txt_input.delete(0, END)# 清空所有历史记录txt_history.delete("1.0", END)# 插入最新消息txt_history.insert(END, "成功生成图片如下" + "\n")# 显示图片到历史对话框中download_and_display_image(image_path)except Exception as e:txt_history.insert(END, "后台处理失败,原因如下:" + "\n")txt_history.insert(END, str(e) + "\n")btn = tkinter.Button(root, text="文生图片", command=txt_generate_image, **button_style)
btn.grid(column=1, row=3, padx=5, pady=5)# 运行主窗口
root.mainloop()

火山引擎的即梦AI接口及改造

即梦AI文生图片接口文档

即梦AI-图像生成--即梦AI-火山引擎

http接口示例:

import json
import sys
import os
import base64
import datetime
import hashlib
import hmac
import requestsmethod = 'POST'
host = 'visual.volcengineapi.com'
region = 'cn-north-1'
endpoint = 'https://visual.volcengineapi.com'
service = 'cv'def sign(key, msg):return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()def getSignatureKey(key, dateStamp, regionName, serviceName):kDate = sign(key.encode('utf-8'), dateStamp)kRegion = sign(kDate, regionName)kService = sign(kRegion, serviceName)kSigning = sign(kService, 'request')return kSigningdef formatQuery(parameters):request_parameters_init = ''for key in sorted(parameters):request_parameters_init += key + '=' + parameters[key] + '&'request_parameters = request_parameters_init[:-1]return request_parametersdef signV4Request(access_key, secret_key, service, req_query, req_body):if access_key is None or secret_key is None:print('No access key is available.')sys.exit()t = datetime.datetime.utcnow()current_date = t.strftime('%Y%m%dT%H%M%SZ')# current_date = '20210818T095729Z'datestamp = t.strftime('%Y%m%d')  # Date w/o time, used in credential scopecanonical_uri = '/'canonical_querystring = req_querysigned_headers = 'content-type;host;x-content-sha256;x-date'payload_hash = hashlib.sha256(req_body.encode('utf-8')).hexdigest()content_type = 'application/json'canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + \'\n' + 'x-content-sha256:' + payload_hash + \'\n' + 'x-date:' + current_date + '\n'canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + \'\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash# print(canonical_request)algorithm = 'HMAC-SHA256'credential_scope = datestamp + '/' + region + '/' + service + '/' + 'request'string_to_sign = algorithm + '\n' + current_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()# print(string_to_sign)signing_key = getSignatureKey(secret_key, datestamp, region, service)# print(signing_key)signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()# print(signature)authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + \credential_scope + ', ' + 'SignedHeaders=' + \signed_headers + ', ' + 'Signature=' + signature# print(authorization_header)headers = {'X-Date': current_date,'Authorization': authorization_header,'X-Content-Sha256': payload_hash,'Content-Type': content_type}# print(headers)# ************* SEND THE REQUEST *************request_url = endpoint + '?' + canonical_querystringprint('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')print('Request URL = ' + request_url)try:r = requests.post(request_url, headers=headers, data=req_body)except Exception as err:print(f'error occurred: {err}')raiseelse:print('\nRESPONSE++++++++++++++++++++++++++++++++++++')print(f'Response code: {r.status_code}\n')# 使用 replace 方法将 \u0026 替换为 &resp_str = r.text.replace("\\u0026", "&")print(f'Response body: {resp_str}\n')if __name__ == "__main__":# 请求凭证,从访问控制申请access_key = 'AK*****'secret_key = '*****=='# 请求Query,按照接口文档中填入即可query_params = {'Action': 'CVProcess','Version': '2022-08-31',}formatted_query = formatQuery(query_params)# 请求Body,按照接口文档中填入即可body_params = {"req_key": "******",# ......}formatted_body = json.dumps(body_params)signV4Request(access_key, secret_key, service,formatted_query, formatted_body)

这里要求我们开通服务,并创建对应的AK和SK

账号登录-火山引擎欢迎登录火山引擎,火山引擎是字节跳动旗下的云服务平台。https://console.volcengine.com/ai/ability/info/104

账号登录-火山引擎

这里我已经开通了,自行选择开通试用就行,不需要点击正式调用,不然收费

 

接口改造

原来的接口只能查看是否调用成功,我们想获取图片地址,并将图片显示在对话框中,因此需要获取返回值,请求体里面加了"return_url":True,就是用来获取图片地址的。同时将认证的AK和SK也填充到自定义函数中,这样接口地址可以正常使用认证并返回我们要的结果。

import json
import sys
import os
import base64
import datetime
import hashlib
import hmac
import requestsmethod = 'POST'
host = 'visual.volcengineapi.com'
region = 'cn-north-1'
endpoint = 'https://visual.volcengineapi.com'
service = 'cv'def sign(key, msg):return hmac.new(key, msg.encode('utf-8'), hashlib.sha256).digest()def getSignatureKey(key, dateStamp, regionName, serviceName):kDate = sign(key.encode('utf-8'), dateStamp)kRegion = sign(kDate, regionName)kService = sign(kRegion, serviceName)kSigning = sign(kService, 'request')return kSigningdef formatQuery(parameters):request_parameters_init = ''for key in sorted(parameters):request_parameters_init += key + '=' + parameters[key] + '&'request_parameters = request_parameters_init[:-1]return request_parametersdef signV4Request(access_key, secret_key, service, req_query, req_body):if access_key is None or secret_key is None:print('No access key is available.')sys.exit()t = datetime.datetime.utcnow()current_date = t.strftime('%Y%m%dT%H%M%SZ')# current_date = '20210818T095729Z'datestamp = t.strftime('%Y%m%d')  # Date w/o time, used in credential scopecanonical_uri = '/'canonical_querystring = req_querysigned_headers = 'content-type;host;x-content-sha256;x-date'payload_hash = hashlib.sha256(req_body.encode('utf-8')).hexdigest()content_type = 'application/json'canonical_headers = 'content-type:' + content_type + '\n' + 'host:' + host + \'\n' + 'x-content-sha256:' + payload_hash + \'\n' + 'x-date:' + current_date + '\n'canonical_request = method + '\n' + canonical_uri + '\n' + canonical_querystring + \'\n' + canonical_headers + '\n' + signed_headers + '\n' + payload_hash# print(canonical_request)algorithm = 'HMAC-SHA256'credential_scope = datestamp + '/' + region + '/' + service + '/' + 'request'string_to_sign = algorithm + '\n' + current_date + '\n' + credential_scope + '\n' + hashlib.sha256(canonical_request.encode('utf-8')).hexdigest()# print(string_to_sign)signing_key = getSignatureKey(secret_key, datestamp, region, service)# print(signing_key)signature = hmac.new(signing_key, (string_to_sign).encode('utf-8'), hashlib.sha256).hexdigest()# print(signature)authorization_header = algorithm + ' ' + 'Credential=' + access_key + '/' + \credential_scope + ', ' + 'SignedHeaders=' + \signed_headers + ', ' + 'Signature=' + signature# print(authorization_header)headers = {'X-Date': current_date,'Authorization': authorization_header,'X-Content-Sha256': payload_hash,'Content-Type': content_type}# print(headers)# ************* SEND THE REQUEST *************request_url = endpoint + '?' + canonical_querystringprint('\nBEGIN REQUEST++++++++++++++++++++++++++++++++++++')# print('Request URL = ' + request_url)try:r = requests.post(request_url, headers=headers, data=req_body)except Exception as err:print(f'error occurred: {err}')raiseelse:# print('\nRESPONSE++++++++++++++++++++++++++++++++++++')print(f'Response code: {r.status_code}\n')# 注释调原来的返回处理,我们不需要文本类型的,我们需要json格式的# 使用 replace 方法将 \u0026 替换为 &# resp_str = r.text.replace("\\u0026", "&")# print(f'Response body: {resp_str}\n')# 获取json类型的返回对象,可进行数据处理,获取返回的image_urlprint(r.json()['data']['image_urls'][0])return r.json()['data']['image_urls'][0]def txt_to_image(prompt_text):# 请求凭证,从访问控制申请access_key = ''secret_key = ''# 请求Query,按照接口文档中填入即可query_params = {'Action': 'CVProcess','Version': '2022-08-31',}formatted_query = formatQuery(query_params)# 请求Body,按照接口文档中填入即可body_params = {"req_key": "jimeng_high_aes_general_v21_L","prompt": prompt_text,"return_url": True}formatted_body = json.dumps(body_params)image_url = signV4Request(access_key, secret_key, service,formatted_query, formatted_body)return image_urlif __name__ == "__main__":txt_to_image('一张海报,上面文字写着:"新年快乐"')

请求的body体两个参数必填,因此在body_params中必须放置,其中req_key取固定值,prompt就是我们的输入框中的文本提示词。

测试结果:

到这里就大功告成了!可以愉快的玩耍了 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/82630.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

#git 储藏库意外被清空 Error: bad index – Fatal: index file corrupt

问题:通常是由于 Git 的索引文件损坏导致 原因:系统崩溃或断电、硬盘故障、Git 操作错误等 方案:重建索引文件:将当前的索引文件重命名为其他名称或删除,比如 index.m,然后命令行重建索引,git…

GitLab 18.0 正式发布,15.0 将不再受技术支持,须升级【二】

GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…

车载网关策略 --- 车载网关通信故障处理机制深度解析

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 钝感力的“钝”,不是木讷、迟钝,而是直面困境的韧劲和耐力,是面对外界噪音的通透淡然。 生活中有两种人,一种人格外在意别人的眼光;另一种人无论…

Unity数字人开发笔记

开源工程地址:https://github.com/zhangliwei7758/unity-AI-Chat-Toolkit 先致敬zhangliwei7758,开放这个源码 一、建立工程 建立Unity工程(UnityAiChat)拖入Unity-AI-Chat-Toolkit.unitypackage打开chatSample工程,可…

Cherry Studio连接配置MCP服务器

之前写了一篇关于Cherry Studio的文章,不了解的可以先看一下 AI工具——Cherry Studio,搭建满血DeepSeek R1的AI对话客户端【硅基流动DeepSeek API】-CSDN博客 最近Cherry Studio更新了一个新功能:MCP服务器 在 v1.2.9 版本中,…

OpenSSH 服务配置与会话保活完全指南

一、/etc/ssh/sshd_config 配置机制 1. 配置文件基础 文件作用 OpenSSH 服务器 (sshd) 的主配置文件,控制连接、认证、端口转发等行为。 加载与生效 修改后需重启服务:sudo systemctl restart sshd # Systemd 系统 sudo service ssh restart # S…

阿里云国际版注册邮箱格式详解

“为什么我的阿里云国际版注册总提示邮箱无效?” 这是许多初次接触阿里云国际版(Alibaba Cloud International)的用户常遇到的困惑。随着全球化进程加速,越来越多的企业选择阿里云国际版部署海外业务,而注册环节中邮箱…

【IDEA问题】springboot本地启动应用报错:程序包不存在;找不到符号

问题: springboot本地启动应用报错: 程序包xxx不存在;找不到符号 解决方案: 1.确保用maven重新导入依赖 2.删除.idea文件夹 3.invalidate caches里,把能选择的都勾选上,然后清除缓存重启 4.再在上方工具栏…

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制

FFmpeg 时间戳回绕处理:保障流媒体时间连续性的核心机制 一、回绕处理函数 /** * Wrap a given time stamp, if there is an indication for an overflow * * param st stream // 传入一个指向AVStream结构体的指针,代表流信息 * pa…

【b站计算机拓荒者】【2025】微信小程序开发教程 - chapter3 项目实践 -1 项目功能描述

1 项目功能描述 # 智慧社区-小程序-1 欢迎页-加载后端:动态变化-2 首页-轮播图:动态-公共栏:动态-信息采集,社区活动,人脸检测,语音识别,心率检测,积分商城-3 信息采集页面-采集人数…

5.27 day 30

知识点回顾: 导入官方库的三种手段导入自定义库/模块的方式导入库/模块的核心逻辑:找到根目录(python解释器的目录和终端的目录不一致) 作业:自己新建几个不同路径文件尝试下如何导入 一、导入官方库 我们复盘下学习py…

【GitHub Pages】部署指南

vue项目 编辑你的 vite.config.ts 文件,加上 base 路径,设置为你的 GitHub 仓库名 import { defineConfig } from vite import vue from vitejs/plugin-vue// 假设你的仓库是 https://github.com/your-username/my-vue-app export default defineConfi…

远程控制技术全面解析:找到适合你的最佳方案

背景:远程控制为何成为企业核心需求? 随着企业数字化转型的推进,远程控制技术已成为异地办公和运维的关键工具。无论是跨国企业需要高效管理全球设备,还是中小型企业追求经济高效的解决方案,选择合适的远程控制技术&a…

触觉智能RK3506星闪开发板规格书 型号IDO-EVB3506-V1

产品概述 触觉智能RK3506星闪开发板,型号IDO-EVB3506-V1采用 Rockchip RK3506(三核 Cortex-A7单核Cortex-M0, 主频最高1.5GHz)设计的评估开发板,专为家电显控、显示HMI、手持终端、工业IOT网关、工业控制、PLC等领域而设计。内置…

九级融智台阶与五大要素协同的量子化解析

九级融智台阶与五大要素协同的量子化解析 摘要:本文构建了一个量子力学框架下的九级融智模型,将企业创新过程映射为量子能级跃迁。研究发现五大要素协同态决定系统跃迁概率(P∣⟨Ψ_m∣H_协同∣Ψ_n⟩∣^2),当要素协同…

Kotlin学习34-data数据类1

定义如下:与普通类对比学习 //普通类 class NormalClass(val name: String, val age: Int, val sex: Char) //数据类 data class DataClass(val name: String, val age: Int, val sex: Char)对应找到java反编译的代码路径:Tool-->Kotlin-->Show K…

博图SCL基础知识-表达式及赋值运算

S7-1200 从 V2.2 版本开始支持 SCL 语言。 语言元素 SCL 除了包含 PLC 的典型元素(例如,输入、输出、定时器或存储器位)外,还包含高级编程语言表达式、赋值运算和运算符。 程序控制语句 SCL 提供了简便的指令进行程序控制。例…

海思3519V200ARM Linux 下移植 Qt5.8.0

一、移植背景及意义 海思3519V200是一款基于ARM架构的嵌入式芯片,广泛应用于智能安防、工业控制等领域。在这些应用场景中,对设备的图形用户界面(GUI)有着越来越高的要求。Qt5.8.0作为一个功能强大、跨平台的GUI开发框架,能够帮助开发者快速开发出美观、高效的用户界面。…

msql的乐观锁和幂等性问题解决方案

目录 1、介绍 2、乐观锁 2.1、核心思想 2.2、实现方式 1. 使用 version 字段(推荐) 2. 使用 timestamp 字段 2.3、如何处理冲突 2.4、乐观锁局限性 3、幂等性 3.1、什么是幂等性 3.2、乐观锁与幂等性的关系 1. 乐观锁如何辅助幂等性&#xf…

成都鼎讯--通信信号模拟设备​

在现代电磁通信领域,精准模拟复杂多变的信号环境,是提升通信装备性能与人员作战能力的核心命题。成都鼎讯以技术创新为驱动,凭借深厚的研发实力,重磅推出通信信号模拟设备,以前所未有的强大功能与卓越性能,…