续上一章 Python GUI:Tkinter——07
上一章中我们介绍了文件浏览弹窗、以及如何将我们的 GUI 打包成 可执行文件(exe),从而独立于我们的 IDE 之外。在这一章中我们将介绍 PYHON GUI 与网络的联系。
TCP/IP
TCP/IP 服务器搭建
首先我们需要搭建一个服务器,为此可以创建另一个 .py 文件 network.py:
from socketserver import BaseRequestHandler,TCPServer
class RequestHandler(BaseRequestHandler):
def handle(self):
print("Server connect to: ",self.client_address)
while True:
rsp = self.request.recv(512)
if not rsp:break
self.request.send(b'Server received: '+rsp)
def startServer():
serv = TCPServer(("",24000),RequestHandler)
# 其中空引号代表本地 IP 地址:127.0.0.1
# 24000 代表端口号
serv.serve_forever()
TCP/IP 客户端
之后为了访问这个服务器,还需要搭建相应的客户端。我们可以修改 logicpart.py 文件如下:
from time import sleep
from queue import Queue
from threading import Thread
import tkinter as tk
from socket import socket,AF_INET,SOCK_STREAM
def writeToScrol(inst):
print('hi from Queue',inst)
sock = socket(AF_INET,SOCK_STREAM)
sock.connect(('localhost',24000))
#连接 TCP 服务器
for idx in range(10):
sock.send(b'Message from a queue '+bytes(str(idx).encode()))
#客户端发送一个编码后的二进制消息和自然数给服务器
recv = sock.recv(8192).decode()
#服务器接收服务器发送的消息,并处理
inst.guiQueue.put(recv)
#将处理后的消息放入队列中显示
inst.createThread()
这个代码的作用是与服务器连接,之后在进行一些毛手毛脚的操作,大家可以直接看看我写的注释。
修改主程序
为了在 GUI 启动与服务器连接的功能,我们还要在主程序修改一下,如下所示:
from network import * #导入
class OOP():
def __init__(self):
......
svrt = Thread(target=startServer,daemon=True)
# 设置线程
svrt.start() #开启线程
......
......
之后运行程序,就会弹出如下窗口。显示一个 Python 程序正在访问我们,点击允许就可以了。
之后,点击 clickme 按钮,就会显示出相应的信息:
<queue.Queue object at 0x0000000009B13F08>
Server received: Message from a queue 0
Server received: Message from a queue 1
Server received: Message from a queue 2
Server received: Message from a queue 3
Server received: Message from a queue 4
Server received: Message from a queue 5
Server received: Message from a queue 6
Server received: Message from a queue 7
Server received: Message from a queue 8
Server received: Message from a queue 9
从网站中获取数据,并显示到我们的控件中
简单的爬虫
创建一个新文件 URL.py ,输入如下代码,就可以创建一个简单的爬虫了。大家可以试着运行一下,看其结果如何。
from urllib.request import urlopen
link='http://python.org/'
try:
f = urlopen(link)
# f 是一个 HTTPResponse 对象那个
print(f)
html = f.read()
# 将 link 的html 以字符串的形式读取出来(相当长的字符串)
print(html)
htmldecoded = html.decode() # decode 方法能够读取该 html 的所有数据。
print(htmldecoded)
except Exception as ex:
print('Failed to get Html!\n\n'+str(ex))
运行之后,会发现控制台输出很长、很长的字符串。这其实就是这个网站中包含的所有 data 了。当然,这些 data 尚未经过处理,学过 web 的大佬应该知道如何处理它,这里就不在赘述了。
GUI 获取网页数据
结合上述代码,我们可以适当地修改一下我们的 URL.py 文件,以便能够给我们的 GUI 使用:
from urllib.request import urlopen
def getHTML():
link='http://python.org/'
try:
f = urlopen(link)
html = f.read()
htmldecoded = html.decode()
except Exception as ex:
print('Failed to get Html!\n\n'+str(ex))
else:
return htmldecoded
之后,只要修改触发函数 clickBut,就可以将从网页中获取的 data 显示出来了。如下所示:
......
from URL import *
......
def _clickBut(self):
self.aButton.configure(text='hello'+self.aEntry.get()+self.aCombobox.get())
# mBox.showerror('错误提示框','你没有错,是我错了')
logicpart.writeToScrol(self)
htmlData = getHTML()
self.aScrTxt.insert(tk.INSERT,htmlData)
......
运行我们的 GUI,点击 clickme 按钮,就会在 scrolledtext 控件中显示出从 html 中爬去的数据:
总结
本章就到此为止。在本章中,我们继续完善了我们的 GUI,使之具备网络功能。下一章,我们将考虑 GUI 与 MySQL 的链接。但在此之前,我们需要学习 MySQL。因此,下一章将不继续展开。而是带领大家实现一个软件!实用的软件!怎么个实用法?敬请期待!!