Python GUI:Tkinter——08


续上一章 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。因此,下一章将不继续展开。而是带领大家实现一个软件!实用的软件!怎么个实用法?敬请期待!!

猜你喜欢

转载自blog.csdn.net/weixin_42141390/article/details/106583809