最近玩stable diffusion画图,但是炼丹编辑tag时发现没有趁手的批量编辑器;所以就自己写了一个。有兴趣的可以自己优化哈!
- 支持本地翻译、百度API和有道API翻译。
- 增删改tag单词
- 顺序调整
- 批量编辑
百度网盘链接https://pan.baidu.com/s/10QCkNb5YgObNYHd-qUToxQ?pwd=1111
提取码:1111
界面
主窗口代码
import json
import os
import requests
import wx.grid
import wx, wx.lib.scrolledpanel,wx.adv
import subprocess
import glob # 查找特定文件类型的模块
import SDtag设置界面 # 导入子窗口代码
import configparser
import openpyxl
import hashlib
import uuid
import time
import random
from hashlib import md5
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, None, title='SD-tag批量编辑器', size=(1217, 820),name='frame',style=541072384)
self.Centre()
# 属性
self.程序运行路径 = os.getcwd() # 获取程序运行路径
self.文件路径 = '' # 图片和tag文件存放路径
self.所有文件名 = {} # 所有的图片和txt路径和名称
self.tag = {} # 所有的tag单词;key是序号,值是tag字符串
self.全部单词 = {} #所有tag文件里单词去重后中英文翻译字典;key是英文,值是中文(翻译后才有中文否则是空字符)
self.id = 1 # 记录选中的蓝色标签,在设置翻译项和字体大小刷新单tag时保持蓝色标签显示
self.id_编辑框 = 10000 # 创建编辑框的id号,保证不重复
self.光标选中id = [None,None,None,None] # 记录中英文编辑框里光标选中的编辑框(0是布尔值:是否选英文标签;1是整数:选中的标签id;2是选中的编辑框值;3是选中编辑框对象;4是是否获取焦点)
self.区分手动修改编辑框 = False # 如果是SetValue修改了面板3编辑框的值会先置成False,就不会触发内容被改变(不会记录到修改单词列表)
self.面板3修改的单词 = {} # 在面板3中修改的单词的原始值和修改值
self.配置文件 = {'jiemianpeizhi': {'onetagfontsize': '12', 'alltagfontsize': '12'},
'fanyijiekou': {'fanyiapi': 'bendi'}, 'youdao': {'key': '', 'secret': ''},
'ali': {'key': '', 'secret': ''}, 'baidu': {'key': '', 'secret': ''},
'tengxun': {'key': '', 'secret': ''}, 'fanyikaiguan': {'danxiang': '0', 'shuangxiang': '0'}}
self.定时器 = wx.Timer(self) # 创建定时器
self.Bind(wx.EVT_TIMER, self.定时器事件, self.定时器)
try:
self.读配置() # 读取配置文件信息
except Exception as 报错1:
提示框 = wx.MessageDialog(None, '读取配置文件异常({})'.format(str(报错1)), "提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
图片背景 = wx.Bitmap(self.程序运行路径 + '\图片\首页.png')
self.图片框 = wx.StaticBitmap(self, bitmap=图片背景, pos=(0, 0)) # 背景图片
self.图片框.Disable() # 背景图片设置禁用
icon = wx.Icon(self.程序运行路径 + '\图片\\222.ico', wx.BITMAP_TYPE_ICO) # 创建一个图标对象
self.SetIcon(icon) # 将图标设置为应用程序图标
self.菜单栏() # 启动组件
def 读配置(self):
配置对象 = configparser.ConfigParser() # 创建 ConfigParser 对象
配置对象.read(self.程序运行路径+'\文件\config.ini') # 读取配置文件
所有节 = 配置对象.sections() # 获取所有节
for 节 in 所有节: # 打印所有节和对应的配置项
# print('[' + 节 + ']')
options = 配置对象.options(节)
配置节 = {}
for option in options:
配置节[option] = 配置对象.get(节, option)
# print(option + ' = ' + 配置对象.get(节, option))
self.配置文件[节] = 配置节
def 菜单栏(self):
菜单栏 = wx.MenuBar() # 实例化菜单栏
文件菜单 = wx.Menu() # 实例化文件菜单类
# 文件菜单类
文件菜单.Append(id=wx.ID_OPEN, item="打开", helpString='这是打开文件菜单选项') # 添加菜单项1
文件菜单.Append(wx.ID_DOWN, "tag研究")
菜单栏.Append(文件菜单, "文件") # 添加到菜单栏
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_OPEN) # 通过ID绑定事件
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_DOWN)
# 翻译菜单类
self.翻译菜单 = wx.Menu() # 实例化翻译菜单类
self.开启双向翻译=self.翻译菜单.Append(wx.ID_NEW, "开启双向翻译",kind=wx.ITEM_CHECK)
self.开启单向翻译=self.翻译菜单.Append(wx.ID_ADD, "开启单向翻译",kind=wx.ITEM_CHECK)
if self.配置文件['fanyikaiguan']['danxiang'] == 'True':
self.翻译菜单.Check(wx.ID_ADD, True)
elif self.配置文件['fanyikaiguan']['shuangxiang'] == 'True':
self.翻译菜单.Check(wx.ID_NEW, True)
菜单栏.Append(self.翻译菜单, "翻译") # 添加到菜单栏
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_NEW) # 通过ID绑定事件
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_ADD) # 通过ID绑定事件
# 设置菜单类
设置菜单 = wx.Menu() # 实例化设置菜单类
设置菜单.Append(wx.ID_YES, "界面设置")
设置菜单.Append(wx.ID_OK, "翻译接口设置")
菜单栏.Append(设置菜单, "设置")
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_YES) # 通过ID绑定事件
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_OK)
self.SetMenuBar(菜单栏) # 把具体的菜单栏加到窗口中
# 关于菜单类
关于菜单 = wx.Menu() # 实例化关于菜单类
关于菜单.Append(wx.ID_ABORT, "首页")
关于菜单.Append(wx.ID_SAVE, "关于")
菜单栏.Append(关于菜单, "关于")
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_ABORT) # 通过ID绑定事件
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_SAVE)
self.Bind(event=wx.EVT_MENU, handler=self.菜单栏事件, id=wx.ID_ABOUT)
self.SetMenuBar(菜单栏) # 把具体的菜单栏加到窗口中
def 菜单栏事件(self, e):
def 写配置(单双向,开关):
配置对象 = configparser.ConfigParser()
配置对象.read(self.程序运行路径 + '\文件\config.ini')
if 单双向 == 1:
配置对象.set('fanyikaiguan', 'danxiang', 开关)
elif 单双向 == 2:
配置对象.set('fanyikaiguan', 'shuangxiang', 开关)
with open(self.程序运行路径 + '\文件\config.ini', 'w') as configfile:
配置对象.write(configfile)
if e.GetId() == wx.ID_OPEN: # 打开
打开文件夹 = wx.DirDialog(self, message='打开文件夹', style=wx.DD_CHANGE_DIR)
if 打开文件夹.ShowModal() == wx.ID_OK:
# 1.如果多次打开文件清理上一次面板,第一次打开不执行
if self.所有文件名 != {}: # 第二次打开文件时清理第一次创建的面板以及上面的组件
self.滚动面板1.Destroy()
self.滚动面板2.Destroy()
self.滚动面板3.Destroy()
self.所有文件名.clear()
self.tag.clear()
self.全部单词.clear()
self.id = 1
self.id_编辑框 =10000
self.光标选中id = [None, None, None, None]
# 2.获取所有的文件路径和名称(图片和txt)到字典,给图片和名称函数用
self.文件路径 = 打开文件夹.GetPath() # 获取选择的路径
self.SetTitle(self.文件路径) # 置标题
文件名 = self.文件路径 + r'\*.*' # 路径加所有的文件名称
计次 = 0
try:
for 文件名字 in glob.glob(文件名): # 获取所有的文件路径名
self.所有文件名[计次] = 文件名字 # 写入字典
计次 += 1
# 3.从self.所有文件名分离txt文件路径名到txt字典
txt = {}
for 序号 in self.所有文件名:
后缀 = self.所有文件名[序号].rpartition('.')
if 后缀[2] =='txt':
txt[序号] = self.所有文件名[序号]
# 4.从txt文件名读取tag写入self.tag字典,给单标签函数和全部标签函数用
for txt路径序号 in txt:
tag单词列表 = []
with open(txt[txt路径序号], encoding='utf8') as 文本:
tag内容 = 文本.read()
tag单词列表2 = tag内容.split(',') # 获取每个tag逗号分割出每个单词,类型是列表
for tag单词22 in tag单词列表2:
if tag单词22 == '' or tag单词22 == ' ': # 如果单词是空或空格
pass
else:
if tag单词22[0].isspace() == True: # 如果单词前面有空格
tag单词列表.append(tag单词22[1:]) # 删除空格后加到列表
else: # 没有空格的加到列表
tag单词列表.append(tag单词22)
self.tag[txt路径序号]=json.dumps(tag单词列表) # 把列表转换成json字符串加到self.tag字典中的值
# 5.把self.tag字典的tag拿出来去重汇总
for 单行tag序号 in self.tag:
tag列表 = eval(self.tag[单行tag序号])
for tag单词 in tag列表: # 列表里的单词循环拿出来
if tag单词 not in self.全部单词: # 过滤相同单词
self.全部单词[tag单词] = '' # 汇总所有单词,没有重复的,类型字典,value是空字符串
except Exception as 报错2:
提示框 = wx.MessageDialog(None, '读取图片或tag文件名异常({})'.format(str(报错2)), "提示",
wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
else: # 上面读取图片和txt文件没有报错,才会继续执行下面代码
self.加载 = SDtag设置界面.加载中(self)
self.面板(0)
self.加载.Destroy()
else:
print('没有选择路径文件')
elif e.GetId() == wx.ID_SAVE: # 关于版本
print("版本")
self.加载 = SDtag设置界面.版本(self)
elif e.GetId() == wx.ID_NEW: # 开启双向翻译
self.翻译菜单.Check(self.开启单向翻译.GetId(), False) # 取消单向的勾选
# 刷新翻译设置
if self.所有文件名 != {}: # 判断首次打开文件时不会执行,打开过文件时切换翻译开关会关闭面重新打开面板
self.滚动面板2.Destroy()
self.滚动面板3.Destroy()
self.加载 = SDtag设置界面.加载中(self)
self.面板(44) # 只重新执行面板2和面板3
self.加载.Destroy()
# 保存翻译配置
if self.开启双向翻译.IsChecked():
写配置(2,'True')
写配置(1,'False')
else:
写配置(2,'False')
elif e.GetId() == wx.ID_ADD: # 开启单向翻译
self.翻译菜单.Check(self.开启双向翻译.GetId(), False) # 取消双向的勾选
# 刷新翻译设置
if self.所有文件名 != {}: # 有内容才会执行,没内容不创建面板
self.滚动面板2.Destroy()
self.滚动面板3.Destroy()
self.加载 = SDtag设置界面.加载中(self)
self.面板(44) # 只重新执行面板2和面板3
self.加载.Destroy()
# 保存翻译配置
if self.开启单向翻译.IsChecked():
写配置(1, 'True')
写配置(2, 'False')
else:
写配置(1, 'False')
elif e.GetId() == wx.ID_YES: # 界面设置
SDtag设置界面.界面设置窗口(self)
elif e.GetId() == wx.ID_OK: # 翻译接口设置
SDtag设置界面.翻译窗口(self)
elif e.GetId() == wx.ID_ABORT: # 首页
if self.所有文件名 != {}: # 处理首页中点首页不报错
self.滚动面板1.Destroy()
self.滚动面板2.Destroy()
self.滚动面板3.Destroy()
self.面板4.Destroy()
self.面板5.Destroy()
self.所有文件名.clear()
self.tag.clear()
self.全部单词.clear()
self.id = 1
self.id_编辑框 = 10000 # 创建编辑框时设置的唯一id
self.光标选中id = [None, None, None, None]
elif e.GetId() == wx.ID_DOWN: # tag研究
路径和文件 = os.path.join(self.程序运行路径 + r'\文件\tag大全', '启动文件.html')
subprocess.Popen(['start', '', 路径和文件])
def 面板(self,分别):
if 分别 == 0: # 打开文件使用
try: #
self.读配置() # 打开文件时先读配置信息
self.翻译(False, '') # 翻译单词,耗时长
except Exception as 报错3:
提示框 = wx.MessageDialog(None, "读取配置或翻译异常({})".format(str(报错3)), "提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
# 设置滚动面板1
self.滚动面板1 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(400, 758),pos=(0,0))
self.滚动面板1.SetupScrolling() # 显示滚动条
self.图片和名称() # 获取图片和tag文件名
# 设置滚动面板2
self.滚动面板2 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(400, 0))
self.滚动面板2.SetupScrolling() # 显示滚动条
self.单标签()
# 设置滚动面板3
self.滚动面板3 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(800, 0))
self.滚动面板3.SetupScrolling() # 显示滚动条
self.全部标签()
# 面板4
self.面板4 =wx.Panel(self,size=(50,758), pos=(750,0), style=wx.SIMPLE_BORDER)
翻译_按钮 = wx.Button(parent=self.面板4, id=32700, size=(48, 30), pos=(0,210), label='翻译') # 设置按钮
增加_按钮 = wx.Button(parent=self.面板4,id=32701, size=(48, 30), pos=(0,240), label='增加') # 设置按钮
删除_按钮 = wx.Button(parent=self.面板4, id=32702,size=(48, 30), pos=(0,270), label='删除') # 设置按钮
重置_按钮 = wx.Button(parent=self.面板4,id=32703, size=(48, 30), pos=(0,300), label='重置') # 设置按钮
向上_按钮 = wx.Button(parent=self.面板4, id=32704,size=(48, 30), pos=(0,330), label='上移') # 设置按钮
向下_按钮 = wx.Button(parent=self.面板4,id=32705, size=(48, 30), pos=(0,360), label='下移') # 设置按钮
打开_按钮 = wx.Button(parent=self.面板4,id=32707, size=(48, 30), pos=(0,390), label='打开') # 设置按钮
保存_按钮 = wx.Button(parent=self.面板4, id=32708,size=(48, 30), pos=(0,420), label='保存') # 设置按钮
# 面板5
self.面板5 = wx.Panel(self, size=(50, 758), pos=(1150, 0), style=wx.SIMPLE_BORDER)
翻译2_按钮 = wx.Button(parent=self.面板5,id=32710, size=(48, 30), pos=(0, 240), label='翻译') # 设置按钮
增加2_按钮 = wx.Button(parent=self.面板5,id=32711, size=(48, 30), pos=(0, 270), label='增加') # 设置按钮
删除2_按钮 = wx.Button(parent=self.面板5,id=32712, size=(48, 30), pos=(0, 300), label='删除') # 设置按钮
重置2_按钮 = wx.Button(parent=self.面板5,id=32713,size=(48, 30), pos=(0, 330), label='重置') # 设置按钮
同步2_按钮 = wx.Button(parent=self.面板5,id=32714, size=(48, 30), pos=(0, 360), label='同步') # 设置按钮
保存2_按钮 = wx.Button(parent=self.面板5,id=32715, size=(48, 30), pos=(0, 390), label='保存') # 设置按钮
self.Bind(wx.EVT_BUTTON, self.按钮被单击,id=32700,id2=32715)
elif 分别 == 2: # 点击单个tag按钮时调用
# 设置滚动面板2
self.滚动面板2 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(400, 0))
self.滚动面板2.SetupScrolling() # 显示滚动条
self.单标签() # 在面板上生成组件
elif 分别 == 3: # 重置2调用
# 设置滚动面板3
self.滚动面板3 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(800, 0))
self.滚动面板3.SetupScrolling() # 显示滚动条
self.全部标签()
elif 分别 == 4: # 切换翻译双向或单向时以及调整字体大小时调用
# 设置滚动面板2
self.滚动面板2 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(400, 0))
self.滚动面板2.SetupScrolling() # 显示滚动条
self.单标签()
# 设置滚动面板3
self.滚动面板3 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(800, 0))
self.滚动面板3.SetupScrolling() # 显示滚动条
self.全部标签()
elif 分别 == 44: # 修改翻译api时调用
try: #
self.翻译(False,'') # 翻译单词,耗时长
except Exception as 报错4:
提示框 = wx.MessageDialog(None, "翻译异常({})".format(str(报错4)), "提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
# 设置滚动面板3
self.滚动面板2 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(400, 0))
self.滚动面板2.SetupScrolling() # 显示滚动条
self.单标签()
# 设置滚动面板3
self.滚动面板3 = wx.lib.scrolledpanel.ScrolledPanel(parent=self, id=-1, size=(350, 758), pos=(800, 0))
self.滚动面板3.SetupScrolling() # 显示滚动条
self.全部标签()
# 第三个面板的组件
def 全部标签(self):
字号_all = int(self.配置文件['jiemianpeizhi']['alltagfontsize'])
字体_all = wx.Font(字号_all, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.垂直盒子布局_all = wx.BoxSizer(wx.VERTICAL)
if self.开启双向翻译.IsChecked():
for 单词 in self.全部单词:
水平布局管理器_all = wx.BoxSizer(wx.HORIZONTAL)
编辑框1_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框,value=单词, size=(175, 字号_all+18))
self.id_编辑框 += 1
编辑框1_all.Bind(wx.EVT_SET_FOCUS,self.所有英文编辑框_获得焦点)
编辑框1_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
#编辑框1_all.Bind(wx.EVT_KILL_FOCUS, self.所有中英文编辑框_失去焦点)
编辑框2_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框,value=self.全部单词[单词],size=(156, 字号_all+18))
self.id_编辑框 += 1
编辑框2_all.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
#编辑框2_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
#编辑框2_all.Bind(wx.EVT_KILL_FOCUS, self.所有中英文编辑框_失去焦点)
编辑框1_all.SetFont(字体_all)
编辑框2_all.SetFont(字体_all)
水平布局管理器_all.Add(编辑框1_all)
水平布局管理器_all.Add(编辑框2_all)
self.垂直盒子布局_all.Add(水平布局管理器_all, 0, wx.ALL)
elif self.开启单向翻译.IsChecked():
for 单词 in self.全部单词:
水平布局管理器_all = wx.BoxSizer(wx.HORIZONTAL)
编辑框1_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框, value=单词, size=(175, 字号_all+18))
self.id_编辑框 += 1
编辑框1_all.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框1_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
#编辑框1_all.Bind(wx.EVT_KILL_FOCUS, self.所有中英文编辑框_失去焦点)
编辑框2_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框,value=self.全部单词[单词], size=(157, 字号_all+18))
self.id_编辑框 += 1
编辑框2_all.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
#编辑框2_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
#编辑框2_all.Bind(wx.EVT_KILL_FOCUS, self.所有中英文编辑框_失去焦点)
编辑框2_all.SetEditable(False)
编辑框1_all.SetFont(字体_all)
编辑框2_all.SetFont(字体_all)
水平布局管理器_all.Add(编辑框1_all)
水平布局管理器_all.Add(编辑框2_all)
self.垂直盒子布局_all.Add(水平布局管理器_all, 0, wx.ALL)
else:
for 单词 in self.全部单词:
水平布局管理器_all = wx.BoxSizer(wx.HORIZONTAL)
编辑框1_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框, value=单词, size=(330, 字号_all+18))
self.id_编辑框 += 2
编辑框1_all.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框1_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
#编辑框1_all.Bind(wx.EVT_KILL_FOCUS, self.所有中英文编辑框_失去焦点)
编辑框1_all.SetFont(字体_all)
水平布局管理器_all.Add(编辑框1_all)
self.垂直盒子布局_all.Add(水平布局管理器_all, 0, wx.ALL)
self.滚动面板3.SetSizer(self.垂直盒子布局_all)
# 第二个面板的组件
def 单标签(self):
# 当切换标签按钮时,需要重新从翻译过的self.全部单词里找到
def 单标签翻译(tag列表): # 先拿单个tag文件每个单词从self.全部单词里找
中英文结果 = {}
for 单词 in tag列表:
for 表单词 in self.全部单词:
if 单词 == 表单词: #
中英文结果[单词] =self.全部单词[表单词]
break
else: #
中英文结果[单词] =''
return 中英文结果
单tag = eval(self.tag[self.id]) # 拿第几个txt文件内容,默认打开id是1
字号 =int(self.配置文件['jiemianpeizhi']['onetagfontsize'])
字体 = wx.Font(字号, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
self.垂直盒子布局_单 = wx.BoxSizer(wx.VERTICAL)
if self.开启双向翻译.IsChecked(): # 中英文都可以翻译
翻译结果 = 单标签翻译(单tag)
for 单词 in 翻译结果:
水平布局管理器_单 = wx.BoxSizer(wx.HORIZONTAL)
编辑框1 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框, value=单词, size=(175, 字号+18))
self.id_编辑框 += 1
编辑框1.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框2 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框, value=翻译结果[单词], size=(157, 字号+18))
self.id_编辑框 += 1
编辑框2.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
编辑框1.SetFont(字体)
编辑框2.SetFont(字体)
水平布局管理器_单.Add(编辑框1)
水平布局管理器_单.Add(编辑框2)
self.垂直盒子布局_单.Add(水平布局管理器_单, 0, wx.ALL)
elif self.开启单向翻译.IsChecked(): # 只能编辑英文
翻译结果 = 单标签翻译(单tag)
for 单词 in 翻译结果:
水平布局管理器_单 = wx.BoxSizer(wx.HORIZONTAL)
编辑框1 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框, value=单词, size=(175, 字号+18))
self.id_编辑框 += 1
编辑框1.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框2 = wx.TextCtrl(self.滚动面板2,id=self.id_编辑框, value=翻译结果[单词] ,size=(157, 字号+18))
self.id_编辑框 += 1
编辑框2.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
编辑框2.SetEditable(False)
编辑框1.SetFont(字体)
编辑框2.SetFont(字体)
水平布局管理器_单.Add(编辑框1)
水平布局管理器_单.Add(编辑框2)
self.垂直盒子布局_单.Add(水平布局管理器_单, 0, wx.ALL)
else: # 没有翻译功能
for 单词 in 单tag:
水平布局管理器_单 = wx.BoxSizer(wx.HORIZONTAL)
编辑框1 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框, value=单词, size=(330, 字号+18))
self.id_编辑框 += 2
编辑框1.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框1.SetFont(字体)
水平布局管理器_单.Add(编辑框1)
self.垂直盒子布局_单.Add(水平布局管理器_单, 0, wx.ALL)
self.滚动面板2.SetSizer(self.垂直盒子布局_单)
def 所有中文编辑框_获得焦点(self,event):
event.Skip() # 恢复焦点光标
中文编辑框对象 = event.GetEventObject()
self.光标选中id[0] = False # 是否点击的英文标签
self.光标选中id[1] = 中文编辑框对象.GetId() # 标签id
self.光标选中id[2] = 中文编辑框对象.GetValue() # 标签值
def 所有英文编辑框_获得焦点(self,event):
event.Skip() # 恢复焦点光标
英文编辑框对象 = event.GetEventObject()
self.光标选中id[0] =True # 是否点击的英文标签
self.光标选中id[1] = 英文编辑框对象.GetId() # 标签id
self.光标选中id[2] = 英文编辑框对象.GetValue() # 标签值
def 所有中英文编辑框_失去焦点(self,event):
event.Skip() # 恢复焦点光标
失去焦点编辑框对象 = event.GetEventObject()
print(失去焦点编辑框对象.GetId(), '失去焦点')
def 面板3编辑框_内容被改变(self,event):
if self.区分手动修改编辑框 ==False:
内容改变编辑框对象值 = event.GetEventObject().GetValue()
if self.光标选中id[2] != '' and 内容改变编辑框对象值 != '删除成功': # 排除新增的编辑框
self.面板3修改的单词[self.光标选中id[2]] = 内容改变编辑框对象值
def 定时器事件(self,event):
print(self.光标选中id)
self.光标选中id[3].SetBackgroundColour('white')
# print('取消颜色完成')
self.定时器.Stop()
def 按钮被单击(self,event): # 操作按钮被点击
def 禁用按钮(禁用): # 面板2的保存和面板3的同步 使用
if 禁用 == True:
翻译按钮_禁开 = wx.FindWindowById(32710)
翻译按钮_禁开.Disable()
翻译按钮_禁开 = wx.FindWindowById(32711)
翻译按钮_禁开.Disable()
翻译按钮_禁开 = wx.FindWindowById(32712)
翻译按钮_禁开.Disable()
翻译按钮_禁开 = wx.FindWindowById(32713)
翻译按钮_禁开.Disable()
翻译按钮_禁开 = wx.FindWindowById(32715)
翻译按钮_禁开.Disable()
elif 禁用 == False:
翻译按钮_禁开 = wx.FindWindowById(32710)
翻译按钮_禁开.Enable()
翻译按钮_禁开 = wx.FindWindowById(32711)
翻译按钮_禁开.Enable()
翻译按钮_禁开 = wx.FindWindowById(32712)
翻译按钮_禁开.Enable()
翻译按钮_禁开 = wx.FindWindowById(32713)
翻译按钮_禁开.Enable()
翻译按钮_禁开 = wx.FindWindowById(32715)
翻译按钮_禁开.Enable()
def 获取光标所在(光标翻译,光标相邻,相邻翻译,是否面板3,是否新增): # 增加/增加2/上移/下移 使用
if 是否面板3 == True:
面板所有组件 = self.滚动面板3.GetChildren()
else:
面板所有组件 = self.滚动面板2.GetChildren()
组件_上移对象顺序列表 = []
光标所在对象 = None
for 组件_上移 in 面板所有组件: # 获取面板2上面所有组件对象
组件_上移对象顺序列表.append(组件_上移)
if 组件_上移.GetId() == self.光标选中id[1] :
光标所在对象 = 组件_上移
if 光标所在对象 != None: # 排除点击的编辑框和面板上所有组件没有比对上(例如点击了面板2的组件,然后点击面板3的增加)
光标所在对象下标 = 组件_上移对象顺序列表.index(光标所在对象)
if self.开启双向翻译.IsChecked() or self.开启单向翻译.IsChecked() : # 翻译场景
if 是否新增 == 0: # 被上移和下移调用
# 光标相邻=2判断下移操作,
if 光标相邻 == 2 and len(组件_上移对象顺序列表) - 2 <= 光标所在对象下标:
print('光标在最后一行,不下移')
else:
# 获取本行和上移一行组件对象和组件值
光标所在对象 = 组件_上移对象顺序列表[光标所在对象下标] # 0
光标所在对象值 = 光标所在对象.GetValue()
# print(光标所在对象值)
光标所在对象翻译对象 = 组件_上移对象顺序列表[光标所在对象下标 + 光标翻译] # 1
光标所在对象翻译对象值 = 光标所在对象翻译对象.GetValue()
光标上移一行对象 = 组件_上移对象顺序列表[光标所在对象下标 + 光标相邻] # -2
光标上移一行对象值 = 光标上移一行对象.GetValue()
光标上移一行对象翻译对象 = 组件_上移对象顺序列表[光标所在对象下标 + 相邻翻译] # -1
光标上移一行对象翻译对象值 = 光标上移一行对象翻译对象.GetValue()
# print(光标上移一行对象翻译对象值)
# 替换值
光标所在对象.SetValue(光标上移一行对象值)
光标所在对象翻译对象.SetValue(光标上移一行对象翻译对象值)
光标上移一行对象.SetValue(光标所在对象值)
光标上移一行对象翻译对象.SetValue(光标所在对象翻译对象值)
self.光标选中id[1] = 光标上移一行对象.GetId() # 把光标换成上移一行的编辑框
elif 是否新增 < 0: # 被新增和新增2调用
for 组件对象移动下标 in range(len(组件_上移对象顺序列表)+是否新增,光标所在对象下标+2,-2):
# if 组件对象移动下标 == 光标所在对象下标+2:
# break
# else:
最后一行对象 = 组件_上移对象顺序列表[组件对象移动下标]
光标所在对象值 = 最后一行对象.GetValue()
# print(光标所在对象值)
光标所在对象翻译对象 = 组件_上移对象顺序列表[组件对象移动下标 + 光标翻译] # -1
光标所在对象翻译对象值 = 光标所在对象翻译对象.GetValue()
# print(光标所在对象翻译对象值)
光标上移一行对象 = 组件_上移对象顺序列表[组件对象移动下标 + 光标相邻] # -2
光标上移一行对象值 = 光标上移一行对象.GetValue()
# print(光标上移一行对象值)
光标上移一行对象翻译对象 = 组件_上移对象顺序列表[组件对象移动下标 + 相邻翻译] # -3
光标上移一行对象翻译对象值 = 光标上移一行对象翻译对象.GetValue()
# print(光标上移一行对象翻译对象值)
# 替换值
self.区分手动修改编辑框 = True # 不记录到编辑框被修改
最后一行对象.SetValue(光标上移一行对象值)
光标所在对象翻译对象.SetValue(光标上移一行对象翻译对象值)
光标上移一行对象.SetValue(光标所在对象值)
光标上移一行对象翻译对象.SetValue(光标所在对象翻译对象值)
if 光标上移一行对象值 == '删除成功' :
光标上移一行对象.SetEditable(True)
光标上移一行对象.SetBackgroundColour('')
最后一行对象.SetEditable(False)
最后一行对象.SetBackgroundColour('#7d7d73')
elif 光标上移一行对象翻译对象值 == '删除成功':
光标上移一行对象翻译对象.SetEditable(True)
光标上移一行对象翻译对象.SetBackgroundColour('')
光标所在对象翻译对象.SetEditable(False)
光标所在对象翻译对象.SetBackgroundColour('#7d7d73')
self.区分手动修改编辑框 = False # 放开不记录
else: # 不翻译场景
if 是否新增 == 0: # 被上移和下移调用
# 光标相邻=2判断下移操作,
if 光标相邻 == 2 and len(组件_上移对象顺序列表) - 1 <= 光标所在对象下标:
print('光标在最后一行,不下移')
else:
# 获取本行和上移一行组件对象和组件值
光标所在对象 = 组件_上移对象顺序列表[光标所在对象下标] # 0
光标所在对象值 = 光标所在对象.GetValue()
if 光标相邻 == -2: #上移
光标上移一行对象 = 组件_上移对象顺序列表[光标所在对象下标 + 相邻翻译] # -1
else: # 下移
光标上移一行对象 = 组件_上移对象顺序列表[光标所在对象下标 + 光标翻译] # -1
光标上移一行对象值 = 光标上移一行对象.GetValue()
# 替换值
光标所在对象.SetValue(光标上移一行对象值)
光标上移一行对象.SetValue(光标所在对象值)
self.光标选中id[1] = 光标上移一行对象.GetId() # 把光标换成上移一行的编辑框
elif 是否新增 < 0: # 被新增和新增2调用
for 组件对象移动下标 in range(len(组件_上移对象顺序列表) + 是否新增, 光标所在对象下标, -1):
最后二行对象 = 组件_上移对象顺序列表[组件对象移动下标]
最后二行对象值 = 最后二行对象.GetValue()
最后1行对象 = 组件_上移对象顺序列表[组件对象移动下标 + 光标翻译] # 1
最后1行对象值 = 最后1行对象.GetValue()
# 替换值
self.区分手动修改编辑框 = True # 不记录到编辑框被修改
最后二行对象.SetValue(最后1行对象值)
最后1行对象.SetValue(最后二行对象值)
if 最后二行对象值 == '删除成功':
最后二行对象.SetEditable(True)
最后二行对象.SetBackgroundColour('')
最后1行对象.SetEditable(False)
最后1行对象.SetBackgroundColour('#7d7d73')
self.区分手动修改编辑框 = False # 放开不记录
def 删除移动编辑框(是否面板2,是否英文): # true/-2
if 是否面板2 == True:
面板所有组件 = self.滚动面板2.GetChildren()
else:
面板所有组件 = self.滚动面板3.GetChildren()
组件_上移对象顺序列表 = []
光标所在对象 = None
for 组件_上移 in 面板所有组件: # 获取面板2上面所有组件对象
组件_上移对象顺序列表.append(组件_上移)
if 组件_上移.GetId() == self.光标选中id[1] :
光标所在对象 = 组件_上移
if 光标所在对象 != None: # 排除点击的编辑框和面板上所有组件没有比对上(例如点击了面板2的组件,然后点击面板3的删除)
光标所在对象下标 = 组件_上移对象顺序列表.index(光标所在对象)
if self.开启双向翻译.IsChecked() or self.开启单向翻译.IsChecked() : # 翻译场景
for 组件对象移动下标 in range(光标所在对象下标,len(组件_上移对象顺序列表) + 是否英文, +2):
光标在行对象 = 组件_上移对象顺序列表[组件对象移动下标]
光标在行对象值 = 光标在行对象.GetValue()
# print(光标所在对象值)
光标在行翻译对象 = 组件_上移对象顺序列表[组件对象移动下标 + 1] # 1
光标在行翻译对象值 = 光标在行翻译对象.GetValue()
# print(光标所在对象翻译对象值)
光标下移一行对象 = 组件_上移对象顺序列表[组件对象移动下标 +2] # -2
光标下移一行对象值 = 光标下移一行对象.GetValue()
# print(光标上移一行对象值)
光标下移一行对象翻译对象 = 组件_上移对象顺序列表[组件对象移动下标 +3] # -1
光标下移一行对象翻译对象值 = 光标下移一行对象翻译对象.GetValue()
# print(光标上移一行对象翻译对象值)
# 替换值
self.区分手动修改编辑框 = True # 不记录到编辑框被修改
光标在行对象.SetValue(光标下移一行对象值)
光标在行翻译对象.SetValue(光标下移一行对象翻译对象值)
光标下移一行对象.SetValue(光标在行对象值)
光标下移一行对象翻译对象.SetValue(光标在行翻译对象值)
self.区分手动修改编辑框 = False # 放开不记录
光标下移一行对象.Destroy()
光标下移一行对象翻译对象.Destroy()
else: # 不翻译
for 组件对象移动下标 in range(len(组件_上移对象顺序列表) + 是否新增, 0, -1):
if 组件对象移动下标 == 光标所在对象下标:
break
else:
最后二行对象 = 组件_上移对象顺序列表[组件对象移动下标]
最后二行对象值 = 最后二行对象.GetValue()
最后1行对象 = 组件_上移对象顺序列表[组件对象移动下标 + 光标翻译] # 1
最后1行对象值 = 最后1行对象.GetValue()
# 替换值
self.区分手动修改编辑框 = True # 不记录到编辑框被修改
最后二行对象.SetValue(最后1行对象值)
最后1行对象.SetValue(最后二行对象值)
self.区分手动修改编辑框 = False # 放开不记录
操作按钮 = event.GetEventObject() # 获取点击事件
操作按钮id = 操作按钮.GetId() # 获取事件id
if 操作按钮id ==32700 or 操作按钮id == 32710: # 翻译和翻译2
if self.光标选中id[0]!=None: # 没有选过就不执行
编辑框对象_按钮用 = wx.FindWindowById(self.光标选中id[1]) # 通过id找到窗口中编辑框对象
if self.光标选中id[0] == False : # 判断中文标签
try: #
翻译中文结果 = self.翻译(True, 编辑框对象_按钮用.GetValue())
if 翻译中文结果 == None:
if self.光标选中id[2] != '': # 处理新增的编辑框,翻译失败后设置成空值
编辑框对象_按钮用.SetValue(self.光标选中id[2])
编辑框对象_按钮用.SetBackgroundColour('#e03648')
self.光标选中id[3] = 编辑框对象_按钮用 # 选中的编辑框对象,留给定时器恢复颜色用
self.定时器.Start(1000)
else:
编辑框对象_按钮用减1 = wx.FindWindowById(self.光标选中id[1] - 1)
编辑框对象_按钮用减1.SetValue(翻译中文结果)
编辑框对象_按钮用减1.SetBackgroundColour('#a0c69d')
self.光标选中id[3] = 编辑框对象_按钮用减1
self.定时器.Start(1000)
except Exception as 保错998:
提示框 = wx.MessageDialog(None, "翻译异常({})".format(保错998), "提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
elif self.光标选中id[0] == True : # 判断英文标签
try: #
翻译英文结果 = self.翻译(True, 编辑框对象_按钮用.GetValue())
print(翻译英文结果)
if 翻译英文结果 == None:
if self.光标选中id[2] != '':
编辑框对象_按钮用.SetValue(self.光标选中id[2])
编辑框对象_按钮用.SetBackgroundColour('#e03648')
self.光标选中id[3] = 编辑框对象_按钮用
self.定时器.Start(1000)
else:
编辑框对象_按钮用加1 = wx.FindWindowById(self.光标选中id[1] + 1)
编辑框对象_按钮用加1.SetValue(翻译英文结果)
编辑框对象_按钮用加1.SetBackgroundColour('#a0c69d')
self.光标选中id[3] = 编辑框对象_按钮用加1
self.定时器.Start(1000)
except Exception as 保错999:
提示框 = wx.MessageDialog(None, "翻译异常({})".format(保错999), "提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
elif 操作按钮id == 32701: # 增加
# 1.底部新增一个编辑框
字号_单增加 = int(self.配置文件['jiemianpeizhi']['onetagfontsize'])
字体_单增加 = wx.Font(字号_单增加, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
水平布局管理器_增加 = wx.BoxSizer(wx.HORIZONTAL)
if self.开启双向翻译.IsChecked(): # 中英文都可以翻译
编辑框_增加1 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框 ,value='', size=(175, 字号_单增加 + 18))
self.id_编辑框 += 1
编辑框_增加1.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框_增加2 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框, value='', size=(157, 字号_单增加 + 18))
self.id_编辑框 += 1
编辑框_增加2.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
编辑框_增加1.SetFont(字体_单增加)
编辑框_增加2.SetFont(字体_单增加)
水平布局管理器_增加.Add(编辑框_增加1)
水平布局管理器_增加.Add(编辑框_增加2)
elif self.开启单向翻译.IsChecked(): # 只能编辑英文
编辑框_增加1 = wx.TextCtrl(self.滚动面板2,id =self.id_编辑框, value='', size=(175, 字号_单增加 + 18))
self.id_编辑框 += 1
编辑框_增加1.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框_增加2 = wx.TextCtrl(self.滚动面板2,id = self.id_编辑框, value='', size=(157, 字号_单增加 + 18))
self.id_编辑框 += 1
编辑框_增加2.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
编辑框_增加2.SetEditable(False)
编辑框_增加1.SetFont(字体_单增加)
编辑框_增加2.SetFont(字体_单增加)
水平布局管理器_增加.Add(编辑框_增加1)
水平布局管理器_增加.Add(编辑框_增加2)
else:
编辑框_增加1 = wx.TextCtrl(self.滚动面板2,id = self.id_编辑框, value='', size=(330, 字号_单增加 + 18))
self.id_编辑框 += 2
编辑框_增加1.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框_增加1.SetFont(字体_单增加)
水平布局管理器_增加.Add(编辑框_增加1)
self.垂直盒子布局_单.Add(水平布局管理器_增加, 0, wx.ALL)
self.垂直盒子布局_单.Layout() # 更新盒子布局
# 2.光标所在编辑框以下所有编辑框依次向下移动一行
if self.光标选中id[0] != None: # 没有选择光标时不执行
if self.光标选中id[0] == True: # 点了英文编辑框,不翻译场景调英文
获取光标所在(1, -2, -1,False, -2)
else: # 点了中文编辑框
获取光标所在(-1, -2, -3,False, -1)
self.滚动面板2.SetupScrolling(scrollIntoView=True, scrollToTop=False)
elif 操作按钮id == 32702 or 操作按钮id == 32712: # 删除和删除2
if self.光标选中id[0] == True: # 只删点击英文标签时
编辑框对象_删除用 = wx.FindWindowById(self.光标选中id[1]) # 通过id找到窗口中编辑框对象
编辑框对象_删除用.SetBackgroundColour('#7d7d73')
编辑框对象_删除用.SetValue('删除成功')
编辑框对象_删除用.SetEditable(False)
elif 操作按钮id == 32703: # 重置
self.滚动面板2.Destroy()
self.面板(2)
elif 操作按钮id == 32704: # 上移
if self.光标选中id[1] != None: # 没有选择光标时不执行
if self.光标选中id[0] == True: # 点了英文编辑框
获取光标所在(1,-2,-1,False,0)
else: # 点了中文编辑框
获取光标所在(-1, -2, -3,False,0)
elif 操作按钮id == 32705: # 下移
if self.光标选中id[1] != None: # 没有选择光标时不执行
if self.光标选中id[0] == True: # 点了英文编辑框
获取光标所在(1,2,3,False,0)
else: # 点了中文编辑框
获取光标所在(-1, 2, 1,False,0)
elif 操作按钮id == 32707: # 打开txt文件
路径和后缀 = self.所有文件名[self.id].rpartition('\\')
路径和文件 = os.path.join(路径和后缀[0], 路径和后缀[2])
subprocess.Popen(['start', '', 路径和文件])
elif 操作按钮id == 32708: # 保存
禁用按钮(True) # 禁用面板3按钮
面板2所有单词 = ''
for 组件 in self.滚动面板2.GetChildren():
if 组件.GetId() % 2 == 0 and 组件.GetValue() != '' and 组件.GetValue() != '删除成功' :
面板2所有单词 += (组件.GetValue()+',')
删除最后逗号 = 面板2所有单词[:-1]
try:
with open(self.所有文件名[self.id],'w',encoding='utf8') as 单tag写文件: # 1.保存到txt
单tag写文件.write(删除最后逗号)
self.tag[self.id] =str(删除最后逗号.split(',')) # 2.同步到self.tag
#print(self.tag[self.id])
except Exception as 报错保存单tag:
提示框 = wx.MessageDialog(None, "保存失败({})".format(报错保存单tag), "提示", wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
elif 操作按钮id == 32711: # 增加2
字号_all增加 = int(self.配置文件['jiemianpeizhi']['onetagfontsize'])
字体_all增加 = wx.Font(字号_all增加, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
水平布局管理器_增加_all = wx.BoxSizer(wx.HORIZONTAL)
if self.开启双向翻译.IsChecked(): # 中英文都可以翻译
编辑框_增加1_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框, value='', size=(175, 字号_all增加 + 18))
self.id_编辑框 += 1
编辑框_增加1_all.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框_增加1_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
编辑框_增加2_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框, value='', size=(157, 字号_all增加 + 18))
self.id_编辑框 += 1
编辑框_增加2_all.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
编辑框_增加1_all.SetFont(字体_all增加)
编辑框_增加2_all.SetFont(字体_all增加)
水平布局管理器_增加_all.Add(编辑框_增加1_all)
水平布局管理器_增加_all.Add(编辑框_增加2_all)
elif self.开启单向翻译.IsChecked(): # 只能编辑英文
编辑框_增加1_all = wx.TextCtrl(self.滚动面板3,id=self.id_编辑框, value='', size=(175, 字号_all增加 + 18))
self.id_编辑框 += 1
编辑框_增加1_all.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框_增加1_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
编辑框_增加2_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框, value='', size=(157, 字号_all增加 + 18))
self.id_编辑框 += 1
编辑框_增加2_all.Bind(wx.EVT_SET_FOCUS, self.所有中文编辑框_获得焦点)
编辑框_增加2_all.SetEditable(False)
编辑框_增加1_all.SetFont(字体_all增加)
编辑框_增加2_all.SetFont(字体_all增加)
水平布局管理器_增加_all.Add(编辑框_增加1_all)
水平布局管理器_增加_all.Add(编辑框_增加2_all)
else:
编辑框_增加1_all = wx.TextCtrl(self.滚动面板3,id = self.id_编辑框, value='', size=(330, 字号_all增加 + 18))
self.id_编辑框 += 2
编辑框_增加1_all.Bind(wx.EVT_SET_FOCUS, self.所有英文编辑框_获得焦点)
编辑框_增加1_all.Bind(wx.EVT_TEXT, self.面板3编辑框_内容被改变)
编辑框_增加1_all.SetFont(字体_all增加)
水平布局管理器_增加_all.Add(编辑框_增加1_all)
self.垂直盒子布局_all.Add(水平布局管理器_增加_all, 0, wx.ALL)
self.垂直盒子布局_all.Layout()
self.滚动面板3.SetupScrolling(scrollIntoView=True, scrollToTop=False) # 大概率必超过窗口需要刷新面板滚动条(滚动条不会自动出现,不知道是不是bug)
if self.光标选中id[0] != None: # 没有选择光标时不执行
if self.光标选中id[1] % 2 == 0: # 点了英文编辑框
获取光标所在(1, -2, -1,True, -2)
else: # 点了中文编辑框
获取光标所在(-1, -2, -3,True, -1)
elif 操作按钮id == 32713: # 重置2
self.滚动面板3.Destroy()
self.面板(3)
elif 操作按钮id == 32714: # 同步2
禁用按钮(False) # 启动面板3按钮
self.加载 = SDtag设置界面.加载中(self)
self.全部单词.clear()
for 单行tag序号 in self.tag: # 把修改过的self.tag再次去重汇总到self.全部单词
tag列表 = eval(self.tag[单行tag序号])
for tag单词 in tag列表: # 列表里的单词循环拿出来
if tag单词 not in self.全部单词: # 过滤相同单词
self.全部单词[tag单词] = '' # 汇总所有单词,没有重复的,类型字典,value是空字符串
self.翻译(False, '') # 翻译单词,耗时长
self.滚动面板3.Destroy()
self.面板(3)
self.加载.Destroy()
elif 操作按钮id == 32715: # 保存2
# 1.面板3编辑框_内容被改变事件中已经获取到修改的单词
# 2.获取增加的单词
全部编辑单词 = []
新增单词 = []
for 面板3组件对象 in self.滚动面板3.GetChildren():
# 排除中文单词/删除的单词/空值
组件值 = 面板3组件对象.GetValue()
if 面板3组件对象.GetId() % 2 == 0 and 组件值 != '' and 组件值 != '删除成功':
全部编辑单词.append(组件值) # 获取所有单词
if 组件值 not in self.全部单词 and 组件值 not in self.面板3修改的单词.values(): # 排除已经有的和排除修改的单词
新增单词.append(组件值) # 获取新增单词
print(全部编辑单词)
# 3.拿self.tag每个单tag遍历所有单词和面板3所有单词比较之后进行增删改操作
for 单tag_序号 in self.tag: # 3.1获取self.tag里的每一条tag列表
单条tag = eval(self.tag[单tag_序号])
for 单词_处理改删增 in 单条tag: # 3.2单个tag列表获取所有单词
if 单词_处理改删增 in self.面板3修改的单词: # 3.3改:进行修改的单词替换操作
单条tag[单条tag.index(单词_处理改删增)] = self.面板3修改的单词[单词_处理改删增] # 根据列表下标替换
elif 单词_处理改删增 not in 全部编辑单词: # 3.4删:处理删除的单词
单条tag[单条tag.index(单词_处理改删增)] = '' # 根据列表下标删除
单条tag_结果 = ''
# 3.5处理新增单词
for 面板3单词 in 全部编辑单词: # 面板上去除删除的,然后一个个拿出来
for tag单词_保存 in 单条tag: # txt原始的tag,一个个拿出来
if 面板3单词 == tag单词_保存 or 面板3单词 in 新增单词: # 如果面板单词和tag单词一致就保存或虽然不一致但是在新增单词中也会保存
单条tag_结果+=(面板3单词+',')
break # 如果满足条件就结束内循环
try:
with open(self.所有文件名[单tag_序号], 'w', encoding='utf8') as 单tag写文件:
单tag写文件.write(单条tag_结果[:-1])
self.tag[单tag_序号] = str(单条tag_结果[:-1].split(',')) # 同步:把列表转换成json字符串加到self.tag字典中的值
except Exception as 报错保存单tag:
提示框 = wx.MessageDialog(None, "保存失败({})".format(报错保存单tag), "提示",
wx.YES_DEFAULT | wx.ICON_QUESTION)
if 提示框.ShowModal() == wx.ID_YES: # 如果点击了提示框的确定按钮
提示框.Destroy() # 则关闭提示
# 4.更新self.全部单词
self.加载 = SDtag设置界面.加载中(self)
self.全部单词.clear()
for 单行tag序号 in self.tag: # 把修改过的self.tag再次去重汇总到self.全部单词
tag列表 = eval(self.tag[单行tag序号])
for tag单词 in tag列表: # 列表里的单词循环拿出来
if tag单词 not in self.全部单词: # 过滤相同单词
self.全部单词[tag单词] = '' # 汇总所有单词,没有重复的,类型字典,value是空字符串
self.翻译(False, '') # 翻译单词,耗时长
self.滚动面板2.Destroy() # 销毁面板2
self.面板(2) # 生成面板2
self.加载.Destroy()
# 5.保存结束要清空修改数据的全局变量,为下一次保存清库存
self.面板3修改的单词.clear()
# 第一个面板的组件
def 图片和名称(self):
def 处理换行(名称):
计次 = 0
名称1 = ''
for i in range((len(名称)) // 18 + 1):
名称1 += 名称[计次:计次 + 18]+'\n'
计次 += 18
return 名称1
垂直盒子布局 = wx.BoxSizer(wx.VERTICAL)
for 序号 in self.所有文件名:
水平布局管理器 = wx.BoxSizer(wx.HORIZONTAL)
if 序号 % 2 == 0:
print(self.所有文件名[序号])
img1 = wx.Image(self.所有文件名[序号], wx.BITMAP_TYPE_ANY)
# 缩放图片
尺寸 =img1.GetSize()
if 尺寸[0] == 尺寸[1]:
# print(尺寸[0], 尺寸[1])
img2 = img1.Scale(200, 200) # 2 缩小图像
elif 尺寸[0] > 尺寸[1]:
缩小倍数 = 尺寸[0] // 200
img2 = img1.Scale(200, 尺寸[1] // 缩小倍数)
elif 尺寸[0] < 尺寸[1]:
缩小倍数 = 尺寸[1] // 200
img2 = img1.Scale(尺寸[0] // 缩小倍数, 200)
图片1 = wx.StaticBitmap(self.滚动面板1, bitmap=wx.Bitmap(img2), size=(200, 200))
水平布局管理器.Add(图片1)
文件名1 = 处理换行(self.所有文件名[序号+1])
按钮 = wx.Button(self.滚动面板1, id=序号+1, label=文件名1, size=(183, 200))
字体 = wx.Font(12, 74, 90, 400, False, 'Microsoft YaHei UI', 28)
按钮.SetFont(字体)
水平布局管理器.Add(按钮)
垂直盒子布局.Add(水平布局管理器, 0, wx.ALL)
self.滚动面板1.SetSizer(垂直盒子布局)
self.Bind(wx.EVT_BUTTON, self.标签按钮_单击,id=0,id2=len(self.所有文件名))
第一个tag按钮对象 = wx.FindWindowById(1) # 获取触发事件的组件所在的面板上所有相同类型的组件中指定id的组件对象(一般在事件函数中使用)
# print(type(button),button)
第一个tag按钮对象.SetBackgroundColour('#66919a')
def 标签按钮_单击(self,event):
# 标注颜色
点击标签 = event.GetEventObject() # 获取点击事件
self.id = 点击标签.GetId() # 获取事件id
self.滚动面板2.Destroy() # 销毁面板2
self.面板(2) # 生成面板
self.光标选中id[0] = None
# 当被点击时设置自己的颜色并且取消其他按钮的颜色
for 序号 in range(1,len(self.所有文件名),2):
if self.id ==序号:
点击标签.SetBackgroundColour('#66919a') # 设置背景颜色
else:
button = wx.FindWindowById(序号) # 获取触发事件的组件所在的面板上所有相同类型的组件中指定id的组件对象(一般在事件函数中使用)
#print(type(button),button)
button.SetBackgroundColour('')
# 翻译
def 翻译(self, 单个词,单词):
if 单个词 == True: # 单个编辑翻译
if self.开启双向翻译.IsChecked() or self.开启单向翻译.IsChecked():
if self.配置文件['fanyijiekou']['fanyiapi'] == 'bendi':
wb = openpyxl.load_workbook(self.程序运行路径+'\文件\SD-tagfile.xlsx')
ws = wb['Sheet1'] # 选择要比较的工作表
if self.光标选中id[0] == True: # 选中英文标签
for 行内容 in ws.iter_rows(values_only=True): # 遍历要比较的行和列,比较单元格的值
if 行内容[0] == 单词:
wb.close() # 关闭xlsx文件
print('英文已经关闭词库')
return 行内容[1]
elif self.光标选中id[0] == False: # 选中中文标签
for 行内容 in ws.iter_rows(values_only=True): # 遍历要比较的行和列,比较单元格的值
if 行内容[1] == 单词:
wb.close() # 关闭xlsx文件
print('中文已经关闭词库')
return 行内容[0]
else:
wb.close() # 关闭xlsx文件
print('没有匹配到,已经关闭词库')
elif self.配置文件['fanyijiekou']['fanyiapi'] == 'youdao':
APP_KEY = self.配置文件['youdao']['key'] # 您的应用ID
APP_SECRET = self.配置文件['youdao']['secret'] # 您的应用密钥
def 加密(signStr):
hash_algorithm = hashlib.sha256()
hash_algorithm.update(signStr.encode('utf-8'))
return hash_algorithm.hexdigest()
def 取前十后十(q): # 1girlblack28orealistic
if q is None:
return None
size = len(q)
return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]
def 请求翻译(data):
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
return requests.post('https://openapi.youdao.com/v2/api', data=data, headers=headers)
# 单词列表 = ["1girl", "black hair", "solo", 'realistic']
data = {}
if self.光标选中id[0] == True: # 选中英文标签
data['from'] = 'en' # 原语言
data['to'] = 'zh-CHS' # 翻译语言
elif self.光标选中id[0] == False: # 选中中文标签
data['from'] = 'zh-CHS' # 原语言
data['to'] = 'en' # 翻译语言
data['signType'] = 'v3'
curtime = str(int(time.time())) # 取当前时间
data['curtime'] = curtime
salt = str(uuid.uuid1())
signStr = APP_KEY + 取前十后十(''.join(单词)) + salt + curtime + APP_SECRET # 签名
sign = 加密(signStr) # 签名加密
data['appKey'] = APP_KEY # 应用ID
data['q'] = 单词 # 要翻译的内容
data['salt'] = salt
data['sign'] = sign
data['vocabId'] = "11"
response = 请求翻译(data)
返回_字符串 = str(response.content, 'utf-8') # 把有道返回的字节格式转换成字符串
返回_字典 = json.loads(返回_字符串) # 把json字符串转换成字典
返回_结果98 = 返回_字典['translateResults'][0]['translation']
print(返回_结果98)
return 返回_结果98
elif self.配置文件['fanyijiekou']['fanyiapi'] == 'baidu':
APP_ID = self.配置文件['baidu']['key'] # 您的应用ID
APP_KEY = self.配置文件['baidu']['secret'] # 您的应用密钥
if self.光标选中id[0] == True: # 选中英文标签
from_lang = 'en'
to_lang = 'zh'
elif self.光标选中id[0] == False: # 选中中文标签
from_lang = 'zh'
to_lang = 'en'
endpoint = 'http://api.fanyi.baidu.com'
path = '/api/trans/vip/translate'
url = endpoint + path
def make_md5(s, encoding='utf-8'):
return md5(s.encode(encoding)).hexdigest()
salt = random.randint(32768, 65536) # 随机数
# Build request
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
sign = make_md5(APP_ID + 单词 + str(salt) + APP_KEY) # 令牌
payload = {'appid': APP_ID, 'q': 单词, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()
结果99 = json.dumps(result, indent=4, ensure_ascii=False)
结果字典 = eval(结果99)
# print(结果字典)
# 原文 = 结果字典['trans_result'][0]['src']
译文 = 结果字典['trans_result'][0]['dst']
return 译文
else: # 没有开启翻译
print('没有开启翻译')
else: # 批量翻译
if self.开启双向翻译.IsChecked() or self.开启单向翻译.IsChecked():
if self.配置文件['fanyijiekou']['fanyiapi'] == 'bendi':
wb = openpyxl.load_workbook(self.程序运行路径+'\文件\SD-tagfile.xlsx')
ws = wb['Sheet1'] # 选择要比较的工作表
for 单词 in self.全部单词: # 拿每一个单词
for 行内容 in ws.iter_rows(values_only=True): # 遍历要比较的行和列,比较单元格的值
if 行内容[0] == 单词:
self.全部单词[单词] = 行内容[1]
break
else:
self.全部单词[单词]='本地词库无'
wb.close() # 关闭xlsx文件
elif self.配置文件['fanyijiekou']['fanyiapi'] == 'youdao':
APP_KEY = self.配置文件['youdao']['key'] # 您的应用ID
APP_SECRET = self.配置文件['youdao']['secret'] # 您的应用密钥
单词列表 =[]
for 单词1 in self.全部单词: # 拿每一个单词
单词列表.append(单词1)
# self.全部单词.clear()
def 加密(signStr):
hash_algorithm = hashlib.sha256()
hash_algorithm.update(signStr.encode('utf-8'))
return hash_algorithm.hexdigest()
def 取前十后十(q): # 1girlblack28orealistic
if q is None:
return None
size = len(q)
return q if size <= 20 else q[0:10] + str(size) + q[size - 10:size]
def 请求翻译(data):
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
return requests.post('https://openapi.youdao.com/v2/api', data=data, headers=headers)
# 单词列表 = ["1girl", "black hair", "solo", 'realistic']
data = {}
data['from'] = 'en' # 原语言
data['to'] = 'zh-CHS' # 翻译语言
data['signType'] = 'v3'
curtime = str(int(time.time())) # 取当前时间
data['curtime'] = curtime
salt = str(uuid.uuid1())
signStr = APP_KEY + 取前十后十(''.join(单词列表)) + salt + curtime + APP_SECRET # 签名
sign = 加密(signStr) # 签名加密
data['appKey'] = APP_KEY # 应用ID
data['q'] = 单词列表 # 要翻译的内容
data['salt'] = salt
data['sign'] = sign
data['vocabId'] = "11"
response = 请求翻译(data)
返回_字符串 = str(response.content, 'utf-8') # 把有道返回的字节格式转换成字符串
返回_字典 = json.loads(返回_字符串) # 把json字符串转换成字典
返回_列表 = 返回_字典['translateResults']
for i in 返回_列表:
self.全部单词[i['query']] = i['translation']
elif self.配置文件['fanyijiekou']['fanyiapi'] == 'ali':
pass
elif self.配置文件['fanyijiekou']['fanyiapi'] == 'baidu':
APP_ID = self.配置文件['baidu']['key'] # 您的应用ID
APP_KEY = self.配置文件['baidu']['secret'] # 您的应用密钥
单词库 = []
for 单词2 in self.全部单词: # 拿每一个单词
单词库.append(单词2)
# self.全部单词.clear()
from_lang = 'en'
to_lang = 'zh'
endpoint = 'http://api.fanyi.baidu.com'
path = '/api/trans/vip/translate'
url = endpoint + path
def make_md5(s, encoding='utf-8'):
return md5(s.encode(encoding)).hexdigest()
salt = random.randint(32768, 65536) # 随机数
# Build request
headers = {'Content-Type': 'application/x-www-form-urlencoded'}
for 单词 in 单词库:
sign = make_md5(APP_ID + 单词 + str(salt) + APP_KEY) # 令牌
payload = {'appid': APP_ID, 'q': 单词, 'from': from_lang, 'to': to_lang, 'salt': salt, 'sign': sign}
# Send request
r = requests.post(url, params=payload, headers=headers)
result = r.json()
# Show response
结果 = json.dumps(result, indent=4, ensure_ascii=False)
结果字典 = eval(结果)
# print(结果字典)
原文 = 结果字典['trans_result'][0]['src']
译文 = 结果字典['trans_result'][0]['dst']
self.全部单词[原文]= 译文
elif self.配置文件['fanyijiekou']['fanyiapi'] == 'tengxun':
pass
else:
pass
if __name__=="__main__":
app = wx.App()
my_frame=MyFrame()
my_frame.Show()
app.MainLoop()
子窗口代码
import wx
import wx.adv
import os
import configparser
class 界面设置窗口(wx.Frame):
def __init__(self,主窗口):
坐标 = 主窗口.GetPosition()
主窗口.Enable(False) # 禁用主窗口
wx.Frame.__init__(self, 主窗口, title='翻译接口设置', size=(600, 300),pos=(坐标[0]+320,坐标[1]+200),name='frame',style=wx.CAPTION)
self.启动窗口 = wx.Panel(self)
self.Show(True)
self.主窗口 = 主窗口
#self.程序运行路径 = os.getcwd() # 获取运行路径
# tag字体大小
self.单tag标签 = wx.StaticText(self.启动窗口, label="单个tag字体大小:", pos=(220, 44), size=(100, 30))
self.单tag数值步进 = wx.SpinCtrl(self.启动窗口, id=wx.ID_ANY, min=8, max=30, initial=int(self.主窗口.配置文件['jiemianpeizhi']['onetagfontsize']), pos=(340, 40))
self.全部tag标签 = wx.StaticText(self.启动窗口, label="全部tag字体大小:", pos=(220, 104), size=(100, 30))
self.全部tag数值步进 = wx.SpinCtrl(self.启动窗口, id=wx.ID_ADD, min=8, max=30, initial=int(self.主窗口.配置文件['jiemianpeizhi']['alltagfontsize']), pos=(340, 100))
self.确认_按钮 = wx.Button(self.启动窗口, pos=(200, 200), size=(75, 30), label='确认', name='button')
self.确认_按钮.Bind(wx.EVT_BUTTON, self.确认_按钮被单击)
self.取消_按钮 = wx.Button(self.启动窗口, pos=(300, 200), size=(75, 30), label='取消', name='button')
self.取消_按钮.Bind(wx.EVT_BUTTON, self.取消_按钮被单击)
self.是否修改 = False
def 取消_按钮被单击(self, event):
self.主窗口.Enable(True) # 恢复主窗口
self.Close()
def 确认_按钮被单击(self, event):
self.主窗口.Enable(True) # 恢复主窗口
# 写配置
配置对象 = configparser.ConfigParser()
配置对象.read(self.主窗口.程序运行路径 + '\文件\config.ini')
配置对象.set('jiemianpeizhi', 'onetagfontsize', str(self.单tag数值步进.GetValue()))
配置对象.set('jiemianpeizhi', 'alltagfontsize', str(self.全部tag数值步进.GetValue()))
with open(self.主窗口.程序运行路径 + '\文件\config.ini', 'w') as configfile:
配置对象.write(configfile)
# 写完配置要立即生效,读一下配置
if self.主窗口.所有文件名 != {}: # 判断首次打开文件时不会执行,打开过文件时切换翻译开关会关闭面重新打开面板
self.主窗口.滚动面板2.Destroy()
self.主窗口.滚动面板3.Destroy()
self.主窗口.读配置()
self.Close() # 关闭配置界面
加载 =加载中(self.主窗口)
self.主窗口.面板(4) # 只重新执行面板2和面板3
加载.Close()
else:
self.主窗口.读配置()
self.Close()
class 翻译窗口(wx.Frame):
def __init__(self,主窗口):
坐标 = 主窗口.GetPosition()
主窗口.Enable(False) # 禁用主窗口
wx.Frame.__init__(self, None, title='翻译接口设置', size=(600, 300),pos=(坐标[0]+320,坐标[1]+200),name='frame',style=wx.CAPTION)
self.启动窗口 = wx.Panel(self)
self.Show(True)
self.主窗口 = 主窗口
# self.程序运行路径 = os.getcwd() # 获取运行路径
self.是否修改 = [False, False, None, None]
# 单选框
self.本地_单选框 = wx.RadioButton(self.启动窗口, id=0, size=(64, 26), pos=(100,20), name='radioButton', label='本地翻译')
self.有道_单选框 = wx.RadioButton(self.启动窗口, id=1, size=(64, 26), pos=(180,20), name='radioButton', label='有道翻译')
self.阿里_单选框 = wx.RadioButton(self.启动窗口, id=2, size=(64, 26),pos=(340,20) , name='radioButton', label='阿里翻译')
self.阿里_单选框.Hide()
self.百度_单选框 = wx.RadioButton(self.启动窗口, id=3, size=(64, 26), pos=(260,20), name='radioButton', label='百度翻译')
self.腾讯_单选框 = wx.RadioButton(self.启动窗口, id=4, size=(64, 26), pos=(420,20), name='radioButton', label='腾讯翻译')
self.腾讯_单选框.Hide()
self.Bind(wx.EVT_RADIOBUTTON, self.单选框_状态被改变, id=0, id2=5)
# 教程链接
self.超级链接框 = wx.adv.HyperlinkCtrl(self.启动窗口,size=(350, 31),pos=(120, 60),name='hyperlink',label='',url='',style=1)
# 输入框
self.KEY标签= wx.StaticText(self.启动窗口, label="KEY:",pos=(128,125),size = (35, 30))
self.KEY标签.Hide()
self.APP_KEY编辑框 = wx.TextCtrl(self.启动窗口,id = 1, pos=(180, 120), size=(250, 30), value='', name='text', style=0)
self.APP_KEY编辑框.Hide()
self.SECRT标签= wx.StaticText(self.启动窗口, label="SECRET:",pos=(120,165),size = (50, 30))
self.SECRT标签.Hide()
self.APP_SECRET编辑框 = wx.TextCtrl(self.启动窗口,id =2,pos=(180,160), size=(250, 30), value='', name='text', style=0)
self.APP_SECRET编辑框.Hide()
# 显示配置文件中默认值
if self.主窗口.配置文件['fanyijiekou']['fanyiapi'] == 'bendi':
self.本地_单选框.SetValue(True)
elif self.主窗口.配置文件['fanyijiekou']['fanyiapi'] == 'youdao':
self.有道_单选框.SetValue(True)
self.显示框和读配置('youdao')
elif self.主窗口.配置文件['fanyijiekou']['fanyiapi'] == 'ali':
self.阿里_单选框.SetValue(True)
self.显示框和读配置('ali')
elif self.主窗口.配置文件['fanyijiekou']['fanyiapi'] == 'baidu':
self.百度_单选框.SetValue(True)
self.显示框和读配置('baidu')
self.KEY标签.SetLabel('APP_ID:')
self.SECRT标签.SetLabel('APP_KEY:')
elif self.主窗口.配置文件['fanyijiekou']['fanyiapi'] == 'tengxun':
self.腾讯_单选框.SetValue(True)
self.显示框和读配置('tengxun')
# 确认按钮
self.确认_按钮 = wx.Button(self.启动窗口,pos=(200,210), size=(75, 30), label='确认', name='button')
self.确认_按钮.Bind(wx.EVT_BUTTON, self.确认_按钮被单击)
self.取消_按钮 = wx.Button(self.启动窗口, pos=(300, 210), size=(75, 30), label='取消', name='button')
self.取消_按钮.Bind(wx.EVT_BUTTON, self.取消_按钮被单击)
def 显示框和读配置(self,翻译家):
self.APP_KEY编辑框.Show()
self.APP_SECRET编辑框.Show()
self.KEY标签.Show()
self.SECRT标签.Show()
self.是否修改[2] = self.主窗口.配置文件[翻译家]['key']
self.是否修改[3] = self.主窗口.配置文件[翻译家]['secret']
self.APP_KEY编辑框.SetValue(self.是否修改[2])
self.APP_SECRET编辑框.SetValue(self.是否修改[3] )
if 翻译家 =='youdao':
self.超级链接框.SetLabel('申请'+翻译家+'API教程链接'+'(50元体验金,用完及收费)')
elif 翻译家 == 'baidu':
self.超级链接框.SetLabel('申请'+翻译家+'API教程链接'+'(每月100万字符免费额度)')
链接 = {'youdao': 'https://blog.csdn.net/weixin_44253490/article/details/126365385?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168942959116800215021969%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168942959116800215021969&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-7-126365385-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91api&spm=1018.2226.3001.4187#_50',
'ali':'https://blog.csdn.net/weixin_44253490/article/details/126365385?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168942959116800215021969%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168942959116800215021969&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-7-126365385-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91api&spm=1018.2226.3001.4187#_34',
'baidu':'https://blog.csdn.net/weixin_44253490/article/details/126365385?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168942959116800215021969%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168942959116800215021969&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-7-126365385-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91api&spm=1018.2226.3001.4187#_7',
'tengxun':'https://blog.csdn.net/weixin_44253490/article/details/126365385?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168942959116800215021969%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=168942959116800215021969&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~baidu_landing_v2~default-7-126365385-null-null.142^v88^control_2,239^v2^insert_chatgpt&utm_term=%E6%9C%89%E9%81%93%E7%BF%BB%E8%AF%91api&spm=1018.2226.3001.4187#_20'}
self.超级链接框.SetURL(链接[翻译家])
def 单选框_状态被改变(self,event):
id = event.GetId()
self.是否修改[0] =True
if id == 0: # 本地
self.APP_KEY编辑框.Hide()
self.APP_SECRET编辑框.Hide()
self.KEY标签.Hide()
self.SECRT标签.Hide()
self.超级链接框.SetLabel('')
self.超级链接框.SetURL('')
elif id == 1: # 有道
self.显示框和读配置('youdao')
self.KEY标签.SetLabel('KEY:')
self.SECRT标签.SetLabel('SECRET:')
elif id == 2: # 阿里
self.显示框和读配置('ali')
# 输入框')
elif id == 3: # 百度
self.显示框和读配置('baidu')
self.KEY标签.SetLabel('APP_ID:')
self.SECRT标签.SetLabel('APP_KEY:')
elif id == 4: # 腾讯
self.显示框和读配置('tengxun')
def 确认_按钮被单击(self,event):
self.主窗口.Enable(True) #恢复主窗口
print(self.是否修改)
配置对象 = configparser.ConfigParser()
配置对象.read(self.主窗口.程序运行路径 + '\文件\config.ini')
if self.本地_单选框.GetValue():
配置对象.set('fanyijiekou', 'fanyiapi', 'bendi')
elif self.有道_单选框.GetValue():
配置对象.set('fanyijiekou', 'fanyiapi', 'youdao')
配置对象.set('youdao', 'key', self.APP_KEY编辑框.Value)
配置对象.set('youdao', 'secret', self.APP_SECRET编辑框.Value)
elif self.阿里_单选框.GetValue():
配置对象.set('fanyijiekou', 'fanyiapi', 'ali')
配置对象.set('ali', 'key', self.APP_KEY编辑框.Value)
配置对象.set('ali', 'secret', self.APP_SECRET编辑框.Value)
elif self.百度_单选框.GetValue():
配置对象.set('fanyijiekou', 'fanyiapi', 'baidu')
配置对象.set('baidu', 'key', self.APP_KEY编辑框.Value)
配置对象.set('baidu', 'secret', self.APP_SECRET编辑框.Value)
elif self.腾讯_单选框.GetValue():
配置对象.set('fanyijiekou', 'fanyiapi', 'tengxun')
配置对象.set('tengxun', 'key', self.APP_KEY编辑框.Value)
配置对象.set('tengxun', 'secret', self.APP_SECRET编辑框.Value)
with open(self.主窗口.程序运行路径 + '\文件\config.ini', 'w') as configfile:
配置对象.write(configfile)
if self.主窗口.所有文件名 != {}: # 判断首次打开文件时不会执行,打开过文件时切换翻译开关会关闭面重新打开面板
self.主窗口.滚动面板2.Destroy()
self.主窗口.滚动面板3.Destroy()
self.主窗口.读配置()
self.Close() # 关闭当前窗口
加载 = 加载中(self.主窗口)
self.主窗口.面板(44) # 只重新执行面板2和面板3
加载.Close()
else:
self.主窗口.读配置()
self.Close()
def 取消_按钮被单击(self,event):
self.主窗口.Enable(True) # 恢复主窗口
self.Close()
class 加载中(wx.Frame):
def __init__(self,主窗口):
坐标 = 主窗口.GetPosition()
#主窗口.Enable(False) # 禁用主窗口
wx.Frame.__init__(self, 主窗口,size=(455,240),pos=(坐标[0]+380,坐标[1]+250),style=wx.FRAME_FLOAT_ON_PARENT)
self.Show(True)
self.图片框 = wx.StaticBitmap(self, bitmap=wx.Bitmap(主窗口.程序运行路径 + '\图片\加载.jpg'), pos=(0, 0))
# animationCtrl = wx.adv.AnimationCtrl(self)# 创建AnimationCtrl实例
# animationCtrl.LoadFile(主窗口.程序运行路径 + '\图片\加载动态.gif')# 加载gif格式图片
# animationCtrl.Play()# 播放gif动画
class 版本(wx.Frame):
def __init__(self,主窗口):
坐标 = 主窗口.GetPosition()
主窗口.Enable(False) # 禁用主窗口
wx.Frame.__init__(self, None,size=(455,240),pos=(坐标[0]+380,坐标[1]+250),title='说明',style=wx.CAPTION)
self.启动窗口 = wx.Panel(self)
self.主窗口 = 主窗口
教程标签 = wx.StaticText(self.启动窗口, label="支持三种翻译:\n本地翻译优点是词库采用绘图场景,翻译比较准确;\n缺点本地词库检索耗时久;\n有道翻译和百度翻译优点是翻译快;缺点是翻译通用化,和绘图场景不太符合", size=(400, 100), pos=(20, 20))
版本标签 = wx.StaticText(self.启动窗口, label="版本:2023-08-20", size=(100, 20), pos=(170, 130))
# style:2321为文本居中;
关闭按钮 = wx.Button(self.启动窗口, pos=(180, 160), label='确认') # 设置按钮
关闭按钮.Bind(wx.EVT_BUTTON, self.按钮_按下) # 绑定按钮事件
self.Show(True)
def 按钮_按下(self, event): # 按钮事件
self.主窗口.Enable(True)
self.Close()