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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82630.shtml
英文地址,請注明出處:http://en.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…

成都鼎訊--通信信號模擬設備?

在現代電磁通信領域,精準模擬復雜多變的信號環境,是提升通信裝備性能與人員作戰能力的核心命題。成都鼎訊以技術創新為驅動,憑借深厚的研發實力,重磅推出通信信號模擬設備,以前所未有的強大功能與卓越性能,…