文章目录
作为一名标准九零后,怎么能不知道火星文呢?本次使用Tkinter制作一款多功能火星文转化小工具,除了支持火星文的转化,还支持简体转繁体、转英文,另外还有火星文及其他签名推荐,你一定要看!
一.准备工作
不用准备。
二.预览
1.文本转化
支持非主流签名、繁体、英文转化。
2.签名推荐
首次打开自动推荐“非主流”类签名。
3.签名类型选择
超过30种签名类型供你选择。
4.复制个性签名
将选中的个性签名复制到剪切板。
三.设计流程
1.文本转化流程
2.签名推荐流程
四.源代码
源代码包括GUI部分(HXW_GUI.py)和spider部分(get_scentence.py)。
1.HXW_GUI.py
from tkinter import *
from tkinter import ttk
from tkinter import messagebox
from get_scentence import Mars_Spder
from threading import Thread
import time
from PIL import Image,ImageTk
import random
import re
import pyperclip
'''
5-23
1.等待10秒存在线程问题*已解决*
5.29
1.右击Treeview复制签名 *已实现*
2.代码复用率低
3.加入子菜单P212 add_radiobutton *已实现*
主界面创建完毕,加载个性签名类型。 *已实现*
获取check_button选中的内容 *使用radionbutton的variable参数获取value索引*
加入横向滚动条,便于长文本展示 *加入后无法使用*
'''
imgs=['./Refresh.png']
class App:
def __init__(self):
self.w=Tk()
self.w.title('多功能火星文转化器-V1.0')
width=499
height=345
left=(self.w.winfo_screenwidth()-width)/2
top=(self.w.winfo_screenheight()-height)/2
self.w.geometry('%dx%d+%d+%d'%(width,height,left,top))
self.w.resizable(0,0)
self.create_widget()
self.set_widget()
self.place_widget()
self.w.mainloop()
def create_widget(self):
self.note=ttk.Notebook(self.w)
self.f1=Frame(self.note)
self.f2=Frame(self.note)
self.f2.columnconfigure(0, weight=1)
self.note.add(self.f1,text='文本转化')
self.note.add(self.f2,text='签名推荐')
self.f1l1=ttk.Label(self.f1,text='请输入文本:')
self.f1t1=Text(self.f1)
#使用radiobutton定义三种转化模式
self.radio_var=IntVar()
self.f1r1=ttk.Radiobutton(self.f1)
self.f1r2=ttk.Radiobutton(self.f1)
self.f1r3=ttk.Radiobutton(self.f1)
self.radio_var.set(0)#默认radiobutton不选中
self.f1t2=Text(self.f1)
self.f1l2_var=StringVar()
self.f1l2=ttk.Label(self.f1,anchor=CENTER,textvariable=self.f1l2_var,background='lightblue')
self.f1l2_var.set('欢迎使用')
#----------
self.f2tree=ttk.Treeview(self.f2)
self.f2scroll_v=Scrollbar(self.f2,orient=VERTICAL)
paned = PanedWindow(self.w)
self.img = imgs
img = Image.open(self.img[0])
photo = img.resize((50, 25))
paned.image = ImageTk.PhotoImage(photo)
self.f2b1 = ttk.Button(self.f2, image=paned.image)
self.f2l1=ttk.Label(self.f2,text='换一换')
self.styles=Mars_Spder().get_sig_styles()
self.m=Menu(self.w)
self.w['menu']=self.m
self.s1 = Menu(self.m, tearoff=False)
self.m.add_cascade(label='开始', menu=self.s1)
self.s2=Menu(self.m,tearoff=False)
self.m.add_cascade(label='操作',menu=self.s2)
self.cate_menu=Menu(self.m,tearoff=False)
self.s1.add_command(label='退出',command=lambda :self.w.destroy())
self.all_styles={
}
self.menu_var = IntVar()
if self.styles:
for index,style in enumerate(self.styles):
self.cate_menu.add_radiobutton(label=style['style'],variable=self.menu_var,command=self.cate_selected,value=index)
self.all_styles[style['style']] = self.menu_var
self.s2.add_cascade(label='更换签名风格',menu=self.cate_menu)
#设置默认选中“非主流”类型签名
self.menu_var.set(19)
self.sig_base_link=self.styles[19]['link']
else:
messagebox.showerror('警告','获取签名分类失败!')
self.s3=Menu(self.m,tearoff=False)
self.m.add_cascade(label='关于',menu=self.s3)
self.s3.add_command(label='关于软件',command=lambda :messagebox.showinfo('关于作者','作者什么都没留下!'))
self.copy_menu=Menu(self.f2tree,tearoff=False)
self.copy_menu.add_command(label='复制',command=self.do_copy)
def set_widget(self):
# ft = tkFont.Font(weight=tkFont.BOLD)
self.f1r1.config(value=1,variable=self.radio_var,text='转为火星文',command=lambda :self.thread_it(self.process_operate))
self.f1r2.config(value=2,variable=self.radio_var,text='转为繁体',command=lambda :self.thread_it(self.process_operate))
self.f1r3.config(value=3,variable=self.radio_var,text='转为英文',command=lambda :self.thread_it(self.process_operate))
#self.f1t2.config(font=5)#weight=tkFont.BOLD
#----
columns=('no','content')
self.f2tree.config(show='headings',columns=columns,selectmode=BROWSE,displaycolumns ='#all')
self.f2tree.column('no',anchor='center',minwidth=30,width=60,)
self.f2tree.column('content',anchor='center',minwidth=350,width=400)
self.f2tree.heading('no',text='编号')
self.f2tree.heading('content',text='个性签名')
self.f2scroll_v.config(command=self.f2tree.yview)
self.f2tree['yscrollcommand']=self.f2scroll_v.set
self.f2b1.config(command=lambda :self.thread_it(self.show_sigs))
self.note.bind("<<NotebookTabChanged>>",self.notebook_switch)
self.f2tree.bind('<Button-3>',self.show_copy)
self.w.protocol('WM_DELETE_WINDOW',self.escape)
self.w.bind('<Escape>',self.quit)
def place_widget(self):
self.note.place(x=0,y=0,width=500,height=350)
self.f1l1.place(x=10,y=10)
self.f1t1.place(x=10,y=40,width=450,height=100)
self.f1r1.place(x=10,y=150,)
self.f1r2.place(x=200,y=150)
self.f1r3.place(x=390,y=150,)
self.f1t2.place(x=10,y=180,width=450,height=100)
self.f1l2.place(x=0,y=290,width=500,height=25)
self.f2tree.place(x=0,y=0,height=260,width=500)
self.f2scroll_v.place(x=482,y=0,height=255)
self.f2b1.place(x=210,y=263,width=60,height=35)
self.f2l1.place(x=218,y=299)
def cate_selected(self):
index=self.menu_var.get()
self.sig_base_link=self.styles[index].get('link')
self.thread_it(self.show_sigs)
def notebook_switch(self,event):
current_window=self.note.select().split('frame')[-1]
if current_window=='2':
self.thread_it(self.show_sigs)
else:
pass
def process_operate(self):
#Text在没有输入内容时,内容为\n
text=self.f1t1.get(0.0,END)
if text=='\n':
messagebox.showwarning('警告','请输入内容!')
self.f1l2_var.set('请输入内容!')
self.f1l2.config(background='red')
elif re.match('[\u4e00-\u9fa5]+',text):
self.f1t2.delete(0.0,END)
if self.radio_var.get()==1:
mars = Mars_Spder().mars(text)
if mars:
self.f1t2.insert(END, mars)
self.f1l2_var.set('转化完成!')
self.f1l2.config(background='lightblue')
self.f1r1.config(state=DISABLED)
self.thread_it(self.gap)
else:
messagebox.showerror('错误', '发生了不可预期的错误!')
self.f1l2_var.set('发生了不可预期的错误!')
self.f1l2.config(background='red')
elif self.radio_var.get()==2:
traditional = Mars_Spder().traditional(text)
if traditional:
self.f1t2.insert(END, traditional)
self.f1l2_var.set('转化完成!')
self.f1l2.config(background='lightblue')
self.f1r2.config(state=DISABLED)
self.thread_it(self.gap)
else:
messagebox.showerror('错误', '发生了不可预期的错误!')
self.f1l2_var.set('发生了不可预期的错误!')
self.f1l2.config(background='red')
elif self.radio_var.get()==3:
english = Mars_Spder().translate(text)
if english:
self.f1t2.insert(END, english)
self.f1l2_var.set('转化完成!')
self.f1l2.config(background='lightblue')
self.f1r3.config(state=DISABLED)
self.thread_it(self.gap)
else:
messagebox.showerror('错误', '发生了不可预期的错误!')
self.f1l2_var.set('发生了不可预期的错误!')
self.f1l2.config(background='red')
else:
pass
else:
messagebox.showwarning('警告','本程序仅支持中文转化!')
self.f1l2_var.set('本程序仅支持中文转化!')
self.f1l2.config(background='red')
self.radio_var.set(0)
def gap(self):
if self.radio_var.get()==1:
time.sleep(10)
self.f1r1.config(state=NORMAL)
if self.radio_var.get()==2:
time.sleep(10)
self.f1r2.config(state=NORMAL)
if self.radio_var.get()==3:
time.sleep(10)
self.f1r3.config(state=NORMAL)
def show_sigs(self,*args):
self.f2b1.config(state=DISABLED)
items = self.f2tree.get_children()
for item in items:
self.f2tree.delete(item)
page=random.choice([i for i in range(1,50)])
scentences=Mars_Spder().mars_sentence(self.sig_base_link,page)
if scentences:
#print(scentences)
n=0
for scentence in scentences:
self.f2tree.insert('',n,values=(n+1,scentence))
n+=1
time.sleep(5)#延时5秒
self.f2b1.config(state=NORMAL)
def show_copy(self,event):
#将“复制”菜单放在鼠标右击时间中
self.copy_menu.post(event.x_root,event.y_root)
def do_copy(self):
#treeview获取选中条目 treeview的基本单位是item
curr=self.f2tree.item(self.f2tree.focus()).get('values')
try:
pyperclip.copy(curr[-1])
messagebox.showinfo('提示','复制成功!')
except:
messagebox.showerror('错误','请先选中签名!')
def quit(self,args):
ret=messagebox.askyesno('退出','是否要退出?')
if ret :
self.w.destroy()
else:
pass
def escape(self):
self.quit('')
def thread_it(self,func,*args):
t=Thread(target=func,args=args)
t.setDaemon(True)
t.start()
if __name__ == '__main__':
a=App()
2.get_scentence.py
#coding:utf-8
import requests
from lxml import etree
import json
from google_trans_new import google_translator
from urllib.parse import urljoin
'''
1.火星文
2.繁体
3.句子
4.翻译
'''
class Mars_Spder:
def mars(self,words):
"""
此网站返回三个结果,存储在列表
:param words: 待转换文字内容
:return: 三个结果,存储在列表
"""
url1='http://m.fzlft.com/?'
data={
'q':words
}
headers={
'Origin': 'http://m.fzlft.com',
'Host': 'm.fzlft.com',
'Referer': 'http://m.fzlft.com/?',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
try:
r=requests.post(url1,headers=headers,data=data)
if r.status_code==200:
r.encoding='utf-8'
res=etree.HTML(r.text)
results=res.xpath('//div[@class="content_box result"]/textarea/text()')
return results[0]
else:
return False
except (requests.exceptions,IndexError):
return False
def traditional(self,words):
'''
将句子转化为繁体
:param words:
:return:
'''
url1='http://life.chacuo.net/convertchs2big5'
data={
'data':words,
'type': 'chs2big5',
'arg': 'f=gb_t=ft',
'beforeSend': 'undefined'
}
headers={
'Host': 'life.chacuo.net',
'Origin': 'http://life.chacuo.net',
'Referer': 'http://life.chacuo.net/convertchs2big5',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
try:
r=requests.post(url1,headers=headers,data=data)
if r.status_code==200:
r.encoding='utf-8'
_json=json.loads(r.text)
result=_json.get('data')[0]
return result
else:
return False
except requests.exceptions:
return False
def translate(self,words):
result=google_translator().translate(text=words,lang_tgt='english', lang_src='auto')
if result:
return result
else:
return False
def mars_sentence(self,cate_link,page):
"""
:param page: 页数
:return: 句子列表,下一页标识
"""
url=f'{
cate_link}{
int(page)}.htm'
headers={
'Referer': 'http://www.qqgexingqianming.com/huoxingwen/1.htm',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
try:
r=requests.get(url,headers=headers)
if r.status_code == 200:
r.encoding = 'utf-8'
res =etree.HTML(r.text)
sentences=res.xpath("//div[@class='boxleft']/ul/li/p/text()")
if sentences:
return sentences
else:
return False
else:
return False
except requests.exceptions:
return False
def get_sig_styles(self):
url = f'http://www.qqgexingqianming.com/'
headers = {
'Referer': 'http://www.qqgexingqianming.com/huoxingwen/1.htm',
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36'
}
r = requests.get(url, headers=headers)
if r.status_code == 200:
result=[]
r.encoding = 'utf-8'
res = etree.HTML(r.text)
selector=res.xpath('//div[@class="main"]/div[@class="hdbox"]/div[@class="hd-tab"]/a')
for data in selector:
item={
}
item['style']=''.join(data.xpath('./text()')).split('QQ')[-1].split('个性')[0]
item['link']=urljoin(url,''.join(data.xpath('./@href')))
result.append(item)
return result
else:
return False
五.总结
- 本次使用Tkinter制作了一款多功能火星文转化器,还支持个性签名的推荐展示,本质上是基于爬虫的,只是用GUI的方式展示出了网页数据。组件上主要用到了Treeview、Menu、Text、Notebook、Radiobutton。程序放在了蓝奏云。思路、代码方面有什么不足欢迎各位大佬指正、批评!