Stable Diffusion | 用wxpython写了一个tag编辑器

最近玩stable diffusion画图,但是炼丹编辑tag时发现没有趁手的批量编辑器;所以就自己写了一个。有兴趣的可以自己优化哈!

  • 支持本地翻译、百度API和有道API翻译。
  • 增删改tag单词
  • 顺序调整
  • 批量编辑

百度网盘链接icon-default.png?t=N6B9https://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()



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值