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

首先是时间显示,先添加一个 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)

效果图:

python tkinter循环更新 tkinter update方法_文本框


接下来是简单的网络测试,也是通过一个 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)

效果图

python tkinter循环更新 tkinter update方法_文本框_02

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

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()