升鲜宝生鲜配送供应链管理系统,辅助开发工具,《多语言自动翻译与导出工具(WinForms版)》开发文档 及 阿里云机器翻译,数据库Mysql .net 全部源代码

news/2025/10/17 0:52:31/文章来源:https://www.cnblogs.com/sunplay/p/19146877

 

多语言自动翻译与导出工具(WinForms版)开发文档

一、系统简介

本工具是一款用于自动翻译多语言字段并导出国际化数据的桌面应用,支持从 MySQL 数据库读取中文内容,调用阿里云机器翻译 API 自动生成 繁体中文 (zh-TW)、英文 (en-US)、日文 (ja-JP) 等多语言版本,并将结果同步回数据库或导出为 Excel 文件。

二、功能结构

数据库配置区:输入 MySQL 服务器地址、端口、数据库名、用户名、密码,并可测试连接与保存配置。
阿里云配置区:输入 AccessKeyId 与 AccessKeySecret,选择需要翻译的目标语言(支持多选)。
翻译控制区:一键开始多线程翻译、支持中断与进度显示、自动限流与断点缓存。
导出区:将数据库中的多语言结果导出为 Excel 文件(支持自定义保存路径与打开文件夹)。
缓存机制:所有翻译结果写入本地 cache.json,下次启动自动跳过已翻译内容。

三、界面设计

主界面包含两个主要分组:数据库配置区与阿里云配置区。前者用于设置 MySQL 连接信息,后者用于输入阿里云 API 凭证、勾选目标语言、启动翻译与导出操作。

四、核心逻辑架构

系统包含 MainForm 主窗体、LangRecord 数据实体、TranslateWorker 线程池调度器、CacheManager 缓存管理器与 ExcelExporter 导出模块。其中 MainForm 提供图形界面与交互逻辑,TranslateWorker 负责并发任务分发。

五、数据库结构

sys_language 表字段包括表名、主键ID、字段名、字段值、语言等,主键为(table_name, table_id, field_name, language)。

六、核心功能说明

1. 数据库连接测试:检测服务器可用性并提示详细错误。
2. 翻译逻辑:基于 AlibabaCloud.SDK.Alimt20181012 官方 SDK 调用阿里云机器翻译服务。
3. 只翻译缺失语言:自动跳过已有翻译值的字段,节省调用次数。
4. Excel 导出:支持选择保存路径、防止 BigInt 精度丢失、自动样式化输出。
5. 缓存机制:使用 cache.json 文件缓存已翻译文本以避免重复调用。

七、依赖库

MySql.Data 6.9.12 - MySQL 8.0 连接库
EPPlus 4.5.3.3 - Excel 导出
AlibabaCloud.SDK.Alimt20181012 - 翻译 SDK
Newtonsoft.Json - JSON 缓存文件读写

八、性能优化

使用多线程并发翻译、自动限流机制与缓存避免重复调用,分页查询减少内存压力。

九、常见问题

400 错误请求:语言参数错误
403 无权限:AccessKey 无效或未开通服务
精度丢失:Excel 科学计数法,已通过字符串格式解决

十、部署与运行

1. 安装依赖包(MySql.Data、EPPlus、AlibabaCloud.SDK.Alimt20181012 等)
2. 编译并运行程序。
3. 填写数据库与阿里云配置,测试连接后开始翻译。
4. 翻译完成后点击“导出Excel”。

十一、未来扩展方向

可扩展支持更多语言、批量翻译多个表、导入Excel回写、集成DeepL等翻译服务。

 

主要的C#源代码:

   

