python全栈-python进阶
python进阶
文章目录
- python进阶
- 异常except
- 自定义异常类
- 文件操作
- 序列化和反序列化
- CSV文件
- os模块
- os.path模块
- shutil模块 拷贝压缩
- 模块--module
- from 模块 import 成员
- 包package
- 库Library
- PIP库
- GUI编程-tkinter版
- 使用类定义的GUI界面
- 设置控件的属性方式
- Label标签的常用属性
- Button
- Entry与StringVar
- Text多行文本框
- 单选按钮/复选按钮
- canvas画布
- 布局
- lambda表达式传参,解决command无法传参的问题
- 事件绑定机制
- Optionmenu选项菜单--下拉式选项
- scale移动滑块按钮
- 颜色选择框askcolor
- 文件对话框
- 简单输入框simpledialog
- 通用消息框messagebox
- ttk模块 - tkinter的现代版
- 菜单栏-菜单-右键菜单(上下文菜单)
- 记事本项目
- 坦克大战pygame
- 主窗口
- 事件处理
- 添加文字内容
- 加载图片
异常except
BaseException 是所有异常的父类。就是报错的提示语的父类。
- 格式:try…except
try:print('想要尝试的语句')
except BaseException as e: as是取别名,把异常信息给e变量print('第二行出错')print(e)这里打印异常信息
- 多异常处理:就是一个try,后面对应多个expect原因 try…except…except
try:可能出错的地方
except TypeError: 异常的子类在前面,能明确告知程序员是那种异常print('类型不对')
except BaseException as e: 异常的父类放在最后面,因为这个父类包含的所有的异常情况,如果父类在前面,子类就没有表现的机会了这里打印异常信息
每个异常都有自己的类型,使用type(e)可以知道异常的类型,然后写在except后面方便以后判断
try:num = 2/0 这里我们不知道除数为0是什么异常
except BaseException as e: 把异常的结果给了eprint(type(e)) 得到e是<class 'ZeroDivisionError'>
经过优化之后:
try:num = 2/0
except ZeroDivisionError: 把刚刚那个异常的原因放在这里,就可以很清晰的看到异常原因了。只执行一次。print('除数不能为0')
except BaseException as e: 上面的子类异常被捕获之后,就不会再执行后面的语句了。print(type(e))
- try…except…else结构
- 如果try里面的语句没有异常,就执行else语句,如果有异常就不执行else语句
try:num = 2/1
except BaseException as e:print(type(e))
else:print('正常运行')
- try…except…finally 无论有没有异常都会执行finally里面的内容,一般是释放在try里面消耗的资源
try:num = 2/1
except BaseException as e:print(type(e))
else:print('正常运行')
finally:print('计算结束,程序释放')
异常语句中也可以放return语句,一般写在else和finally后面,防止有意外发生
- 异常类型BaseException
- SyntaxError 语法错误
- NameError变量未声明
- ZeroDivisionError除数为0
- ValueError数值错误
- TypeError 类型错误
- AttributeError对象不存在该属性
- IndexError索引越界
- KeyError字典的关键字不存在
- 还有很多,去网上自己查,一般是遇到什么看什么
traceback库 异常日志库,专门负责记录异常信息的
import tracebacktry:num = 2/0
except: with open('异常日志.txt','a') as f: a是追加的意思traceback.print_exc(file=f) 只要发生了异常就把信息写在文件里面
自定义异常类
就是特意去构建一个异常
- 继承Exception父类
- 继承构造函数
- 重写str方法
- 使用 if 判断,然后 raise 手动去调用我们的异常
class AgeError(Exception): 自定义的异常要继承父类,Exception是运行时异常,一般继承这个父类就够了def __init__(self, value): 继承构造函数Exception.__init__(self) 在继承父类的基础上初始化self.value = valuedef __str__(self): 重写字符串函数,因为要输出我们自定义的信息return str(self.value)def InfoAge():a = int(input('请输入数字:'))if (a>1 and a<150):print(a)else:raise AgeError(a) raise 手动抛出异常,就是手动去调用我们自定义的异常
InfoAge()
文件操作
文件有文本文件和二进制文件两类
python标准库与文件相关的模块:
io | 文件流的输入和输出input output |
---|---|
os | 基本的操作系统功能,包含文件操作 |
glob | 查找特定的文件路径名 |
fnmatch | 匹配文件路径名 |
fileinput | 处理多个输入文件 |
filecmp | 文件比较 |
cvs | cvs文件的处理 |
pickle/cPickle | 序列化/反序列化 |
xml | XML数据处理 |
bz2,gzip,zipfile,zlib,tarfile | 压缩/解压文件 |
-
创建文件 open(文件名,打开方式)
-
打开方式:
- r 只读
- w 只写,不存在则新建,存在就重写
- a 追加,不存在则新建,存在就追加内容
- b 二进制
- +读写模式
-
中文乱码问题:
- windows默认是GBK
- Linux默认是UTF-8
- open方法默认GBK
- pycharm里面选择File Encoding选择GBK即可。也可以在open函数里面指定编码方式encoding=“utf-8”
-
write/writelines() 写入
- write是把字符串写入文件
- writelines是把字符串列表写入文件,不添加换行符。就是一大串字
-
close关闭文件,一般是对应单独使用open的情况
- 这个方法会把缓存区的内容写入文件。在不关闭文件的情况下,也可以使用flush方法把缓冲区内容写入硬盘
-
with自动释放资源,文件使用完毕就关闭,本质上是try…except…finally,有无异常都关闭文件
-
文件的读取
- read(num) 读取num个字符,没写就是全要。如果没写参数,只能读一次,因为读一次之后,文件指针就到文件末尾了
- readline() 读一行
- readlines() 把每一行字符串存入列表,返回列表
-
二进制文件的读写
- wb 重写
- ab 追加
- rb 只读
序列化和反序列化
使用pickle模块
- pickle.dump(被序列化对象,存储文件) 变对象为序列号信息
- pickle.load(储存文件) 读序列化内容
CSV文件
是一种文本格式,用于数据库的导入和导出
- 没有类型,都是字符串
- 不能指定字体颜色
- 不能指定单元格样式,不能合并单元格
- 没有多个工作表
- 不能嵌入图像
需要使用csv模块
- csv.reader(文件) 得到一个列表文件,需要使用for循环输出。一行字符串是一个列表元素
- csv.writer() 写入表头 只写首行
- csv.writerows() 写数据 全部写入,传一个列表,元素需要以元组的形式构成。[(),(),()]
os模块
- os.system(执行的系统操作) 直接调用命令行工具
- os.startfile(文件的路径) 打开一个程序或者文件
- remove(path) 删除指定文件
- rename(指定文件名,重命名) 重命名文件或目录
- stat(path) 返回文件属性
- listdir(path) 返回目录下的文件和目录列表,就是文件夹里面的子文件夹
- name 返回操作系统的名称 windows返回nt,linux返回posix
操作目录的方法
- mkdir(path) 创建目录
- makedirs(path1/path2/path3…) 创建多级目录,就是多个嵌套的文件夹
- rmdir(path) 删除目录
- removedirs(path1/path2/path3…) 删除多级目录
- getcwd()返回工作目录
- chdir(path) 设置当前工作目录
- walk() 遍历目录
- sep 当前操作系统使用的路径分隔符,windows是\linux是/
- linesep 打印操作系统的换行符\r\n linux只要\n repr可以显示换行符
os.path模块
- | - |
---|---|
isabs | 判断是不是绝对路径 |
isdir | 是不是目录 |
isfile | 是不是文件 |
exists | 文件是否存在 |
getsize | 返回文件大小 |
abspath | 返回绝对路径 |
dirname | 返回目录路径 |
getatime | 返回文件最后访问时间 |
getmtime | 返回文件最后修改的时间 |
walk | 递归遍历目录 |
join | 拼接多个路径 |
spilt | 对路径分隔,以列表的形式返回“目录”+“文件名.文件后缀” |
splitext | 路径中分类文件扩展名‘路径/文件名’+“文件后缀” |
shutil模块 拷贝压缩
- shutil.copyfile(A文件,B文件) 把a文件的内容拷贝给b文件
- shutil.copytree(A,B,ignore=)把a文件夹的内容拷贝到b,ignore是筛选拷贝的文件格式
- make_archive(压缩包路径,压缩格式,压缩的文件)
zipfile模块
import zipfile
z = zipfile.ZipFile(压缩包名,"W")
z.write(压缩文件1)
z.write(压缩文件2)
z.write(压缩文件3)
Z.close() 会把三个压缩文件一起压缩放在一个压缩包里面z2 = zipfile.ZipFile(压缩包名,"r")
z2.extractall(解压路径)
z2.close() 解压
模块–module
直观来讲就是源文件py文件
模块化编程的流程:
- 设计API
- 实现API
- 测试API,并消除全局代码
- 使私有函数不被外部客户端调用
API应用程序编程接口 用于描述模块提供的函数和类功能和使用方法
- 消除测试代码
def add(a,b):return a+bif __name__ == '__main__': 这个语句是判断当前环境是主函数就执行下面的测试代码,如果当前代码是被调用在其他环境下,就不执行下面的语句print(add(1, 2))
就是我们写好函数之后,想要测试功能,就写在这个if表达式后面。这个name是可以获取当前代码的名称。只有被当作程序入口的时候name等于main。
这个表达式在测试的时候有效。当打包给别的代码调用的时候就无效了
通过使用help(模块) 就可以查看模块的注释部分,或者使用doc去查看注释内容
from 模块 import 成员
使用这个导入成员的方法后,这个成员就是我们自己的内置函数了,就不需要使用 模块.成员 的方式去调用了。
只使用import只是导入模块,想要使用模块里面的成员还是需要模块调用。
使用了from就不需要模块调用了。
- from…import * 就是把模块里面的所有方法都导入
- 对同一个模块多次导入,也只会生成一个module对象
- importlib.reload() 可以重新加载模块
包package
本质上就是一个文件夹,必须包含py文件。至少有一个py文件
在pycharm新建文件的时候,选择python package就可以建包。会自动生成一个init的py文件,当然是空的。在包里面也能嵌套建包,也会自动生成一个init的py文件。
导入包的本质是执行包里面的init文件,一般在init里面对包进行初始化
库Library
模块的集合就是库
PIP库
阿里 http://mirrors.aliyun.com/pypi/simple
豆瓣http://pypi.douban.com/simple
中科大http://pypi.mirrors.ustc.edu.cn/simple
清华http://pypi.tuna.tsinghua.edu.cn/simple
华中理工http://pypi.hustunique.com/simple
山东理工http://pypi.sdulinux.org/simple
V2EXhttp://pypi.v2ex.com/simple
GUI编程-tkinter版
-
mainloop 调用该方法,保持窗口显示
-
messagebox是tkinter里面的模块,就是一个弹窗。
- 使用该模块的showinfo方法,编辑弹窗里面的内容
-
事件绑定–桥bind
from tkinter import *
from tkinter import messageboxtk1 = Tk()
tk1.title("这是窗口") 设置窗口标题
tk1.geometry("300x300+500+200") 设置窗口大小,后面分别是窗口和屏幕的距离,这是x横向距离500像素,y纵向距离200像素btn1 = Button(tk1) 调用按钮方法
btn1['text']='这是一个按钮' 编辑按钮的文本内容def btn1_clicked(): 按钮1的点击事件 messagebox.showinfo('弹窗1','你点击了按钮') 调用弹窗,参数1是弹窗标题,参数2是文本内容print(111) 输出信息到控制台btn1['command'] = btn1_clicked 绑定按钮1和事件btn1.pack() 合理设置按钮1的大小
tk1.mainloop()
常用控件
方法 | 名称 | 用法 |
---|---|---|
Toplevel | 顶层容器 | 容器类存放其他控件 |
Button | 按钮 | 按钮 |
Canvas | 画布 | 绘图 |
Checkbutton | 复选框 | |
Entry | 单行输入框 | |
Frame | 容器 | |
Label | 标签 | 显示不可编辑的文本或图标 |
LabelFrame | 容器 | 支持添加标题 |
Listbox | 列表框 | |
Menu | 菜单 | 菜单组件 |
Menubutton | 菜单按钮 | 菜单按钮等 |
OptionMenu | 菜单按钮 | 子菜单 |
Message | 消息框/弹窗 |
使用类定义的GUI界面
from doctest import master
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = master 这里是初始化步骤self.pack()self.creatapp() 调用我们写的控件def creatapp(self):btn1 = Button(self, text="按钮1", command=self.btn1_clicked)btn1.pack()btn2 = Button(self, text="按钮2", command=t1.destroy) 绑定的是主窗口的退出方法btn2.pack()def btn1_clicked(self):messagebox.showinfo('弹窗1','你点击了按钮1')if __name__ == '__main__':t1 = Tk()t1.geometry("300x300+500+200")app = MainApp(t1)t1.mainloop()
设置控件的属性方式
就是给控件设计属性的方法:
- btn1 = Button(self, text=“按钮1”, command=self.btn1_clicked) 这种把属性当成参数去填写
- btn1[‘command’] = btn1_clicked 像调用字典的格式去使用参数
- label.config(text=“You clicked the button!”, bg=“lightgreen”) 可以使用config去编辑属性
- config动态更新组件属性
- 修改文本内容config(text=“Hello, World!”)
- 修改颜色config(bg=“red”)
- 字体大小config(font=(“Arial”, 16, “bold”))
Label标签的常用属性
- text
作用: 显示在标签上的文本。
参数: 一个字符串。例如:“Hello, World!”。
- image
作用: 用于显示图像(需要使用 PhotoImage 等对象)。
参数: 一个 PhotoImage 或 BitmapImage 对象。例如:my_image = PhotoImage(file=“image.png”)。
- borderwidth 或 bd
作用: 设置标签边框的宽度(以像素为单位)。
参数: 整数,表示边框宽度。例如:borderwidth=2。
- relief
作用: 设置标签边框的样式。
参数: 可能的值有:
flat: 无边框。
raised: 凸起的边框。
sunken: 凹下去的边框。
groove: 凹槽效果。
ridge: 峰脊效果。
- bg 或 background
作用: 设置标签的背景颜色。
参数: 可以是颜色名称(如 “red”)或十六进制颜色代码(如 “#ff0000”)。例如:bg=“lightblue”。
- fg 或 foreground
作用: 设置文本颜色。
参数: 同样是颜色名称或十六进制颜色代码。例如:fg=“black”。
- font
作用: 定义文本的字体及其样式。
参数: 一般是元组,包含字体名称、大小和可选的样式。例如:font=(“Arial”, 16, “bold”)。
- width
作用: 设置标签的宽度。
参数: 整数,通常以字符的数量为单位。例如:width=20。
- height
作用: 设置标签的高度。
参数: 整数,通常以行数为单位。例如:height=3。
- anchor
作用: 设置文本在标签内的对齐方式。
参数: 可能的值有:
n: 北(顶部中心)
ne: 东北
e: 东
se: Southeast
s: 南(底部中心)
sw: 西南
w: 西
nw: 西北
center: 中心对齐(默认)
- justify
作用: 如果 text 是多行,则指定对齐方式。
参数: 可能的值有:
left: 左对齐
center: 居中对齐
right: 右对齐
- state
作用: 设置标签的状态。
参数: 可能的值有:
normal: 默认状态,标签可见。
active: 标签激活状态。
disabled: 标签禁用状态,文本会变成灰色且不可交互。
- padx
作用: 设置标签内容左右的内边距(添加在文本外的空白区域)。
参数: 整数,表示内边距的像素值。例如:padx=10。
- pady
作用: 设置标签内容上下的内边距。
参数: 整数,表示内边距的像素值。例如:pady=10。
- highlightbackground
作用: 设置焦点不在标签上的背景颜色。
参数: 颜色名称或十六进制颜色代码。例如:highlightbackground=“pink”。
- highlightcolor
作用: 设置当标签有焦点时的边框颜色。
参数: 颜色名称或十六进制颜色代码。例如:highlightcolor=“blue”。
- highlightthickness
作用: 设置高亮边框的厚度。
参数: 整数值,表示边框的厚度。例如:highlightthickness=2。
from doctest import master
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):self.lab = Label(self, text="我",width=10,height=4,fg="red",bg="black",anchor='s')self.lab.pack()global photo1photo1 = PhotoImage(file="./123.gif")self.lab2 = Label(self,image=photo1,width=200,height=150)self.lab2.pack()self.lab3 = Label(self,text="这里是\n多行文本\n显示",width=10,height=4,fg="black",bg="white",justify="center",relief="raised")self.lab3.pack()if __name__ == '__main__':t1 = Tk()t1.geometry("300x300+500+200")app = MainApp(t1)t1.mainloop()
Button
本身的内容可以是文本也可以是图片
- state=disabled 禁用按钮
Entry与StringVar
Entry是单行输入框
StringVar是获取Entry里面文本的方法。这两个东西一联动,就是一体的了,从stringvar里面获取entry里面的内容。
使用set方法,就可以编辑输入框的默认值了
使用get方法就可以得到输入的内容了
在entry里面使用textvariable绑定stringvar
使用show='*'属性,可以保护用户输入的内容
from doctest import master
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):self.lab = Label(self, text="用户名",width=5,height=2,fg="black",font=12)self.lab.pack()v1 = StringVar()self.text1 = Entry(self, textvariable=v1) self.text1.pack()self.lab1 = Label(self, text="密码", width=5, height=2, fg="black", font=12 )self.lab1.pack()v2 = StringVar()self.text2 = Entry(self, textvariable=v2,show="*") 在show里面写屏蔽输入后显示的内容self.text2.pack()self.btn1 = Button(self, text='登录',fg="black",font=10,command=self.login)self.btn1.pack()def login(self):print(self.text1.get(),self.text2.get(),'申请登录')messagebox.showinfo('登录验证界面','等待系统回应')if __name__ == '__main__':t1 = Tk()t1.geometry("300x200+500+200")t1.title('登录系统')app = MainApp(t1)t1.mainloop()
Text多行文本框
主要用于显示多行文本
还可以显示,网页链接,图片,HTML页面,CSS样式表
- 基本参数
master: 父容器,通常是一个窗口或框架(Frame)。
width: 文本框的宽度(以字符数为单位)。
height: 文本框的高度(以行数为单位)。
bg: 背景颜色。
fg: 前景颜色(文本颜色)。
font: 字体样式,可以是字体名、大小等组合。
wrap: 文本换行模式。可选值为:
NONE: 不换行。
CHAR: 在字符边界换行。
WORD: 在单词边界换行(默认值)。
state: 控件状态,可以是 NORMAL、DISABLED 或 READONLY。
- 插入和删除文本
insert(index, text): 在指定索引位置插入文本。
delete(start, end): 删除从 start 到 end 之间的文本。
- 获取与设置文本
get(start, end): 获取从 start 到 end 之间的文本。
delete(1.0, END): 删除从文本的起始位置到结束的所有文本(1.0 表示第一行的开始,END 表示最后一行的结束)。
- 文本标记和标签
tag_add(tag, start, end): 在指定的文本区域添加一个标签。
tag_config(tag, options): 配置选定标签的属性,如字体、颜色等。
tag_bind(tag, sequence, callback)
tag是绑定事件的标签
sequence是事件的类型,有<Button-1>
(鼠标左键单击)、<KeyPress>
(键盘按键)、<Enter>
(鼠标进入)等。
callback: 当用户与指定标签的文本交互时要调用的函数。
- 滚动条
通常,Text 组件与 Scrollbar 组件结合使用,以便用户能够滚动查看文本内容。
import webbrowser
from tkinter import *class MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):self.btn1 = Button(self,height=1,text='在光标处插入文本',command=self.clickinsert)self.btn2 = Button(self,text='清空文本内容',command=self.btn2click)self.btn3 = Button(self,text='添加图片',command=self.btn3click)self.btn4 = Button(self,text='添加按钮',command=self.btn4click)self.btn1.pack(side='left')self.btn2.pack(side='left') 这里是水平布局管理self.btn3.pack(side='left')self.btn4.pack(side='left')self.tt1 = Text(self.master, width=40, height=10,bg='black',fg='white')self.tt1.insert(1.0,'这里是第一行\n这是第二行')self.tt1.tag_add('dd',1.0,1.4) 这里是对第一行的第0个字到第4个字,设置了标签ddself.tt1.tag_config('dd',foreground='red',background='white') 对dd标签进行设置self.tt1.tag_bind('dd','<Button-1>',self.openurl) 增加标签的事件,当标签被点击的时候,调用方法self.tt1.insert(2.3,'(在2行3列,插入文本)')self.tt1.pack()def openurl(self,e): 第二个参数没啥用,但是得有,随便写webbrowser.open_new('http://bilibili.com')def clickinsert(self):self.tt1.insert(INSERT,'{被点击的地方}') 第一个参数可以获取鼠标点击过的地方,然后插入文本def btn2click(self):self.tt1.delete(1.0,END) 这里是删除从1行0列到最后的所有内容def btn3click(self):global photophoto = PhotoImage(file='./123.gif')self.tt1.image_create(END,image=photo) 在text里面新增图片image_createdef btn4click(self):btn11 = Button(self.tt1,text='新增按钮')self.tt1.window_create(END,window=btn11) 在text里面新增控件window_createif __name__ == '__main__':t1 = Tk()t1.geometry("400x200+500+200")app = MainApp(t1)t1.mainloop()
- 这里是练习了:
- 新增控件
- 新增图片
- 新增文字内容
- 对已有文字进行属性设置,比如对局部文件设置标签,类似css里面的class
- 使用默认浏览器打开链接
- 控件的水平布局
单选按钮/复选按钮
- Radiobutton单选按钮
按钮后面可以接文本,或图像。类似label
import webbrowser
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):self.v = StringVar()self.v.set("T") 这里是设置一个默认值self.r1 = Radiobutton(self, text="T", variable=self.v, value="T") 使用variable和stringvar联动self.r2 = Radiobutton(self, text="F", variable=self.v, value="F") 这里面的value是结果self.r1.pack(side=LEFT)self.r2.pack(side=LEFT)Button(self, text="确定", command=self.print_click).pack(side=RIGHT)def print_click(self):messagebox.showinfo('这是弹窗','你选择的是'+self.v.get()) 使用get得到的是单选的值valueif __name__ == '__main__':t1 = Tk()t1.geometry("400x200+500+200")app = MainApp(t1)t1.mainloop()
- Checkbutton复选按钮
onvalue意思是选中的时候值是什么。offvalue就是未选中的值。因为我们设计的值是1或0.使用intvar接收更合理。单选是t或f使用stringvar更合适
单选按钮只需要一个变量去接收最后的结果。复选框需要每个变量单独去接收。
import webbrowser
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):self.choose1 = IntVar()self.c1 = Checkbutton(self,onvalue=1, offvalue=0, variable=self.choose1,text='看电视')self.c1.pack(side=LEFT)self.choose2 = IntVar()self.c2 = Checkbutton(self,onvalue=1, offvalue=0, variable=self.choose2,text='读书')self.c2.pack(side=LEFT)Button(self,text='确定',command=self.btnclick).pack(side=LEFT)def btnclick(self):messagebox.showinfo('0',self.choose1.get()+self.choose2.get()) 这里应该是判断选中状态然后给出不同的结果if __name__ == '__main__':t1 = Tk()t1.geometry("400x200+500+200")app = MainApp(t1)t1.mainloop()
canvas画布
import webbrowser
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):self.c1 = Canvas(self,width=300, height=200,bg='#fff') 创建画布self.c1.pack()self.c1.create_line(10,10,30,20) 两个参数为一个坐标,连点成线self.c1.create_rectangle(60,60,100,100,fill='blue') 两个参数为一个坐标,两个坐标确定一个矩形# self.c1.create_rectangle([(60,60),(100,90)],fill='blue')self.c1.create_oval(60,60,100,80,fill='red')以两组坐标画矩形的内切圆,如果是正方形,就是圆,如果不是正方形,就是椭圆global photophoto = PhotoImage(file='./123.gif')self.c1.create_image(350,220,image=photo) 需要两个参数确定图片插入的左上角的位置if __name__ == '__main__':t1 = Tk()t1.geometry("400x200+500+200")app = MainApp(t1)t1.mainloop()
在画圆或者画直线的时候,那些坐标可以是列表元组的形式传递给控件。
布局
-
pack 水平或垂直排列
- side 参数:top默认,bottom,left,right。停留在父组件的边上
- after 先创建父类组件,最后创建本组件
- anchor 对齐方式
- before 先创建本组件,再创建父类组件
- fill x(y) 填充坐标的空间。side选上下就填充左右,side选左右就填充上下
- expand 值为yes,side无效。fill=both,填充父组件
- ipadx,ipady,padx,pady
-
grid 表格
- column列数
- row行数
- columnspan跨列
- rowspan跨行
- ipadx,ipady 子组件之间的间隔 默认0.0
- padx,pady 并列组件之间的间隔,默认0.0
- sticky 组件去紧贴单元格一角,n,s,w,e,nw,sw,se,ne,center默认,如果选上下就是竖直方向拉长
-
place 位置/像素级别
- x,y 相对于窗口左上角的绝对值坐标
- relx,rely 相对于父容器左上角坐标,relx=0是最左边,1是最右边
- relwidth,relheight 相对父容器宽度和高度
- anchor,width,height
import webbrowser
from tkinter import *
from tkinter import messageboxclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):Entry(self).grid(row=0, column=0,columnspan=4,pady=5)sign=((7,8,9,'/'),(4,5,6,'*'),(1,2,3,'-'),(0,'.','+','=')) 把计算机按钮写成元组for rd,r in enumerate(sign):for cd,c in enumerate(r): 双层嵌套循环遍历,生成按钮Button(self,text=c).grid(row=rd+1,column=cd,sticky='ew')if __name__ == '__main__':t1 = Tk()t1.geometry("170x160+500+200")t1.title('计算器')app = MainApp(t1)t1.mainloop()
winfo_x,winfo_y,winfo_geometry
lambda表达式传参,解决command无法传参的问题
因为command绑定函数的时候不能传参。比如command=add
但是我们还想传参,就需要使用lambda表达式传参。比如,command=lambda: add(1,2)
事件绑定机制
- 组件绑定
- command,不需要event对象
- bind 需要获取event对象,只能是单个组件
- 组件类绑定
- bind_class(‘Button’,‘<>Button-1’,func) 给所有按钮绑定事件使用
Optionmenu选项菜单–下拉式选项
也是使用stringvar获取最后的选中值
使用set设置默认值
scale移动滑块按钮
就是拖动改变值
from是最小值
to是最大值
length是整个可以拖动区域的宽度
tickinterval 标记,就是刻度显示,后面写3,间隔就是3,每隔3标记一次
orient是移动的方向,有水平(HORIZONTAL)和垂直两个选项,默认垂直
每一次拖动都去执行command方法
颜色选择框askcolor
直接使用askcolor就可以调出选择颜色的框
color参数是我们默认给它初始化的颜色
title是我们调出颜色框的窗口名称
返回的是一个元组类型 ((red,green,blue).‘十六进制的颜色代码’) 里面的那个元组是rgb的值。后面跟一个十六进制颜色代码
文件对话框
- askopenfilename 返回文件名/绝对路径
- askopenfilenames 返回文件名列表
- askopenfiles 返回文件对象,就像open方法一样,是一个文件对象,我们可以进行read操作。
- with askopenfile( ) as f: f.read()
- askopenfiles 返回文件对象列表
- askdirectory 返回目录名
- asksaveasfile 返回保存的文件
- asksaveasfilename 返回保存的文件路径,没有实际新建文件,需要搭配open方法,才能新建
常见参数
- defaultextension 默认后缀名
- filetypes 文件显示过滤,比如你想让用户传照片,就把照片的后缀写进去,只显示图片文件
- 第一个参数我们告知用户类型的名称,比如图片、视频
- 第二个参数是我们规定的文件后缀,比如".mp4"
- initialdir 初始目录,就是用户选择文件的时候,打开的目录,比如“f:”就会默认打开f盘
- initialfile 初始文件
- parent 父窗口
- title 窗口标题
简单输入框simpledialog
就是给用户去输入的,然后能得到返回值
需要导入from tkinter.simpledialog import *
- askfloat 返回浮点数
- askinteger 返回整数
- askstring 返回字符串
title是窗口标题
prompt是提示信息
initialvalue 初始值
minvalue 最小值
maxvalue最大值
通用消息框messagebox
点击确定返回ok
- askokcancel 给用户的按钮是:确定/取消
- askquestion 给用户的按钮是:是/否
- askretrycancel给用户的按钮是:重试/取消
- showerror错误提示框,只能点确定
- showinfo 消息框,给用户显示一段文本,只有确定
- showwarning 警告消息框
常用的参数:
title窗口标题
message文本内容
ttk模块 - tkinter的现代版
tkinter太丑了,一般不用,大部分使用的是pyqt和wxpython
功能相对也少,不用。
菜单栏-菜单-右键菜单(上下文菜单)
菜单栏里面放一堆菜单选项
菜单选项还能再打开选择菜单
-
menu创建主菜单栏/子菜单
-
add_cascade 添加控件和菜单到主菜单栏
-
add_command 添加菜单的选项
- 参数accelerator可以写快捷键
-
add_separator 添加分割线 对不同选择进行分隔的提示
最后需要把主菜单栏交给窗口,tk1[‘menu’]=menubar 后面是我们编辑好的菜单栏,tk1是我们的窗口
右键菜单,官方名称是上下文菜单,就是鼠标在任意地方右键出来的那个菜单
步骤:
- 对根窗口进行bind事件绑定,绑定的就是鼠标右键,然后设计绑定事件
- 绑定的事件就是,在右键座标处,使用post显示菜单,参数就是坐标
- 快捷键事件绑定accelerator
- accelerator是给菜单选项显示的快捷键方式,只是显示,但是不能调用
- 需要使用bind方法,把根窗口绑定按钮,比如,tk1.bind(‘<Control-n>’,lambda event:self.newfile())
- 因为类方法都需要传参,而command无法传参,只能使用lambda表达式了
记事本项目
from tkinter import *
from tkinter.colorchooser import askcolor
from tkinter.filedialog import askopenfilename, asksaveasfilename
from tkinter.messagebox import showerror, showwarning
from tkinter.simpledialog import askintegerclass MainApp(Frame):def __init__(self, master=None):super().__init__(master)self.master = masterself.pack()self.creatapp()def creatapp(self):# 主菜单mcaidan = Menu(self.master)# 子菜单filecaidan = Menu()self.bianjicaidan = Menu() # 上下文菜单optioncaidan = Menu()# 菜单选项filecaidan.add_command(label='新建',command=self.newfile,accelerator='ctrl+n')filecaidan.add_command(label='打开',command=self.openfile,accelerator='ctrl+m')filecaidan.add_command(label='保存',command=self.closefile,accelerator='ctrl+s')filecaidan.add_separator()filecaidan.add_command(label='退出',command=t1.quit)self.bianjicaidan.add_command(label='复制')self.bianjicaidan.add_command(label='粘贴')optioncaidan.add_command(label='背景颜色',command=self.bgcolor)optioncaidan.add_command(label='字体大小',command=self.daxiao)# 子菜单加入主菜单mcaidan.add_cascade(label='文件', menu=filecaidan)mcaidan.add_cascade(label='设置', menu=optioncaidan)t1['menu'] = mcaidanself.texttable = Text(self)self.texttable.pack()self.texttable.bind("<Button-3>", self.bianji)t1.bind('<Control-n>',lambda event: self.newfile())t1.bind('<Control-m>',lambda event: self.openfile())t1.bind('<Control-s>',lambda event: self.closefile())def daxiao(self):try:size = askinteger(title='字体大小',maxvalue=25,minvalue=5,prompt='选择字体大小5~25')self.texttable.config(font=('宋体', size))except:showwarning(message='没有选择字体大小')def bgcolor(self):self.texttable.config(bg=(askcolor()[1]))def bianji(self,event):self.bianjicaidan.post(event.x_root, event.y_root)def openfile(self):self.texttable.delete('1.0', END)self.fm = askopenfilename(filetypes=[('文本内容','*.txt')],title='选择文本文件') # 过滤文件try:with open(self.fm) as f:self.texttable.insert('1.0', f.read())except:showerror(title='出错了!',message='打开文件失败了')def closefile(self):tt = self.texttable.get('1.0', END)try:with open(self.fm, 'w') as f:f.write(tt)except:showwarning(title='保存出错',message='没有新建文件,无法保存!')def newfile(self):try:self.fm = asksaveasfilename(title='新建文件', defaultextension='.txt', initialfile='新建文本',filetypes=[('文本文件', '.txt')])self.closefile()except:showwarning(message='没有新建文件!')if __name__ == '__main__':t1 = Tk()t1.geometry("570x350+300+200")t1.title('记事本')app = MainApp(t1)t1.mainloop()
- 以定义类的方式,初始化项目
- 增加菜单栏功能
- 子菜单
- 快捷键绑定
- 对可能出错的地方进行异常捕获
坦克大战pygame
- 对象:
- 子弹
- 飞行
- 轨迹
- 坦克
- 射击
- 移动
- 墙壁
- 存在
- 打破
- 爆炸效果
- 音效
- 背景音乐
- 爆炸
主窗口
import pygame# 窗口大小
WINDOW_HEIGHT = 600
WINDOW_WIDTH = 800class MyGame():def __init__(self):pygame.display.init()pygame.display.set_mode((WINDOW_WIDTH, WINDOW_HEIGHT)) 主窗口大小pygame.display.set_caption('坦克世界') 标题MyGame.window.fill((0, 0, 0)) # 设置背景颜色def main(self):while True:pygame.display.update()if __name__ == '__main__':playgame = MyGame()playgame.main()
事件处理
def main(self):while True:self.dispose()pygame.display.update()# 处理事件
def dispose(self):for event in pygame.event.get():# 遍历所有接收到的事件if event.type == pygame.QUIT: # 事件是退出pygame.quit() # 退出 Pygamesys.exit() # 退出程序if event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:print('left')if event.key == pygame.K_RIGHT:print('right')if event.key == pygame.K_UP:print('up')if event.key == pygame.K_DOWN:print('down')
添加文字内容
- 初始化字体 pygame.font.init
- 找系统支持的字体 pygame.font.get_fonts
- 创建字体 pygame.font.SysFont(‘字体’,大小)
- 得到字体对象 拿到上一步的返回值,使用render(text=‘文本内容’,color=‘字体颜色’,antialias=布尔值/抗锯齿 )f方法
- 文字填充到主窗口 blit(文字对象,(坐标))
加载图片
- pygame.image.load 从文件里面加载图片
- get_rect 把图片放入相应的位置
- 使用blit(图片对象,坐标)放进去 和文字的处理一样
都是把图片/文字转换成Surface对象,然后再使用blit放进去
相关文章:
python全栈-python进阶
python进阶 文章目录 python进阶异常except自定义异常类 文件操作序列化和反序列化CSV文件os模块os.path模块shutil模块 拷贝压缩 模块--modulefrom 模块 import 成员包package库LibraryPIP库 GUI编程-tkinter版使用类定义的GUI界面设置控件的属性方式Label标签的常用属性Butto…...
SpringBoot如何配置开发环境(JDK、Maven、IDEA等)
目录 1. 安装JDK 一、JDK介绍JRE(Java Runtime Envirnment):Java运行环境 二、下载JDK官网地址:Java Downloads | Oracle 三、安装JDK点击下载下来的安装包进行安装 四、配置JDK进入到环境变量中(下面介绍两种进入…...
图片粘贴上传实现
图片上传 html demo 直接粘贴本地运行查看效果即可,有看不懂的直接喂给 deepseek 会解释的很清晰 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"…...
C++--STL库-List
目录 1.list 的基本使用 1.1 创建和初始化 1.2. 插入元素 1.3. 删除元素 1.4. 访问元素 1.5 遍历 1.6 总结 list是C标准库(STL)中的双向链表容器,属于<list>头文件。 它的特点是: 动态大小:可以随时插入…...
kubeadm拉起的k8s集群证书过期的做法集群已奔溃也可以解决
kubeadm拉起的k8s集群证书过期的做法 这个是很久之前遇到的了,今天有空(心血来潮)就都回忆回忆写在这里为爱发光,部分内容来自arch先生(死党)的帮助。有时候有很多部门提了建k8s的需求,有些是临…...
idea连接gitee(使用idea远程兼容gitee)
文章目录 先登录你的gitee拿到你的邮箱找到idea的设置选择密码方式登录填写你的邮箱和密码登录成功 先登录你的gitee拿到你的邮箱 具体位置在gitee–>设置–>邮箱管理 找到idea的设置 选择密码方式登录 填写你的邮箱和密码 登录成功...
Kafka 简介
Kafka 简介 Apache Kafka 是一个开源的分布式流处理平台,广泛应用于实时数据流处理、日志管理、消息传递等场景。Kafka 最初由 LinkedIn 开发,并于 2011 年捐献给 Apache 软件基金会。 Kafka 的设计目标是高吞吐量、低延迟和高可用性,它能够…...
Ubuntu22.04 Deepseek-R1本地容器化部署/内网穿透/OPENWEBUI,打造个人AI助手!
1. 前言 本地部署DeepSeek并实现内网穿透,为家庭成员提供强大的AI支持。通过使用Ollama、Docker、OpenWebUI和Nginx,内网穿透,我们可以轻松实现快速响应和实时搜索功能。 2.软硬件环境 系统:ubuntu22.04, cuda12GPU: RTX3080Ti …...
红蓝对抗之常见网络安全事件研判、了解网络安全设备、Webshell入侵检测
文章目录 研判(入侵检测) 设备 经典网络云网络 异常HTTP请求Webshell分析 Webshell 的分类Webshell 的检测 主机层面流量层面 附录 常见端口漏洞…...
Linux部署DeepSeek r1 模型训练
之前写过一篇windows下部署deepseekR1的文章,有小伙伴反馈提供一篇linux下部署DeepSeek r1 模型训练教程,在 Linux 环境下,我找了足够的相关资料,花费了一些时间,我成功部署了 DeepSeek R1 模型训练任务,结…...
【大模型】DeepSeek:AI浪潮中的破局者
【大模型】DeepSeek:AI浪潮中的破局者 引言:AI 新时代的弄潮儿DeepSeek:横空出世展锋芒(一)诞生背景与发展历程(二)全球影响力初显 探秘 DeepSeek 的技术内核(一)独特的模…...
寒假学习总结
整个寒假都走在数据结构与算法的路上,深入学习了其中多个板块,刷了一些与之对应的题目,下面来一期总结(c) (emmm,主播在寒假试着去学习了几大语言的语法基础(丢丢) 如Ja…...
自愈网络的定义、其为用户带来的益处、具体的使用案例
在当今高度互联的世界中,网络稳定性和可靠性对于各种应用场景至关重要。无论是企业的日常运营、智能家居的便捷控制,还是工业网络的自动化管理,网络的任何中断都可能带来不可估量的损失和不便。正是基于这种需求,以太联—Intellin…...
NumPy的基本使用
在 Python 的数据科学与数值计算领域,NumPy 无疑是一颗耀眼的明星。作为 Python 中用于科学计算的基础库,NumPy 提供了高效的多维数组对象以及处理这些数组的各种工具。本文将带您深入了解 NumPy 的基本使用,感受它的强大魅力。 一、安装与导…...
HTTP 与 HTTPS:协议详解与对比
文章目录 概要 一. HTTP 协议 1.1 概述 1.2 工作原理 1.3 请求方法 1.4 状态码 二. HTTPS 协议 2.1 概述 2.2 工作原理 2.3 SSL/TLS 协议 2.4 证书 三. HTTP 与 HTTPS 的区别 四. 应用场景 4.1 HTTP 的应用场景 4.2 HTTPS 的应用场景 概要 HTTP(Hy…...
从零开始构建一个语言模型中vocab_size(词汇表大小)的设定规则
从零开始构建一个语言模型就要设计一个模型框架,其中要配置很多参数。在自然语言处理任务中,vocab_size(词汇表大小) 的设定是模型设计的关键参数之一,它直接影响模型的输入输出结构、计算效率和内存消耗。 本文是在我前文的基础上讲解的:从零开始构建一个小型字符级语言…...
斐波那契数列模型:在动态规划的丝绸之路上追寻斐波那契的足迹(上)
文章目录 引言递归与动态规划的对比递归解法的初探动态规划的优雅与高效自顶向下的记忆化搜索自底向上的迭代法 性能分析与比较小结 引言 斐波那契数列,这一数列如同一条无形的丝线,穿越千年时光,悄然延续其魅力。其定义简单而优美ÿ…...
RT-Thread+STM32L475VET6——ADC采集电压
文章目录 前言一、板载资源二、具体步骤1.打开CubeMX进行配置1.1 使用外部高速时钟,并修改时钟树1.2 打开ADC1的通道3,并配置为连续采集模式(ADC根据自己需求调整)1.3 打开串口1.4 生成工程 2. 配置ADC2.1 打开ADC驱动2.2 声明ADC2.3 剪切stm…...
基于Django快递物流管理可视化分析系统(完整系统源码+数据库+详细开发文档+万字详细论文+答辩PPT+详细部署教程等资料)
文章目录 基于Django快递物流管理可视化分析系统(完整系统源码数据库详细开发文档万字详细论文答辩PPT详细部署教程等资料)一、项目概述二、项目说明三、研究意义四、系统设计技术架构 五、功能实现六、完整系统源码数据库详细开发文档万字详细论文答辩P…...
【Pandas】pandas Series reindex_like
Pandas2.2 Series Computations descriptive stats 方法描述Series.align(other[, join, axis, level, …])用于将两个 Series 对齐,使其具有相同的索引Series.case_when(caselist)用于根据条件列表对 Series 中的元素进行条件判断并返回相应的值Series.drop([lab…...
Ollama安装和迁移,以及部署DeepSeek模型
什么是 Ollama Ollama 是大语言模型管理工具,它的主要作用是简化大语言模型的本地化部署和运行。如果你想调用本地模型,保护个人隐私,构建个人知识库,那你可以考虑使用 Ollama。 Ollama 的官网是 https://ollama.com/,正如官网所说,“Get up and running with large l…...
【数据挖掘】
数据挖掘 目录:1. 数据转换2. 属性选择3. 独立于方案的选择4. 探索空间5. 具体方案的选择6. 离散化数值属性无监督离散化基于熵的离散化其他离散化方法 k-means算法原理算法步骤优缺点优点缺点 代码示例(使用Python和scikit-learn库)代码解释…...
芝加哥学派(Chicago School):金融与经济学的创新力量(中英双语)
芝加哥学派:金融与经济学的创新力量 在经济学和金融学的历史上,有一个学派的影响力不容忽视,那就是芝加哥学派(Chicago School)。芝加哥学派不仅在学术界广受推崇,也深刻影响了全球的经济政策和金融市场。…...
web入侵实战分析-常见web攻击类应急处置实验1
场景说明: 某天运维人员发现在/opt/tomcat8/webapps/test/目录下,多出了一个index_bak.jsp这个文件, 并告诉你如下信息 操作系统:ubuntu-16.04业务:测试站点中间件:tomcat开放端口:22&#x…...
.NET SixLabors.ImageSharp v1.0 图像实用程序控制台示例
使用 C# 控制台应用程序示例在 Windows、Linux 和 MacOS 机器上处理图像,包括创建散点图和直方图,以及根据需要旋转图像以便正确显示。 这个小型实用程序库需要将 NuGet SixLabors.ImageSharp包(版本 1.0.4)添加到.NET Core 3.1/ …...
基于ffmpeg+openGL ES实现的视频编辑工具-字幕添加(六)
在视频编辑领域,字幕的添加是一项极为重要的功能,它能够极大地丰富视频内容,提升观众的观看体验。当我们深入探究如何实现这一功能时,FreeType 开源库成为了强大助力。本文将详细阐述借助 FreeType 库生成字幕数据的过程,以及如何实现字幕的缩放、移动、旋转、颜色修改、对…...
SpringMVC新版本踩坑[已解决]
问题: 在使用最新版本springMVC做项目部署时,浏览器反复500,如下图: 异常描述: 类型异常报告 消息Request processing failed: java.lang.IllegalArgumentException: Name for argument of type [int] not specifie…...
【科研绘图系列】R语言绘制SCI论文图合集
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载Load dataFigure 1Fig 1B: functional assays adhensionFIG 1C: Functional assays OPK Figure 2Fig 2C: Settings and function fo…...
间隔连续问题
间隔连续问题 1. 数据结构:某游戏公司记录的用户每日登录数据 表名:game_user 字段名:id(用户id)、dt(日期) 2. 需求: ① 创建表 ② 计算每个用户最大的连续登录天数,…...
3月营销日历:开启春日盛宴,绽放生活魅力
关键营销节点∶惊蛰、女生节、妇女节、 植树节、315消费者权益日、春分 营销关键词 养生、女生魅力、感恩女性、环保、品质 01.重点关注品类 春季服饰:如轻薄外套、春装等,适合惊蛰后的市场需求; 美妆护肤:妇女节期间…...
网络工程师 (48)传输层概述
前言 传输层(Transport Layer)是计算机网络体系结构中的关键层次之一,主要负责在源端和目的端之间提供端到端的数据传输服务。 一、位置与功能 传输层位于OSI(开放系统互连)参考模型的第四层,介于网络层和应…...
字符串函数和结构题内存对齐
图下为函数使用: #include <ctype.h>int main() {int ret isdigit(Q);printf("%d\n", ret);return 0; }int main() {printf("%c\n", toupper(a));printf("%c\n", tolower(A));return 0; }...
同花顺C++面试题及参考答案
对 C 和 C++ 哪个更熟悉? 在编程语言的学习与实践中,我对 C++ 更为熟悉。C 语言作为一门经典的编程语言,以其高效、灵活和接近硬件的特性,在系统编程、嵌入式开发等领域占据着重要地位。它提供了丰富的底层操作能力,如指针操作、内存管理等,为开发者直接控制计算机资源提…...
Python JSON的深度解析:从基础到应用
Python JSON的深度解析:从基础到应用 flyfish 什么是JSON? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式。它基于一个子集的JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999…...
创建三个节点
1. 节点克隆 根据教程Hadoop编译安装-CSDN博客将一台机器的hadoop的环境搭建好。 在虚拟机的列表中选中一台机器,右键—>管理—>克隆 填好【虚拟机名称】,选择本地存储位置,点击完成,就节点克隆完成了。 2. 修改IP地址 编…...
滤波器 | 原理 / 分类 / 特征指标 / 设计
注:本文为 “滤波器” 相关文章合辑。 未整理去重。 浅谈滤波器之 —— 啥是滤波器 原创 RF 小木匠 射频学堂 2020 年 03 月 25 日 07:46 滤波器,顾名思义,就是对信号进行选择性过滤,对不需要的信号进行有效滤除。按照其传输信…...
Flutter - 初体验
项目文件目录结构介绍 注:创建 Flutter 项目名称不要包含特殊字符,不要使用驼峰标识 // TODO 开发中运行一个 Flutter 三种启动方式 Run 冷启动从零开始启动Hot Reload 热重载执行 build 方法Hot Restart 热重启重新运行整个 APP 先看效果,…...
OSPF(开放路径最短优先)
ospf优先级:内部优先级默认为10,外部优先级默认为150 1.ospf的三张表 (1)邻居表 <记录邻居状态和关系> (2)拓扑表 <链路状态数据库> (3)路由表 <对链路状态数据库进…...
SpringBoot 排除一些包的注入
文章目录 需求一、使用 ComponentScan 需求 在系统迭代的过程中,有一些 Controller 大批量的不再使用,或者有一些接口我们不想再提供给外界 一、使用 ComponentScan SpringBootApplication(scanBasePackages "com.zrb.excludeSomePkg") Comp…...
【Python爬虫(21)】从0到1:Python与MySQL的深度融合
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
数据结构-----双向链表
一、双向循环列表 head.h #ifndef __head_h__ #define __head_h__ #include <stdio.h> #include <string.h>…...
idea 无法下载源码
作为一个程序猿,难免会跟源码打交道,可是在下载源码有时候,会提示找不到对象,这是什么原因呢?今天我们来解决这个问题。 问题:idea无法下载源码 Cannot download sources Sources not found for:org.sprin…...
计算机网络-OSI七层参考模型与数据封装,网络安全零基础入门到精通实战教程!
目录 一、网络 1、网络的定义 2、网络的分类 3、网络的作用 4、网络的数据传输方式 5、网络的数据通讯方式 二、OSI七层参考模型 1、网络参考模型定义 2、分层的意义 3、分层与功能 4、TCP\IP五层模型 三、参考模型的协议 1、物理层 2、数据链路层 3、网络层 4…...
洛谷 P2234 [HNOI2002] 营业额统计(详解)c++
题目链接:P2234 [HNOI2002] 营业额统计 - 洛谷 1.题目分析 输入输出样例:根据题目知第一天的最小波动值为第一天的营业额,所以第一天的最小波动值是5,算出第二天的最小波动值就说拿前面的数分别减当前的数,并且取一个…...
Go日期时间处理工具Carbon
**注意:**本文大部分内容摘抄自-https://github.com/dromara/carbon/blob/master/README.cn.md使用文档 一、简介 一个轻量级的、易于使用的、语义智能的日期时间处理库,支持链式调用,已被 awesome-go 收录,现已经捐赠给了 drom…...
【Bert】自然语言(Language Model)入门之---Bert
every blog every motto: Although the world is full of suffering, it is full also of the overcoming of it 0. 前言 对bert进行梳理 论文: BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 时间:…...
鸿蒙NEXT开发-网络管理
注意:博主有个鸿蒙专栏,里面从上到下有关于鸿蒙next的教学文档,大家感兴趣可以学习下 如果大家觉得博主文章写的好的话,可以点下关注,博主会一直更新鸿蒙next相关知识 目录 1. 网络管理-应用权限 1.1 概述 1.2 配…...
ceph HEALTH_WARN clock skew detected on mon.f, mon.o, mon.p, mon.q
问题 ceph health detail[WRN] MON_CLOCK_SKEW: clock skew detected on mon.f, mon.o, mon.p, mon.qmon.f clock skew 0.243128s > max 0.05s (latency 0.000836159s)mon.o clock skew 16.249s > max 0.05s (latency 0<...
Web开发技术概述
Web开发技术涵盖了前端和后端开发,以及数据库技术。前端开发包括使用HTML、CSS、JavaScript等原生技术,以及jQuery、Bootstrap、AngularJS、React、Vue等框架。后端开发则涉及ASP.NET、PHP、Python Web(Flask、Django)、Java Web&…...
级联选择器多选动态加载
一.级联展示 注:因为级联选择器这里是动态加载,因此如果上来选中一级就需要加载出后面三级的全部数据,依然会很卡,因此,和产品协商把一二级多选框去掉了,这样也避免了你选择一级不能实现子级被全部选中的问…...