python (6) - 图形化界面TKinter、TCP/IP

python 基础知识学习

中间可能断了一篇;

参考:

图形化界面

python 自带的图形界面库TKinter

# GUI TKinter
from tkinter import *
# 消息盒子 弹窗信息
import tkinter.messagebox as messagebox

class Application(Frame):
    def __init__(self,master=None):
        Frame.__init__(self,master)
        self.pack()
        self.createWidgets()

    def createWidgets(self):
        # label 标签信息
        self.helloLabel = Label(self,text="hello world")
        self.helloLabel.pack()
        # input 信息输入
        self.getNameInput = Entry(self)
        self.getNameInput.pack()
        self.sureButton = Button(self,text="ok",command=self.welCome)
        self.sureButton.pack()
        self.quitButton = Button(self,text="Exit",command=self.quit)
        self.quitButton.pack()

    def welCome(self):
        name = self.getNameInput.get() or "world"
        messagebox.showinfo("Message","你好,%s" % name)
        
# 创建程序
app = Application()
# 程序标题title
app.master.title("hello world")
# print(app.master.size)
app.master.minsize(300,300)
app.mainloop()

说明:

  • 继承自Frame;初始化时需调用Frame.__init__();
  • master程序窗口控制,如标题、大小、位置等;
  • 类似Label/Button/Entry都是界面的组件;
  • pack()方法将定义的组件放到主程序上;command属性可绑定事件到按钮组件;
  • app.master.title()定义程序窗口的标题;
  • 消息盒子messagebox;

结果示例:
在这里插入图片描述

自定义图形绘制

在打开的界面中,处理常规的界面组件,也可自定义绘制图像;内置turtle

'''
绘制图形、turtle库
'''
import turtle
# 中心点(0.00,0.00)为原点开始,指定点的位置
turtle.setpos(100,100)
turtle.goto(40,100)
# 回到原点
turtle.home()
turtle.color("red","green")
# 绘制一个正方形,不调用填充
num = 0
while True:
    turtle.forward(75)
    turtle.right(90)
    num+=1
    if num>3:
        break
# 绘制一个圆,调用填充、fill
turtle.begin_fill()
turtle.setpos(-150,0)
turtle.circle(90)
turtle.end_fill()

# 隐藏绘制图形中移动的光标
turtle.hideturtle()
# 绘制一个文本
turtle.color("#2312fa")
turtle.setpos(-100,200)
turtle.write("hello world!",False,align="left",font=("heiti",16,"bold"))
# turtle.write((0,0),True)
turtle.done()

说明:

  • 官网地址,API
  • 最后的语句需要turtle.done() 不然页面绘制完图形会直接关闭

结果示例:
在这里插入图片描述

TCP/IP

Tcp/Ip协议互联网终端之间的桥梁;信息传输、共享;TCP是可靠连接;
使用socket创建一个服务server.py

'''
创建一个server,启动监听 8080 端口,
处理客户端过来的数据请求
'''
import socket 
# 线程控制接口
import threading
# 时间
import time

# AF_INET 指定IPV4 ,SOCK_STREAM 指向面向流的TCP协议
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 指定绑定的IP地址、端口号
server.bind(('127.0.0.1',8080))
# 启动监听 ; 可指定监听连接的最大连接数
server.listen(2)

# 定义处理连接的方法
def handleInfo(sock,addr):
    print("from:%s:%s" % addr)
    sock.send(b"hello!")
    # 等待接收客户端数据
    while True:
        data = sock.recv(500)
        time.sleep(3)
        if not data or data.decode("utf-8")=="exit":
            break
        print("client: %s " % data.decode("utf-8"))
        sock.send(("I get you ! %s" % data.decode("utf-8")).encode("utf-8"))
    sock.close()
    print("the addr %s:%s closed" % addr)
# 处理客户端的连接
while True:
    sock,addr = server.accept()
    # 没过来一个新的连接,创建一个线程来处理
    child = threading.Thread(target=handleInfo,args=(sock,addr))
    child.start()

创建客户端client.py

'''
创建一个客户端程序,连接服务程序

'''
import socket

# 创建
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)

# 进行连接
client.connect(("127.0.0.1",8080))
# 接收服务端的数据
data = client.recv(500)
print("get info: %s" % data.decode("utf-8"))
# 发送一个数据 、 提交一个名称
client.send(b"admin")
print("server: %s" % client.recv(500).decode("utf-8"))
# 连接关闭 、发送关闭表示 exit
client.send(b'exit')
# client.close()

说明:

  • socket.connect()/socket.bind()方法只有一个参数,传入参数要使用元组传递IP、端口号
  • 数据传输只能以字节传输b'admin'
  • socket.AF_INET指定的协议是IPV4 ;socket.SOCK_STREAM是基于流的TCP信息传输;
  • threading 官网链接 处理线程相关
  • time 官网链接 处理时间相关、功能接口;
  • 服务端、客户端之间通信:服务端发送->客户端接收、客户端发送->服务端接受;
    发送
    发送
    服务端
    客户端
    服务端

UDP是一种不可靠传输协议;不保证完全接受,是用于信息广播;

# server
'''
UDP 不可靠传输;广播协议 
'''
import socket

# 选择 SOCK_DGRAM UDP类型
us = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
us.bind(("127.0.0.1",8089))

while True:
    data,addr = us.recvfrom(500)
    print("from: %s:%s get info:" % addr ,data.decode("utf-8") )
    us.sendto(b"I'm coming...",addr)
    
# client 
'''
创建一个客户端程序
'''
import socket

# 创建
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)

# 发送一个数据 、 提交一个名称
client.sendto(b"admin",("127.0.0.1",8089))
print("server: %s" % client.recv(500).decode("utf-8"))

执行效果预览:
在这里插入图片描述