using MySql.Data.MySqlClient;
using Newtonsoft.Json;
using OfficeOpenXml;
using Org.BouncyCastle.Asn1.Cmp;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Security.Cryptography;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Web.Script.Serialization;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;namespace AliyunTranslator40
{public partial class MainForm : Form{private string host = "", port = "3306", database = "", user = "", password = "";private string AccessKeyId = "", AccessKeySecret = "";private const string ConfigFile = "config.json";private const string CacheFile = "cache.json";private string ConnStr = "";private volatile bool stopRequested = false;private Dictionary<string, string> cache = new Dictionary<string, string>();private int total = 0, done = 0;private Semaphore sema = new Semaphore(4, 4);private Stopwatch sw = new Stopwatch();public MainForm(){InitializeComponent();LoadConfig();}#region 配置管理private void btnSaveDb_Click(object sender, EventArgs e){host = txtHost.Text.Trim();port = txtPort.Text.Trim();database = txtDb.Text.Trim();user = txtUser.Text.Trim();password = txtPwd.Text.Trim();BuildConnStr();SaveConfig();Log("✅ 数据库配置已保存。");}private void btnSaveKey_Click(object sender, EventArgs e){AccessKeyId = txtKeyId.Text.Trim();AccessKeySecret = txtKeySecret.Text.Trim();SaveConfig();Log("✅ 阿里云密钥已保存。");}private void BuildConnStr(){ConnStr = $"Server={host};Port={port};Database={database};Uid={user};Pwd={password};Charset=utf8mb4;SslMode=None;";}private void LoadConfig(){if (!File.Exists(ConfigFile)) return;var js = new JavaScriptSerializer();var cfg = js.Deserialize<Dictionary<string, string>>(File.ReadAllText(ConfigFile));if (cfg == null) return;host = cfg.ContainsKey("Host") ? cfg["Host"] : "";port = cfg.ContainsKey("Port") ? cfg["Port"] : "3306";database = cfg.ContainsKey("Database") ? cfg["Database"] : "";user = cfg.ContainsKey("User") ? cfg["User"] : "";password = cfg.ContainsKey("Password") ? cfg["Password"] : "";AccessKeyId = cfg.ContainsKey("AccessKeyId") ? cfg["AccessKeyId"] : "";AccessKeySecret = cfg.ContainsKey("AccessKeySecret") ? cfg["AccessKeySecret"] : "";txtHost.Text = host;txtPort.Text = port;txtDb.Text = database;txtUser.Text = user;txtPwd.Text = password;txtKeyId.Text = AccessKeyId;txtKeySecret.Text = AccessKeySecret;BuildConnStr();Log("✅ 已加载配置。");}private void SaveConfig(){var js = new JavaScriptSerializer();var cfg = new Dictionary<string, string>{{"Host", host}, {"Port", port}, {"Database", database},{"User", user}, {"Password", password},{"AccessKeyId", AccessKeyId}, {"AccessKeySecret", AccessKeySecret}};File.WriteAllText(ConfigFile, js.Serialize(cfg));}#endregion#region 翻译流程private void btnStart_Click(object sender, EventArgs e){stopRequested = false;ThreadPool.QueueUserWorkItem(_ => RunTranslate());}private void btnStop_Click(object sender, EventArgs e){stopRequested = true;Log("🛑 已请求停止。");}private void RunTranslate(){try{LoadCache();List<LangRecord> list = new List<LangRecord>();UpdateStatus("正在读取数据...");using (MySqlConnection conn = new MySqlConnection(ConnStr)){conn.Open();var cmd = new MySqlCommand("SELECT table_name, table_id, field_name, field_value FROM sys_language WHERE language='zh-CN';", conn);var reader = cmd.ExecuteReader();while (reader.Read()){list.Add(new LangRecord{TableName = reader["table_name"].ToString(),TableId = Convert.ToInt64(reader["table_id"]),FieldName = reader["field_name"].ToString(),FieldValue = reader["field_value"].ToString()});}reader.Close();}total = list.Count;done = 0;sw.Restart();UpdateStatus($"共 {total} 条数据,开始翻译...");foreach (var rec in list){if (stopRequested) break;sema.WaitOne();ThreadPool.QueueUserWorkItem(state => ProcessRecord(rec));}while (done < total && !stopRequested)Thread.Sleep(500);SaveCache();ExportToExcel();UpdateStatus("✅ 翻译完成。");}catch (Exception ex){Log("❌ 翻译错误:" + ex.Message);}}private void ProcessRecord(LangRecord rec){try{if (stopRequested) return;string cn = rec.FieldValue.Trim();if (chkEnUs.Checked && !HasTranslation(rec, "en-US"))SaveTranslation(rec, "en-US", TranslateAliyun(cn, "zh", "en"));if (chkZhTw.Checked && !HasTranslation(rec, "zh-TW"))SaveTranslation(rec, "zh-TW", TranslateAliyun(cn, "zh", "zh-tw"));if (chkJaJp.Checked && !HasTranslation(rec, "ja-JP"))SaveTranslation(rec, "ja-JP", TranslateAliyun(cn, "zh", "ja"));}catch (Exception ex){Log("⚠️ 单条失败: " + ex.Message);}finally{Interlocked.Increment(ref done);UpdateProgress();sema.Release();}}#endregion#region 阿里云签名翻译private string TranslateAliyun(string text, string from, string to){if (string.IsNullOrWhiteSpace(text))return text;if (string.IsNullOrWhiteSpace(AccessKeyId) || string.IsNullOrWhiteSpace(AccessKeySecret)){Log("⚠️ 阿里云AccessKey未配置");return text;}try{string endpoint = "https://mt.aliyuncs.com";string version = "2018-10-12";string action = "TranslateGeneral";// 构建参数(按字母顺序排序,这是阿里云的要求)var parameters = new SortedDictionary<string, string>(StringComparer.Ordinal){["AccessKeyId"] = AccessKeyId,["Action"] = action,["Format"] = "JSON",["FormatType"] = "text",["Scene"] = "general",["SignatureMethod"] = "HMAC-SHA1",["SignatureNonce"] = Guid.NewGuid().ToString(),["SignatureVersion"] = "1.0",["SourceLanguage"] = from,["SourceText"] = text,["TargetLanguage"] = to,["Timestamp"] = DateTime.UtcNow.ToString("yyyy-MM-ddTHH:mm:ssZ"),["Version"] = version};// 构建查询字符串string queryString = BuildQueryString(parameters);// 计算签名string signature = CalculateSignature("GET", parameters);// 构建最终URLstring finalUrl = $"{endpoint}/?{queryString}&Signature={Uri.EscapeDataString(signature)}";return ExecuteTranslationRequest(finalUrl, text, from, to);}catch (Exception ex){Log($"⚠️ 翻译异常: {ex.Message}");return text;}}/// <summary>/// 构建查询字符串(URL编码)/// </summary>private string BuildQueryString(SortedDictionary<string, string> parameters){var encodedParams = parameters.Select(p =>$"{Uri.EscapeDataString(p.Key)}={Uri.EscapeDataString(p.Value)}");return string.Join("&", encodedParams);}/// <summary>/// 计算阿里云签名/// </summary>private string CalculateSignature(string method, SortedDictionary<string, string> parameters){// 1. 构建规范化查询字符串string canonicalizedQueryString = BuildQueryString(parameters);// 2. 构建待签名字符串string stringToSign = $"{method}&{Uri.EscapeDataString("/")}&{Uri.EscapeDataString(canonicalizedQueryString)}";// 3. 计算HMAC-SHA1签名string key = $"{AccessKeySecret}&";using (var hmac = new HMACSHA1(Encoding.UTF8.GetBytes(key))){byte[] hash = hmac.ComputeHash(Encoding.UTF8.GetBytes(stringToSign));return Convert.ToBase64String(hash);}}/// <summary>/// 执行翻译请求并解析结果/// </summary>private string ExecuteTranslationRequest(string url, string originalText, string from, string to){HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.Method = "GET";request.Timeout = 15000; // 15秒超时request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36";using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())using (Stream stream = response.GetResponseStream())using (StreamReader reader = new StreamReader(stream, Encoding.UTF8)){string responseText = reader.ReadToEnd();if (response.StatusCode != HttpStatusCode.OK){Log($"⚠️ API返回错误状态码: {(int)response.StatusCode}");return originalText;}return ParseTranslationResult(responseText, originalText, from, to, JsonDocument.Parse(responseText));}}/// <summary>/// 解析翻译结果/// </summary>private string ParseTranslationResult(string jsonResponse, string originalText, string from, string to, JsonDocument doc){try{JsonElement root = doc.RootElement;// 检查是否有错误if (root.TryGetProperty("Code", out JsonElement codeElement)){string errorCode = codeElement.GetString();if (!string.IsNullOrEmpty(errorCode) && errorCode != "200"){string errorMessage = root.TryGetProperty("Message", out JsonElement messageElement)? messageElement.GetString(): "未知错误";Log($"⚠️ 翻译API错误: {errorCode} - {errorMessage}");return originalText;}}// 提取翻译结果if (root.TryGetProperty("Data", out JsonElement dataElement) &&dataElement.TryGetProperty("Translated", out JsonElement translatedElement)){string translatedText = translatedElement.GetString();if (!string.IsNullOrEmpty(translatedText)){Log($"🌍 [{from}->{to}] {originalText} => {translatedText}");return translatedText;}}Log($"⚠️ 无法解析翻译结果: {jsonResponse}");return originalText;}catch (Newtonsoft.Json.JsonException ex){Log($"⚠️ JSON解析失败: {ex.Message}");return originalText;}}#endregion#region 数据保存与导出private void SaveTranslation(LangRecord rec, string lang, string val){using (MySqlConnection conn = new MySqlConnection(ConnStr)){conn.Open();string sql = "INSERT INTO sys_language (table_name, table_id, field_name, language, field_value) VALUES (@t,@id,@f,@lang,@val) ON DUPLICATE KEY UPDATE field_value=VALUES(field_value)";MySqlCommand cmd = new MySqlCommand(sql, conn);cmd.Parameters.AddWithValue("@t", rec.TableName);cmd.Parameters.AddWithValue("@id", rec.TableId);cmd.Parameters.AddWithValue("@f", rec.FieldName);cmd.Parameters.AddWithValue("@lang", lang);cmd.Parameters.AddWithValue("@val", val);cmd.ExecuteNonQuery();}}private void btnTestDb_Click(object sender, EventArgs e){try{// 获取输入host = txtHost.Text.Trim();port = txtPort.Text.Trim();database = txtDb.Text.Trim();user = txtUser.Text.Trim();password = txtPwd.Text.Trim();BuildConnStr();// 检查输入有效性if (string.IsNullOrEmpty(host) || string.IsNullOrEmpty(database) || string.IsNullOrEmpty(user)){MessageBox.Show("请输入完整的数据库连接信息(服务器、数据库、用户名)!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);return;}// 显示测试中状态lblStatus.Text = "状态: 正在连接数据库...";lblStatus.Refresh();DateTime start = DateTime.Now;using (var conn = new MySqlConnection(ConnStr)){conn.Open();MySqlCommand cmd = new MySqlCommand("SELECT VERSION();", conn);string version = Convert.ToString(cmd.ExecuteScalar());TimeSpan elapsed = DateTime.Now - start;MessageBox.Show($"✅ 数据库连接成功!\n\n服务器: {host}\n数据库: {database}\n版本: {version}\n耗时: {elapsed.TotalMilliseconds:F0} ms","连接成功",MessageBoxButtons.OK,MessageBoxIcon.Information);Log($"✅ 成功连接数据库 [{database}] (版本: {version}),耗时 {elapsed.TotalMilliseconds:F0} ms");lblStatus.Text = "状态: 数据库连接成功 ✅";}}catch (MySqlException ex){string msg;switch (ex.Number){case 1045: msg = "用户名或密码错误"; break;case 1042: msg = "无法连接到指定主机"; break;case 1049: msg = "数据库不存在"; break;default: msg = "MySQL 错误: " + ex.Message; break;}MessageBox.Show($"❌ 连接失败: {msg}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);Log("❌ 连接失败: " + msg);lblStatus.Text = "状态: 连接失败 ❌";}catch (Exception ex){MessageBox.Show($"❌ 未知错误: {ex.Message}", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);Log("❌ 未知错误: " + ex.Message);lblStatus.Text = "状态: 连接异常 ❌";}}private void btnExport_Click(object sender, EventArgs e){ExportToExcel();}private void ExportToExcel(){try{UpdateStatus("正在准备导出 Excel...");// 1️⃣ 弹出保存文件对话框SaveFileDialog sfd = new SaveFileDialog();sfd.Title = "选择导出路径";sfd.Filter = "Excel 文件 (*.xlsx)|*.xlsx";sfd.FileName = $"translate_result_{DateTime.Now:yyyyMMdd_HHmmss}.xlsx";sfd.InitialDirectory = AppDomain.CurrentDomain.BaseDirectory;if (sfd.ShowDialog() != DialogResult.OK){Log("⚠️ 用户取消导出。");UpdateStatus("已取消导出");return;}string file = sfd.FileName;Log("📁 导出路径:" + file);UpdateStatus("正在导出 Excel,请稍候...");// 2️⃣ 创建 Excelusing (var pkg = new OfficeOpenXml.ExcelPackage()){var ws = pkg.Workbook.Worksheets.Add("Translations");// 表头string[] headers = { "表名", "主键ID", "字段名", "中文(zh-CN)", "繁体(zh-TW)", "英文(en-US)", "日文(ja-JP)" };for (int i = 0; i < headers.Length; i++){ws.Cells[1, i + 1].Value = headers[i];ws.Cells[1, i + 1].Style.Font.Bold = true;ws.Cells[1, i + 1].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;ws.Cells[1, i + 1].Style.Fill.BackgroundColor.SetColor(System.Drawing.Color.LightGray);ws.Cells[1, i + 1].Style.HorizontalAlignment = OfficeOpenXml.Style.ExcelHorizontalAlignment.Center;}// 3️⃣ 查询数据并写入using (MySqlConnection conn = new MySqlConnection(ConnStr)){conn.Open();string sql = @"SELECT table_name, table_id, field_name,MAX(CASE WHEN language='zh-CN' THEN field_value END) AS zhCN,MAX(CASE WHEN language='zh-TW' THEN field_value END) AS zhTW,MAX(CASE WHEN language='en-US' THEN field_value END) AS enUS,MAX(CASE WHEN language='ja-JP' THEN field_value END) AS jaJPFROM sys_languageGROUP BY table_name, table_id, field_nameORDER BY table_name, table_id, field_name;";MySqlCommand cmd = new MySqlCommand(sql, conn);var reader = cmd.ExecuteReader();int row = 2;while (reader.Read()){string tableName = Convert.ToString(reader["table_name"]);string tableId = Convert.ToString(reader["table_id"]);  // ⚠️ BigInt → stringstring fieldName = Convert.ToString(reader["field_name"]);ws.Cells[row, 1].Value = tableName;ws.Cells[row, 2].Value = tableId;ws.Cells[row, 3].Value = fieldName;ws.Cells[row, 4].Value = Convert.ToString(reader["zhCN"]);ws.Cells[row, 5].Value = Convert.ToString(reader["zhTW"]);ws.Cells[row, 6].Value = Convert.ToString(reader["enUS"]);ws.Cells[row, 7].Value = Convert.ToString(reader["jaJP"]);// 设置 ID 列为文本格式(防止科学计数法)ws.Cells[row, 2].Style.Numberformat.Format = "@";row++;}reader.Close();}// 4️⃣ 自动列宽 + 边框ws.Cells.AutoFitColumns();var range = ws.Cells[1, 1, ws.Dimension.End.Row, ws.Dimension.End.Column];range.Style.Border.Top.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;range.Style.Border.Left.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;range.Style.Border.Right.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;range.Style.Border.Bottom.Style = OfficeOpenXml.Style.ExcelBorderStyle.Thin;// 5️⃣ 保存文件pkg.SaveAs(new FileInfo(file));}Log("✅ Excel 导出完成:" + file);UpdateStatus("✅ Excel 导出完成");MessageBox.Show($"✅ 导出成功!\n文件已保存至:\n{file}", "导出成功", MessageBoxButtons.OK, MessageBoxIcon.Information);// 6️⃣ 询问是否打开文件夹if (MessageBox.Show("是否打开文件所在文件夹?", "完成", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes){try{System.Diagnostics.Process.Start("explorer.exe", "/select,\"" + file + "\"");}catch { }}}catch (Exception ex){Log("❌ 导出失败: " + ex.Message);MessageBox.Show("❌ 导出失败: " + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);UpdateStatus("❌ 导出失败");}}#endregion#region UI 控制private void UpdateProgress(){if (InvokeRequired) { Invoke(new Action(UpdateProgress)); return; }double pct = total > 0 ? done * 100.0 / total : 0;progressBar.Value = (int)Math.Min(100, pct);lblStatus.Text = $"进度: {pct:F1}% ({done}/{total})";}private void UpdateStatus(string msg){if (InvokeRequired) { Invoke(new Action<string>(UpdateStatus), msg); return; }lblStatus.Text = "状态: " + msg;}private void Log(string msg){if (InvokeRequired) { Invoke(new Action<string>(Log), msg); return; }txtLog.AppendText($"[{DateTime.Now:HH:mm:ss}] {msg}\r\n");}private void LoadCache(){if (File.Exists(CacheFile)){var js = new JavaScriptSerializer();cache = js.Deserialize<Dictionary<string, string>>(File.ReadAllText(CacheFile));if (cache == null) cache = new Dictionary<string, string>();Log($"🧠 加载缓存:{cache.Count} 条");}}private void SaveCache(){var js = new JavaScriptSerializer();File.WriteAllText(CacheFile, js.Serialize(cache));Log($"💾 保存缓存:{cache.Count} 条");}#endregionprivate bool HasTranslation(LangRecord rec, string lang){try{using (MySqlConnection conn = new MySqlConnection(ConnStr)){conn.Open();string sql = "SELECT COUNT(*) FROM sys_language WHERE table_name=@t AND table_id=@id AND field_name=@f AND language=@lang AND field_value IS NOT NULL AND field_value <> '';";MySqlCommand cmd = new MySqlCommand(sql, conn);cmd.Parameters.AddWithValue("@t", rec.TableName);cmd.Parameters.AddWithValue("@id", rec.TableId);cmd.Parameters.AddWithValue("@f", rec.FieldName);cmd.Parameters.AddWithValue("@lang", lang);object count = cmd.ExecuteScalar();return Convert.ToInt32(count) > 0;}}catch (Exception ex){Log("⚠️ 检查翻译状态出错:" + ex.Message);return false;}}}public class LangRecord{public string TableName;public long TableId;public string FieldName;public string FieldValue;}
}

  

 

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

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

相关文章

植物大战僵尸全系列下载 PVZ植物大战僵尸全集版分享下载 原版民间修改版含安卓手机+电脑+ios各平台

PVZ植物大战僵尸全集版分享下载 原版民间修改版含安卓手机+电脑+ios各平台 《植物大战僵尸》凭借其经典的玩法,催生了大量官方版本和极具创意的民间改版。以下我将为你…

Pytorch66页实验题

import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import matplotlib.pyplot as plt import numpy as npprint("林丽坤参与了 …

记一次激活Jetbrains全家桶流程

最初是在网上第三方找到的Crack文件,该文件的原作者与原网址不得而知,按照网上的二手教程进行操作,结果Pycharm激活完成了,IDEA却没有。今天突发奇想,想到激活文件sniarbtej-2024.2.8.jar应该是个极少见、极有特色…

uni-app x开发商城系统,商品列表

一、概述 上一篇已经实现了Icon 图标显示,接下来,展示商品列表数据,效果如下:二、布局页面 可以看到,显示为2列,每一列有2条数据。 这里依然使用flex布局,在开发的时候,我们可以在页面中,先把数据固定好,可以…

PySimpleGUI 中有没有类似VB的timer组件

在PySimpleGUI中,没有直接等同于VB的Timer组件,但可通过以下两种方式实现类似功能,且PySimpleGUI 5.0+版本提供了更优化的定时器管理方案: 一、通过window.read(timeout)模拟定时器原理:利用window.read(timeout)…

【填坑】电脑用户名有中文字符,如何与github建立SSH连接

前情提要 因为我之前很作死的在电脑本地用户名中设置了中文字符,导致始终无法与github建立ssh连接 如今通过hexo在github上建立了一个博客,为了更新方便,如今是必须要姐姐这个ssh连接github的历史遗留问题了。 好在…

向量空间与子空间

映射 对于集合 \(X,Y\),定义映射 \[F:X \to Y \]表示 \[\forall x\in X, F(x)\in Y \]若 \(\forall x_1\neq x_2\),\(F(x_1)\neq F(x_2)\),称 \(F\) 为单射。 若 \(\forall y\in Y\),\(\exists F(x)=y\),称 \(F\)…

西工大开源 Easy Turn:全双工轮次转换检测模型;百度 MuseSteamer 引入开放世界生成能力丨日报

开发者朋友们大家好:这里是 「RTE 开发者日报」 ,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享 RTE(Real-Time Engagement) 领域内「有话题的技术」、「有亮点的产品」、「有思考的文章」、「有态…

10/16

今天体测了,肺活量5700,引体向上也有分,明天一定好好学习

MrakDown学习

MrakDown学习$(".postTitle2").removeClass("postTitle2").addClass("singleposttitle");MarkDown 标题 +空格+名字 字体 (粗体)Hello World (斜体)Hello World (斜体加粗)Hello World …

2025.10.16总结

对uml九种图的总结 1. 用例图核心描述:从用户(参与者)角度描述系统的功能需求。它定义了系统的边界,说明了“谁”在系统“内部”能“做什么”。 核心元素: 参与者:系统外部的、与系统交互的人、组织或其他系统。…

日常生活中的AI应用记录-2

2025-10-16 百度首页改版,加入了AI搜索功能,可以直接跳转到AI搜索页面. 稀土掘金首页-首要位置添加了-AICoding 栏目- infoq中-添加了多个AI相关的栏目- 51-CTO-中已经将人工智能板块,放在了网站的的首页位置, …

containerd二进制安装

containerd有两种安装包:第一种是containerd-xxx,这种包用于单机测试没问题,不包含runC,需要提前安装。第二种是cri-containerd-cni-xxx,baohan runC和k8s里所需要的相关文件。k8s集群需要用到此包。虽然包含runC,…

维修笔记 | 一例滤波电容老化引发开关电源异常现象

本文记录了一次开关电源故障的排查与维修过程。设备启动失败,经测试发现问题出在电源模块。拆解发现输出滤波电容鼓包,实际容值大幅下降。更换高频低阻电解电容后,输出恢复正常,设备运行稳定。结合容值测量与输出测…

(一)GPU与CUDA概述

前言GPU的发展起源可追溯至20世纪80-90年代,其核心驱动力来自游戏对浮点运算(FPU)的爆炸性需求。早期CPU的FPU性能仅为游戏需求的1/20,迫使英特尔通过MMX、SSE等向量处理单元提升并行计算能力,但仍无法满足需求。…

实验1 面向对象程序设计C++

实验任务1: 源代码task1.cpp1 #include<iostream>2 #include<string>3 #include<vector>4 #include<algorithm>5 6 template<typename T>7 void output(const T &c);8 9 void test…

练习篇:第一次markdown成果展示

学期2025-2024-1 学号20252332 《网络》第一周学习总结教材学习内容总结思维导图如下: 【金山文档- 网络空间安全导论学习总结】 (https://www.kdocs.cn/l/ciLWfzglzFzW) 教材学习中的问题和解决问题过程问题1:为什…

DirectX RayTracing (3) 程序图元及复杂光照

DirectX RayTracing (3) 程序图元及复杂光照 ​ 离上一篇文章隔的有点久了,在国庆前其实就看完了微软官方的案例并复刻了出来,但是一直懒得写,国庆也全拿去玩了,拖到过完了国庆才动笔。 ​ 在前面两篇中基本把 DX…

微软已停止对 Windows 10 系统的支持

参考https://www.microsoft.com/zh-cn/windows/end-of-support正文博 主 :夏秋初地 址 :https://www.cnblogs.com/xiaqiuchu/p/19146827 如果对你有帮助,可以点一下{$(#green_channel_follow).click()})() "…

NiN模型

NiN模型 import torch from torch import nn from d2l import torch as d2l def NiN_block(in_chanels,out_chanels,kernel_size,padding,stride):#NiN块return nn.Sequential(nn.Conv2d(in_chanels,out_chanels,kerne…