www·
用了订阅模式之后总感觉我正在写的是 API 接口……
// 配置信息 app.conf
export class AppConf extends Conf {
// app 启动时是否自动打开仓库
#autoOpenVault: boolean;
#autoOpenVaultListeners: ((autoOpenVault: boolean) => any)[];
autoOpenVault_listen(callback: (autoOpenVault: boolean) => any): UnlistenFn {
const id = this.#autoOpenVaultListeners.push(callback) - 1;
return () => { delete this.#autoOpenVaultListeners[id]; };
}
get autoOpenVault() { return this.#autoOpenVault; }
set autoOpenVault(autoOpenVault: boolean) {
this.#autoOpenVault = autoOpenVault;
for (const callback of this.#autoOpenVaultListeners) { if (typeof callback === "function") { callback(autoOpenVault); } }
}
// app 启动时用户指定的自动打开的仓库路径
#alwaysOpenVaultPath: string;
#alwaysOpenVaultPathListeners: ((alwaysOpenVaultPath: string) => any)[];
alwaysOpenVaultPath_listen(callback: (alwaysOpenVaultPath: string) => any): UnlistenFn {
const id = this.#alwaysOpenVaultPathListeners.push(callback) - 1;
return () => { delete this.#alwaysOpenVaultPathListeners[id]; };
}
get alwaysOpenVaultPath() { return this.#alwaysOpenVaultPath; }
set alwaysOpenVaultPath(alwaysOpenVaultPath: string) {
this.#alwaysOpenVaultPath = alwaysOpenVaultPath;
for (const callback of this.#alwaysOpenVaultPathListeners) { if (typeof callback === "function") { callback(alwaysOpenVaultPath); } }
}
// app 记录的最后一次打开的仓库路径
#lastOpenVaultPath: string;
#lastOpenVaultPathListeners: ((lastOpenVaultPath: string) => any)[];
lastOpenVaultPath_listen(callback: (lastOpenVaultPath: string) => any): UnlistenFn {
const id = this.#lastOpenVaultPathListeners.push(callback) - 1;
return () => { delete this.#lastOpenVaultPathListeners[id]; };
}
get lastOpenVaultPath() { return this.#lastOpenVaultPath; }
set lastOpenVaultPath(lastOpenVaultPath: string) {
this.#lastOpenVaultPath = lastOpenVaultPath;
for (const callback of this.#lastOpenVaultPathListeners) { if (typeof callback === "function") { callback(lastOpenVaultPath); } }
}
// app 记录的用户所拥有的仓库路径列表
#ownVaultPaths: string[];
#ownVaultPathsListeners: ((ownVaultPaths: string[]) => any)[];
ownVaultPaths_listen(callback: (ownVaultPaths: string[]) => any): UnlistenFn {
const id = this.#ownVaultPathsListeners.push(callback) - 1;
return () => { delete this.#ownVaultPathsListeners[id]; };
}
get ownVaultPaths() { return this.#ownVaultPaths; }
set ownVaultPaths(ownVaultPaths: string[]) {
this.#ownVaultPaths = [];
for (const item of ownVaultPaths) { if (typeof item === "string") { this.#ownVaultPaths.push(item); } }
for (const callback of this.#ownVaultPathsListeners) { if (typeof callback === "function") { callback(ownVaultPaths); } }
}
// 构造函数
constructor() {
super();
// 设置默认值
this.#autoOpenVault = false;
this.#alwaysOpenVaultPath = "";
this.#lastOpenVaultPath = "";
this.#ownVaultPaths = [];
// Listeners
this.#autoOpenVaultListeners = [];
this.#alwaysOpenVaultPathListeners = [];
this.#lastOpenVaultPathListeners = [];
this.#ownVaultPathsListeners = [];
}
}
www·
谢谢各位大佬的回答!我是业余爱好者,主业是做医药的。
最早开始接触编程是给 Obsidian 写插件,学了一些些 TypeScript 和 Vue 3 ,也就基本够用的水平。Rust 学到了多线程,后面感觉很难还没敢继续深入学习…… 不过学着学着突然就冒出了很多以前我没听说过的新语言,也不知道学哪个好,故才问此问题。
我其实是想写一些跨平台的研究工具(带 GUI 的),涉及科学计算所以要求计算结果比较精确。Electron 可以吗(这个框架好像很火啊,新版 QQ 好像也是用的这个)?还是 Tauri 比较好?Python 是不是也可以开发 GUI 程序啊不过会不会性能不太好?或者大佬还有没有其它的推荐呢 ?
还有我有一个非常好奇的问题,就是像这些网页里的 3D引擎 到底是怎么做出来的 ?!一个人的话有机会开发出来吗?
www·
方法
from http.client import HTTPConnection
from urllib.parse import quote
from random import randint
from hashlib import md5
from json import loads
from time import sleep
def BaiduFanyi(input_text):
# 因为百度限制每秒1次访问,故此处静默1.5s,可适当调整
sleep(1.5)
# 准备工作
appid = '20008899554321678' # 此处替换为自己的百度翻译appid
secretKey = 'fRbVG3UqP2_CkgwSzJHM' # 此处替换为自己的百度翻译密钥
url = '/api/trans/vip/translate'
fromLang = 'auto' # 源语言,此处可进行替换,auto是自动,en是英语,zh是中文
toLang = 'zh' # 目标语言,此处可进行替换
# 开始翻译
httpClient = None
salt = randint(3276, 65536)
sign = appid + input_text + str(salt) + secretKey
sign = md5(sign.encode()).hexdigest()
url = url \
+ '?appid=' + appid \
+ '&q=' + quote(input_text) \
+ '&from=' + fromLang \
+ '&to=' + toLang \
+ '&salt=' + str(salt) \
+ '&sign=' + sign
output_text = ""
try:
httpClient = HTTPConnection('api.fanyi.baidu.com')
httpClient.request('GET', url)
response = httpClient.getresponse()
result_response = response.read().decode('utf-8')
result_json = loads(result_response)
# 读取百度翻译返回的结果
output_text = ""
for n in range(0, len(result_json['trans_result'])):
output_text = output_text + result_json['trans_result'][n]['dst'] + "\n"
return output_text
except Exception as e:
return "翻译出错"
finally:
if httpClient:
httpClient.close()
if __name__ == "__main__":
# 百度翻译是支持多行文本的,只要你处理好换行关系,多少行文本都没问题
# 但是请注意,百度限制了每次最多提交5000个字符(包括空格和标点符号),超过的部分会被抹去
input_text = "Hello.\nI'm Bear Xiong.\nNice to meet you."
output_text = BaiduFanyi(input_text)
print(output_text)
后记
曾几何时,我有一份「 英文文献信息.xlsx 」,里面有着2万4千余条需要进行初筛的文献记录,净是英文。那是一段令人痛苦的经历……
最后补充一句:
别想了,上面的 appid 和 密钥 是我乱写的,自己申请去