Tkinter+requests库打造属于你自己的翻译软件(三)

本文为进阶内容,第一篇通过简单爬虫进行翻译内容的分析第二篇文章为翻译的图形界面编写,本文主要讲述多线程下时间的动态显示与网络链接测试

首先是时间显示,先添加一个 Label 来显示时间

import time
timeLabel=tk.Label(text=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
#设置时间标签,利用 time 模块进行时间的格式化输出
timeLabel.grid(row=3, column=4, sticky=tk.S)

在 tkinter 中有一个 after 函数,称为时间触发器,可以定时触发一个函数,这里我们先写一个用于更新时间的函数

def trickit():
    currentTime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    timeLabel.config(text=currentTime)#通过修改 Label 中 text 属性来改变内容
    window.update()#更新根窗口达到更新 Label 的目的
    window.after(1000, trickit)#在函数中触发自身函数,做到非阻塞循环触发
#接下来我们在 window.mainloop() 前面添加一个 after 函数用来触发时间更新函数
window.after(1000, trickit)

效果图:
这里写图片描述
接下来是简单的网络测试,也是通过一个 Label 实时更新来实现的

netLabel=tk.Label(text="网络测试中")#设置网络测试标签
netLabel.grid(row=4, column=4,sticky=tk.N)

def test():
    try:
        response = request.urlopen(r'http://www.baidu.com', timeout=1)
        code=response.getcode()
        if code==200 or '200':
            netLabel.config(text="网络通畅")
        else:
            netLabel.config(text="网络异常,请检查网络")
    except:
        netLabel.config(text="网络异常,请检查网络")
        pass
    window.after(1000, test)
#在 window。mainloop() 前添加触发器
window.after(1000, test)

效果图
这里写图片描述

虽然看上去好像没问题,但是一旦出现网络异常,整个程序就会卡死,这是由于等待网页返回的过程是一个阻塞的过程,在有返回值之前所有程序都会停下来等待,所以这里我们需要添加一个多线程,让网络检测单独在一个线程中工作

import threading
def porsessMange():
    trickit()
    tasker=[]
    tasker.append(threading.Thread(target = test))
    for t in tasker:
        t.start()
    window.after(1000, porsessMange)
    #这里添加一个线程,用于使用测试函数

下面放上完全代码

import tkinter as tk
import tkinter.messagebox as tkmsg
import threading, pyperclip, time
from newBaiduAPI import*
from urllib import request

def translate():
    data = str(textUp.get("0.0", "end"))
    if data == '\n':#输入框为空时会返回一个换行符
        textDown.delete(1.0,tk.END)
        result = '调皮,快点输入内容啦'
        textDown.insert("1.0", result)
    else:
        textDown.delete(1.0,tk.END)
        data = data.replace('\n', ',')[:-1]
        temp=baiduapi()#初始百度翻译爬虫
        result=temp.translate(data)
        textDown.insert("1.0", result)
    return result

def clearText():
    textUp.delete(1.0,tk.END)
    
def copyResult():  
    pyperclip.copy(str(textDown.get("0.0", "end")))
    tkmsg.showinfo('提示','复制成功')

def trickit():
    currentTime=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    timeLabel.config(text=currentTime)
    window.update()
    window.after(1000, trickit)
    
def porsessMange():
    trickit()
    tasker=[]
    tasker.append(threading.Thread(target = test))
    #tasker.append(threading.Thread(target = trickit))
    for t in tasker:
        t.start()
    window.after(1000, porsessMange)
    
def test():
    try:
        response = request.urlopen(r'http://www.baidu.com', timeout=1)
        code=response.getcode()
        if code==200 or '200':
            netLabel.config(text="网络通畅")
        else:
            netLabel.config(text="网络异常,请检查网络")
    except:
        netLabel.config(text="网络异常,请检查网络")
        pass
ws=0#屏幕宽度
hs=0#屏幕高度
textHeight = 10#文本框高度
textWidth = 30#文本框宽度
winWideth=450#根窗口宽度
winHeight=320#根窗口高度

window=tk.Tk()
ws=window.winfo_screenwidth()#获取宽度
hs=window.winfo_screenheight()#获取高度
x=(ws/2)-200
y=(hs/2)-200

window.geometry("%dx%d+%d+%d"%(winWideth, winHeight,x,y))#居中显示窗口
window.resizable(width=False, height=False)
window.title('简单翻译')#设置容器标题
window.iconbitmap("F:\work\python_file\BaiduTranlater\myico.ico")

textUp=tk.Text(window, height=textHeight, width=textWidth)#设置文本框
textUp.grid(row=1, column=0, sticky=tk.N+tk.S)
textDown=tk.Text(window, height=textHeight, width=textWidth)#设置文本框
textDown.grid(row=3, column=0, sticky=tk.N+tk.S)

upScrollba=tk.Scrollbar(window)#设置上文本框滚动条
upScrollba.grid(row=1, column=1, sticky=tk.N+tk.S)
upScrollba.config(command=textUp.yview)#绑定滚动事件
textUp.config(yscrollcommand=upScrollba.set)#设置滚动事件动作

downScrollba=tk.Scrollbar(window)#设置下文本框滚动条
downScrollba.grid(row=3, column=1, sticky=tk.N+tk.S)
downScrollba.config(command=textDown.yview)
textDown.config(yscrollcommand=downScrollba.set)

cleanButton=tk.Button(window, text="清空文本框", command = clearText)#清空上方的输入框
cleanButton.grid(row=1, column=3, sticky=tk.W+tk.E)
translateButton=tk.Button(window, text="点此进行翻译", command=translate)#进行翻译
translateButton.grid(row=2, column=3, sticky=tk.W+tk.E)
copyButton=tk.Button(window, text="复制结果", command = copyResult)#复制下方结果框内容
copyButton.grid(row=3, column=3, sticky=tk.W+tk.E)

timeLabel=tk.Label(text=time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))#设置时间标签
timeLabel.grid(row=3, column=4, sticky=tk.S)

netLabel=tk.Label(text="网络测试中")#设置网络测试标签
netLabel.grid(row=4, column=4,sticky=tk.N)


window.after(1000, porsessMange)
window.mainloop()

以上代码为三篇文章所有代码片的总和,如有兴趣或是需要更加详细的指导请联系QQ:
723831904

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值