Windows上的文本处理工具 v1.0

3次阅读
没有评论

自制文本处理工具,有时候会用到这些小功能,需要经常进网页进行转换,感到太麻烦了,索性就集成到软件里。

可以自由导入和导出,有搜索和替换功能、有浅色和深色模式。
包含 MD5加密、大小写转换、繁体简体转换、文字转拼音、数字转大写等功能

下载
https://pan.baidu.com/s/1iLolIIhwO5oY_nfIkIs6Zw?pwd=5kiu

https://pan.quark.cn/s/514345951b79

https://pan.xunlei.com/s/VONo_ZS24HQ7rp9zjDDRGwOxA1?pwd=s8ph#

from tkinter import *
from ttkbootstrap import Style
import hashlib
import opencc
import pypinyin
class TextProcessor:
def __init__(self):
self.style = Style(theme='cosmo')
self.window = self.style.master
self.window.title('文本处理工具')
self.window.geometry('800x600')
self.create_widgets()
self.setup_drag_drop()
def create_widgets(self):
# 创建顶部菜单栏
self.menubar = Menu(self.window)
self.window.config(menu=self.menubar)
# 文件菜单
self.file_menu = Menu(self.menubar, tearoff=0)
self.menubar.add_cascade(label='文件', menu=self.file_menu)
self.file_menu.add_command(label='导入文件', command=self.import_file)
self.file_menu.add_command(label='导出文件', command=self.export_file)
# 编辑菜单
self.edit_menu = Menu(self.menubar, tearoff=0)
self.menubar.add_cascade(label='编辑', menu=self.edit_menu)
self.edit_menu.add_command(label='文本搜索', command=self.text_search)
self.edit_menu.add_command(label='文本替换', command=self.text_replace)
# 主题菜单
self.theme_menu = Menu(self.menubar, tearoff=0)
self.menubar.add_cascade(label='主题', menu=self.theme_menu)
self.theme_menu.add_command(label='深色模式', command=lambda: self.change_theme('darkly'))
self.theme_menu.add_command(label='浅色模式', command=lambda: self.change_theme('cosmo'))
# 关于菜单
self.about_menu = Menu(self.menubar, tearoff=0)
self.menubar.add_cascade(label='关于', menu=self.about_menu)
self.about_menu.add_command(label='关于软件', command=self.show_about)
# 左侧功能区
self.left_frame = Frame(self.window, width=200, bg='#f0f0f0', padx=10, pady=10, relief=GROOVE, bd=2)
self.left_frame.pack(side=LEFT, fill=Y)
# 中央主区域
self.main_frame = Frame(self.window, padx=10, pady=10)
self.main_frame.pack(side=LEFT, fill=BOTH, expand=True)
# 输入文本框
self.input_text = Text(self.main_frame, wrap='word')
self.input_text.pack(fill='both', expand=True)
# 输出文本框
self.output_text = Text(self.main_frame, wrap='word')
self.output_text.pack(fill='both', expand=True)
# 添加功能按钮到左侧
self.add_buttons()
def add_buttons(self):
# 添加功能按钮到左侧功能区
self.buttons = {}
button_names = ['MD5加密', '大写转换', '小写转换', '首字母大写', '简体转繁体', '繁体转简体', '汉字转拼音', '格式清理', '文本统计', '数字转中文', '中文转大写']
button_commands = [self.md5_hash, self.to_upper, self.to_lower, self.to_title, self.to_traditional,
self.to_simplified, self.to_pinyin, self.clean_format, self.text_statistics,
self.number_to_chinese, self.chinese_to_uppercase]
for name, cmd in zip(button_names, button_commands):
btn = Button(self.left_frame, text=name, command=cmd,
activebackground='#555555',
relief='groove',
bd=2,
font=('Microsoft YaHei', 10))
btn.pack(pady=5)
self.buttons[name] = btn
# 绑定点击事件
btn.bind('<Button-1>', lambda e, b=btn: self.highlight_button(b))
def to_upper(self):
input_text = self.get_input_text()
self.show_output_text(input_text.upper())
def to_lower(self):
input_text = self.get_input_text()
self.show_output_text(input_text.lower())
def to_title(self):
input_text = self.get_input_text()
self.show_output_text(input_text.title())
def to_traditional(self):
converter = opencc.OpenCC('s2t.json')
input_text = self.get_input_text()
traditional_text = converter.convert(input_text)
self.show_output_text(traditional_text)
def to_simplified(self):
converter = opencc.OpenCC('t2s.json')
input_text = self.get_input_text()
simplified_text = converter.convert(input_text)
self.show_output_text(simplified_text)
def to_pinyin(self):
input_text = self.get_input_text()
pinyin_text = ' '.join(pypinyin.lazy_pinyin(input_text))
self.show_output_text(pinyin_text)
def highlight_match(self):
self.input_text.tag_remove('highlight', '1.0', 'end')
pos = self.matches[self.current_match]
self.input_text.tag_add('highlight', f'1.0+{pos}c', f'1.0+{pos + len(self.pattern_entry.get())}c')
self.input_text.tag_config('highlight', background='yellow')
self.input_text.see(f'1.0+{pos}c')
def highlight_button(self, button):
# 重置所有按钮样式
for btn in self.buttons.values():
btn.config(relief='groove')
# 高亮当前选中的按钮
button.config(relief='sunken')
def text_search(self):
from tkinter import simpledialog
import re
dialog = Toplevel(self.window)
dialog.title('文本搜索')
dialog.geometry('400x250')
Label(dialog, text='搜索模式:').pack()
self.pattern_entry = Entry(dialog)
self.pattern_entry.pack()
self.current_match = 0
self.matches = []
def do_search():
input_text = self.get_input_text()
pattern = self.pattern_entry.get()
if pattern:
self.matches = [m.start() for m in re.finditer(pattern, input_text)]
self.current_match = 0
if self.matches:
self.highlight_match()
def next_match():
if self.matches:
self.current_match = (self.current_match + 1) % len(self.matches)
self.highlight_match()
Button(dialog, text='搜索', command=do_search).pack()
Button(dialog, text='下一个', command=next_match).pack()
def text_replace(self):
from tkinter import simpledialog
import re
dialog = Toplevel(self.window)
dialog.title('文本替换')
dialog.geometry('400x300')
Label(dialog, text='搜索模式:').pack()
pattern_entry = Entry(dialog)
pattern_entry.pack()
Label(dialog, text='替换内容:').pack()
replace_entry = Entry(dialog)
replace_entry.pack()
def do_replace():
input_text = self.get_input_text()
pattern = pattern_entry.get()
replacement = replace_entry.get()
if pattern and replacement:
result = re.sub(pattern, replacement, input_text)
self.show_output_text(result)
dialog.destroy()
Button(dialog, text='替换', command=do_replace).pack()
def change_theme(self, theme_name):
self.style = Style(theme=theme_name)
self.window = self.style.master
self.window.title('文本处理工具')
self.window.geometry('800x600')
def show_about(self):
about_text = "文本处理软件\n版本: 1.0\n作者: Ken\n功能: 提供多种文本处理功能"
from tkinter import messagebox
messagebox.showinfo("关于", about_text)
def clean_format(self):
input_text = self.get_input_text()
cleaned_text = '\n'.join([line.strip() for line in input_text.splitlines() if line.strip()])
self.show_output_text(cleaned_text)
def text_statistics(self):
input_text = self.get_input_text()
char_count = len(input_text)
word_count = len(input_text.split())
line_count = len(input_text.splitlines())
stats = f'字符数: {char_count}\n单词数: {word_count}\n行数: {line_count}'
self.show_output_text(stats)
def md5_hash(self):
input_text = self.get_input_text()
hash_object = hashlib.md5(input_text.encode())
self.show_output_text(hash_object.hexdigest())
def get_input_text(self):
return self.input_text.get('1.0', 'end-1c')
def show_output_text(self, text):
self.output_text.delete('1.0', 'end')
self.output_text.insert('1.0', text)
def export_file(self):
from tkinter import filedialog
file_path = filedialog.asksaveasfilename(
defaultextension='.txt',
filetypes=[('Text files', '*.txt')]
)
if file_path:
try:
with open(file_path, 'w', encoding='utf-8') as file:
content = self.output_text.get('1.0', 'end-1c')
file.write(content)
except Exception as e:
from tkinter import messagebox
messagebox.showerror("错误", f"导出失败: {str(e)}")
def import_file(self):
from tkinter import filedialog
file_path = filedialog.askopenfilename(filetypes=[('Text files', '*.txt')])
if file_path:
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
self.input_text.delete('1.0', 'end')
self.input_text.insert('1.0', content)
def setup_drag_drop(self):
def handle_drop(event):
file_path = event.data.strip('{}')
if file_path.lower().endswith('.txt'):
with open(file_path, 'r', encoding='utf-8') as file:
content = file.read()
self.input_text.delete('1.0', 'end')
self.input_text.insert('1.0', content)
else:
from tkinter import messagebox
messagebox.showerror("错误", "只支持导入TXT文件!")
# 使用tkinterdnd2的替代方法注册拖放目标
def number_to_chinese(self):
num_map = {'0':'零', '1':'一', '2':'二', '3':'三', '4':'四',
'5':'五', '6':'六', '7':'七', '8':'八', '9':'九'}
input_text = self.get_input_text()
if not input_text.isdigit():
from tkinter import messagebox
messagebox.showerror("错误", "输入必须为数字!")
return
result = ''.join([num_map[c] for c in input_text])
self.show_output_text(result)
def chinese_to_uppercase(self):
digit_map = {'0':'零', '1':'壹', '2':'贰', '3':'叁', '4':'肆',
'5':'伍', '6':'陆', '7':'柒', '8':'捌', '9':'玖'}
lower_map = {'零':'零', '一':'壹', '二':'贰', '三':'叁', '四':'肆',
'五':'伍', '六':'陆', '七':'柒', '八':'捌', '九':'玖'}
upper_map = {'零':'零', '壹':'壹', '贰':'贰', '叁':'叁', '肆':'肆',
'伍':'伍', '陆':'陆', '柒':'柒', '捌':'捌', '玖':'玖'}
input_text = self.get_input_text()
valid_chars = set('零一二三四五六七八九壹贰叁肆伍陆柒捌玖0123456789')
if not all(c in valid_chars for c in input_text):
from tkinter import messagebox
messagebox.showerror("错误", "输入必须为中文数字或阿拉伯数字!")
return
# 先转换阿拉伯数字为中文数字
converted_text = ''.join([digit_map.get(c, c) for c in input_text])
# 再转换中文数字为大写
result = ''.join([upper_map.get(c, lower_map.get(c, c)) for c in converted_text])
self.show_output_text(result)
def run(self):
self.window.mainloop()
if __name__ == '__main__':
app = TextProcessor()
app.run()

正文完
 0
116博客
版权声明:本篇文章由 116博客 于2025-04-15发表,共计8195字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)
验证码