本文为进阶内容,第一篇通过简单爬虫进行翻译内容的分析,第二篇文章为翻译的图形界面编写,本文主要讲述多线程下时间的动态显示与网络链接测试
首先是时间显示,先添加一个 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('简单翻译by臧贵城')#设置容器标题
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