'''
c/s模式编程: c客户端, s服务端
TCP套接字
套接字模块: socket
netfamily: socket.AF_INET(跨网络通信)/AF_UNIX(计算机本地通信,效率更高,对操作系统有一定要求,
需要unix-like(uninx/linux/macos)操作系统)
SOCK_STREAM: tcp套接字类型
SOCK_DGRAM: UDP套接字类型
域名和ip的关系:
域名: www.baidu.com, 通俗的说域名是ip的一个别名, 103.235.46.39
www.baidu.com -> 103.235.46.39
www.baidu.com -> 103.235.46.40
1. 域名容易记忆, ip不容易记忆
2. ip会发生变化, 域名相对不会发生变化
变量是内存地址的一个别名, 0x12345678, 非常容易识别好记
实现一个tcp的客户端
'''
import socket
# 1. 初始化套接字实例(socket)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 2. 连接服务器, ip+端口(port)
baidu_ip = 'www.baidu.com'
baidu_port = 80
s.connect((baidu_ip, baidu_port))
# 3. 发送请求数据
s.send(b'GET / HTTP/1.1\r\nUser-Agent: curl/7.29.0\r\nHost: www.baidu.com\r\nAccept: */*\r\nConnection: close\r\n\r\n')
# 4. 接收响应数据, receive
d = s.recv(1024) # buffer缓冲区的大小, 容器大小
print(d)
# 5. 关闭网络连接, 释放资源
s.close()
import string
import tkinter
from tkinter import ttk
import random as r
window = tkinter.Tk()
window.title("随机密码生成器")
'''
gui 事件驱动
1. 根据用户的操作去进行响应的处理
2. 定时器, after, 在多少时间之后触发一个函数的回调, 格式: win.after(delay_ms,func=函数,*args), 只会执行一次
3. 事件绑定, bind, 专门将事件和一个函数进行绑定, 格式: win.bind(sequence=<事件名>,func=函数)
3.1 按键: 键盘敲击某个按键去调用一个函数
3.2 鼠标: 鼠标按某个键(左/右/中)去调用一个函数
事件名如何表示:
- 鼠标事件: Button: 代表所有鼠标键的点击
Button-1: 代表鼠标左键的点击
Button-2/3: 代表鼠标右键的点击
ButtonPress: 鼠标按下事件
ButtonPress-1: 代表鼠标左键的点击
ButtonPress-2/3: 代表鼠标右键的点击
ButtonRelease: 鼠标抬起事件
ButtonRelease-1: 代表鼠标左键的点击
ButtonRelease-2/3: 代表鼠标右键的点击
- 按键事件: KeyPress: 按键按下
KeyRelease: 按键抬起
KeyPress-a: 按字母按下事件, 区分大小写
Control-Shift-KeyPress-H: 组合键
KeyPress-Return: 回车键Enter
函数: bind函数有固定格式, 一个参数event
'''
def func01():
print("after function")
window.after(100, func=func01)
# window.after(5000, func=func01)
def f
'''
GUI
tkinter tk interface
GUI概念
窗口: 是所有组件的容器, 一个GUI程序只能有一个窗口
控件: 窗口里面盛放的小组件, 比如按钮/文本框.. 简单控件/组合控件
事件: 是窗口和用户之间的交互, 通过事件窗口可以响应外部的操作
窗口的布局:
- 绝对布局: place
- 相对布局: pack
- 网格布局: grid
控件:
- 按钮 Button
- 文本框: Label
- 文本输入框: Entry
- 单选框: RadioButton
- 下拉框: Commobbox
控件名(master,options)
'''
import string
import tkinter
from tkinter import ttk
import random as r
window = tkinter.Tk()
window.title("随机密码生成器")
label = tkinter.Label(window, text='密码:')
label.grid(row=0, column=0)
entry_text = tkinter.StringVar()
entry = tkinter.Entry(window, textvariable=entry_text)
entry.grid(row=0, column=1)
def gen_poor_password(password_len):
list = r.choices(string.ascii_lowercase, k=password_len)
return ''.join(list)
def medium_password(len):
password = r.choices(string.ascii_lowercase + string.ascii_uppercase + string.digits, k=len)
return ''.join(password)
'''
entry设置文本的两种方法:
- entry.delete(0, tkinter.END)/entry.insert(0, password)
- 控制变量: entry_text.set(password)
'''
def
'''
GUI
tkinter tk interface
GUI概念
窗口: 是所有组件的容器, 一个GUI程序只能有一个窗口
控件: 窗口里面盛放的小组件, 比如按钮/文本框.. 简单控件/组合控件
事件: 是窗口和用户之间的交互, 通过事件窗口可以响应外部的操作
窗口的布局:
- 绝对布局: place
- 相对布局: pack
- 网格布局: grid
控件:
- 按钮 Button
- 文本框: Label
- 文本输入框: Entry
- 单选框: RadioButton
- 下拉框: Commobbox
控件名(master,options)
'''
import tkinter
from tkinter import ttk
window = tkinter.Tk()
window.title("随机密码生成器")
label = tkinter.Label(window, text='密码:')
label.grid(row=0, column=0)
entry = tkinter.Entry(window)
entry.grid(row=0, column=1)
def fun01():
print("button clicked")
entry.insert(0, "button clicked")
print(var_radio.get())
btn = tkinter.Button(window, text="生成", command=fun01, cursor="plus")
btn.grid(row=0, column=2, columnspan=3, sticky=tkinter.W + tkinter.N)
# RadioButton
# 多选框
# image
# 参数: 主控件, options
# pad 填充
# text: text静态文本, 程序运行时不改变的
# textvariable: 是动态文本, 程序运行时能动态改变的
# radiobutton成组出现时: variable参数一定要是同一个, 并且value参数不能相同
var_radio = tkinter.IntVar()
radio = tkinter.Radiobutton(window, t
'''
GUI
tkinter tk interface
GUI概念
窗口: 是所有组件的容器, 一个GUI程序只能有一个窗口
控件: 窗口里面盛放的小组件, 比如按钮/文本框.. 简单控件/组合控件
事件: 是窗口和用户之间的交互, 通过事件窗口可以响应外部的操作
窗口的布局:
- 绝对布局: place
- 相对布局: pack
- 网格布局: grid
控件:
- 按钮 Button
- 文本框: Label
- 文本输入框: Entry
- 单选框: RadioButton
- 下拉框: Commobbox
控件名(master,options)
'''
import tkinter
window = tkinter.Tk()
window.title("随机密码生成器")
label = tkinter.Label(window, text='密码:')
label.grid(row=0, column=0)
entry = tkinter.Entry(window)
entry.grid(row=0, column=1)
def fun01():
print("button clicked")
entry.insert(0, "button clicked")
btn = tkinter.Button(window, text="生成", command=fun01)
btn.grid(row=0, column=5)
window.mainloop() # 主循环, 进入事件系统
# 将站名从json里加载到python dict里
import json
import requests
with open("station_name.json", "r", encoding="utf-8") as file:
station_names = json.load(file)
#1. 定义cookie, 从浏览器上复制标头里的Cookie信息
#2. requests.get方法中使用cookies参数传递cookie
cookie = {
"Cookie": "_uab_collina=163989662013689087788656; JSESSIONID=6F71D581C0B79F538C48D84671D90C59; _jc_save_fromStation=%u5317%u4EAC%2CBJP; _jc_save_toStation=%u4E0A%u6D77%2CSHH; _jc_save_wfdc_flag=dc; BIGipServerpassport=904397066.50215.0000; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off; RAIL_EXPIRATION=1641978502826; RAIL_DEVICEID=lRZ-NZ8KVvenlmxGVRDY6sEQLl9vfztTy046woUuXxahLWPUQEiV1Z0CvmDakEt9nFIjADCwL1Bc_wWLHO3K7q553hxN_R18_cfYCT2lOIuBCcW5HyG6yLGYwmhZfZfVdB3ajjcpMk5uS4OT3vKzTugHJ27YBf5l; route=9036359bb8a8a461c164a04f8f50b252; _jc_save_toDate=2022-01-09; BIGipServerotn=149946890.50210.0000; _jc_save_fromDate=2022-01-09"
}
# 1. 将出发日期/起始站/到达站 定义成变量
# 2. 将变量放入url(网络地址)中进行网络请求(request
'''
如何查看网络请求: 打开浏览器, 通过F12快捷键打卡开发者工具, 在开发者工具网络(Network)选项卡中查看网络请求
浏览网站流程:
1. 客户端(浏览器)发送网络请求
2. 服务器(12306网站服务端)接收到用户请求,处理用户请求
3. 服务器发送处理结果给客户端(浏览器)
网络名词:
Url: 是网站的唯一标识, 是网站的地址, 通过在浏览器中输入url即可访问指定的网站
Cookie: 网站识别用户的唯一标识
url类似于门牌号, cookie类似于钥匙
JSESSIONID=53E77D821DFA1A6370BF18B68D00D526; route=9036359bb8a8a461c164a04f8f50b252; BIGipServerotn=955253258.50210.0000; RAIL_EXPIRATION=1640156627608; RAIL_DEVICEID=HHUFxIoyq5IJ3XCexA1nnSNQtNz3vdfdA43QeppBvaM_rEhMdmROm-u3lkTrouIfO2De29t5zllpye_T-ZRw4wLXT00unHv7UxpO5NfFZjJQ4YuAfMfpUoKBEfxnLZgOXkOAu1L421JWJbzDmHykIonNyxG6DEyy; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off
requests模块: 模拟客户端进行url请求
使用pip安装request模块: 打开cmd,运行 pip install requests
'''
import requests # 导入request模块
# 使用request的get方法模拟浏览器访问12306网页
response = requests.get('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217')
split_result = response.text.split('@')
# print(split_result)
'''
忽略列表里
'''
如何查看网络请求: 打开浏览器, 通过F12快捷键打卡开发者工具, 在开发者工具网络(Network)选项卡中查看网络请求
浏览网站流程:
1. 客户端(浏览器)发送网络请求
2. 服务器(12306网站服务端)接收到用户请求,处理用户请求
3. 服务器发送处理结果给客户端(浏览器)
网络名词:
Url: 是网站的唯一标识, 是网站的地址, 通过在浏览器中输入url即可访问指定的网站
Cookie: 网站识别用户的唯一标识
url类似于门牌号, cookie类似于钥匙
JSESSIONID=53E77D821DFA1A6370BF18B68D00D526; route=9036359bb8a8a461c164a04f8f50b252; BIGipServerotn=955253258.50210.0000; RAIL_EXPIRATION=1640156627608; RAIL_DEVICEID=HHUFxIoyq5IJ3XCexA1nnSNQtNz3vdfdA43QeppBvaM_rEhMdmROm-u3lkTrouIfO2De29t5zllpye_T-ZRw4wLXT00unHv7UxpO5NfFZjJQ4YuAfMfpUoKBEfxnLZgOXkOAu1L421JWJbzDmHykIonNyxG6DEyy; guidesStatus=off; highContrastMode=defaltMode; cursorStatus=off
requests模块: 模拟客户端进行url请求
使用pip安装request模块: 打开cmd,运行 pip install requests
'''
import requests # 导入request模块
# 使用request的get方法模拟浏览器访问12306网页
response = requests.get('https://kyfw.12306.cn/otn/resources/js/framework/station_name.js?station_version=1.9217')
split_result = response.text.split('@')
print(response.text.split('@'