python3GUI--多功能火星文转化器(附源码)


作为一名标准九零后,怎么能不知道火星文呢?本次使用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。程序放在了蓝奏云。思路、代码方面有什么不足欢迎各位大佬指正、批评!
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/a1397852386/article/details/117447416
今日推荐