快速进展条工具库tqdm
用 tqdm(iterable)包装任何 iterable, 让循环显示一个智能进度条。
tqdm 是一个 Python 快速、可扩展的进度条工具库,它有很多优点:
- 易于使用:只需在 Python 循环中包裹你的迭代器,一行代码就能产生一个精美的进度条。
- 灵活:它可以和 for 循环、pandas dataframe的 apply 函数以及 Python 的 map 函数等等配合使用。
- 高效:tqdm 使用了智能算法,即使在数据流非常快的情况下,也不会拖慢你的代码速度。
iterable=None,可迭代对象。
desc=None,传入str类型,作为进度条标题。
total=None,预期的迭代次数。一般不填,默认为iterable的长度。
leave=True,迭代结束时,是否保留最终的进度条。默认保留。
file=None,输出指向位置,默认是终端,一般不需要设置。
ncols=None,可以自定义进度条的总长度。
unit,描述处理项目的文字,默认’it’,即100it/s;处理照片设置为’img’,则为100img/s。
postfix,以字典形式传入详细信息,将显示在进度条中。
unit_scale,自动根据国际标准进行项目处理速度单位的换算。
循环过程中输出额外内容
.set_postfix
方法
with trange(100, desc='Test') as tbar:
for i in range(100):
tbar.set_postfix(loss=i/100, x=i)
tbar.update()
time.sleep(0.2)
.write方法
for i in tqdm(range(5), desc='Test'):
tqdm.write('loss={},x={}'.format(i/100, i))
time.sleep(0.5)
需使用终端运行代码,其他方法会出现格式问题。
pycharm命令终端中,使用cd命令切换到python文件所在的目录。使用 python XX.py 运行所需文件。
if __name__ == "__main__"
Python程序的两种执行方式:作为主程序运行和作为模块导入运行。if __name__ == "__main__"
的作用是在不同的执行方式下执行不同的代码块。
具体来说,它允许指定哪些代码应仅在脚本作为主程序运行时执行,而不应在脚本被导入为模块时执行。这是通过检查__name__
变量的值来实现的。
作为主程序运行
当一个Python脚本被直接执行时,它被视为主程序。这是通过在终端或命令提示符中运行脚本文件来实现的。主程序通常包含了脚本的入口点和执行逻辑。__name__
变量的值是"__main__"
。因此,if __name__ == "__main__"
下的代码块将被执行,使脚本能够独立运行并执行特定任务。
作为模块导入运行
Python的一个强大之处是模块化编程。可以将一个Python脚本编写成一个模块,然后在其他脚本中导入并重复使用。当脚本被导入为模块时,Python解释器会执行模块中的代码,但不会执行模块的主程序逻辑。__name__
变量的值不是"__main__"
,而是模块的名称。因此,if __name__ == "__main__"
下的代码块不会被执行,从而避免不必要的操作。这使得脚本的功能可以在其他程序中重复利用。
功用
1 完成模块初始化。
2.测试和调试,在许多项目中,会编写用于测试和调试的代码。这些代码通常不应在模块被导入时执行。
GUI编程(tkinter)
Button | 按钮控件;在程序中显示按钮。 |
Canvas | 画布控件;显示图形元素如线条或文本 |
Checkbutton | 多选框控件;用于在程序中提供多项选择框 |
Entry | 输入控件;用于显示简单的文本内容 |
Frame | 框架控件;在屏幕上显示一个矩形区域,多用来作为容器 |
Label | 标签控件;可以显示文本和位图 |
Listbox | 列表框控件;在Listbox窗口小部件是用来显示一个字符串列表给用户 |
Menubutton | 菜单按钮控件,用于显示菜单项。 |
Menu | 菜单控件;显示菜单栏,下拉菜单和弹出菜单 |
Message | 消息控件;用来显示多行文本,与label比较类似 |
Radiobutton | 单选按钮控件;显示一个单选的按钮状态 |
Scale | 范围控件;显示一个数值刻度,为输出限定范围的数字区间 |
Scrollbar | 滚动条控件,当内容超过可视化区域时使用,如列表框。. |
Text | 文本控件;用于显示多行文本 |
Toplevel | 容器控件;用来提供一个单独的对话框,和Frame比较类似 |
Spinbox | 输入控件;与Entry类似,但是可以指定输入范围值 |
PanedWindow | PanedWindow是一个窗口布局管理的插件,可以包含一个或者多个子控件。 |
LabelFrame | labelframe 是一个简单的容器控件。常用于复杂的窗口布局。 |
tkMessageBox | 用于显示你应用程序的消息框。 |
tkinter的坐标系与颜色格式
以左上角为起点,x轴向右延伸,y轴向下延伸。在窗口中,容器的左上角是(0, 0),不包括窗口的标题栏和菜单栏。
两种表示颜色的方式:一种是颜色的名称,比如"green", "brown";另一种是颜色的十六进制形式,比如"#00ffff"。
tkinter不支持颜色RGB元组形式,不过可以把它转换成十六进制形式。
这种十六进制形式相当于:"#"+R的十六进制+G的十六进制+B的十六进制。
比如(255, 255, 255)是纯白,转换成十六进制形式就变成了#ffffff。
tkinter也有一种特殊的颜色名称,叫做SystemButtonFace,是一种浅灰色,是组件的默认背景颜色。
创建主窗口
import tkinter as tk
#创建一个窗口,因为后面还要用到所以用window这个变量来赋值,可以自行更改
window = tk.Tk()
#必须一直更新窗口,不然会未响应,如果要自行更新,可以用window.update()
window.mainloop()
修改窗口标题 (注意:一定要加双引号哦~)
window.title("第一个tkinter小程序")
调整窗口大小和尺寸(注意:一定要加双引号,X坐标和Y坐标选填)
geometry(“窗口宽度x窗口高度+X坐标+Y坐标”)
window.geometry("750x200+-10+0")
锁定窗口大小
参数一:x轴,参数二:y轴。
# 锁定宽度
window.resizable(False, True)
# 锁定高度
window.resizable(True, False)
# 锁定全部
window.resizable(False, False)
设置标题栏图标
window.iconbitmap(False, "icon.ico")
(记得转换成ico格式,下载下来的还是png格式,记得转换为ico格式)如果default
为True,这也将应用于将来创建的所有顶级。
window.iconphoto(True, tkinter.PhotoImage(file = 'hometown.png'))
Label 标签控件
创建label
# 指定master,即摆放组件的父容器
lab = tk.Label(window, text='你好!this is Tkinter', bg='green', font=('Arial', 12), width=30, height=2)
# 将定义的Label摆放到父容器上面。所有的组件都需要在定义后摆放到窗口上,不然无法显示
lab.pack()
设置边框样式
默认flat, 可选:sunken, raised, groove, riged, solid
lab = tk.Label(window, text='你好!this is Tkinter', relief="solid")
lab.pack()
设置鼠标移动到组件上的样式
import tkinter as tk
# 所有的光标样式
cursorList = ['arrow', 'xterm', 'watch', 'hand2', 'question_arrow', 'sb_h_double_arrow',
'sb_v_double_arrow', 'fleur','crosshair', 'based_arrow_down', 'based_arrow_up',
'boat', 'bogosity', 'top_left_corner','top_right_corner', 'bottom_left_corner',
'bottom_right_corner', 'top_side', 'bottom_side', 'top_tee','bottom_tee',
'box_spiral', 'center_ptr', 'circle', 'clock', 'coffee_mug', 'cross', 'cross_reverse',
'diamond_cross', 'dot', 'dotbox', 'double_arrow', 'top_left_arrow', 'draft_small',
'draft_large','left_ptr', 'right_ptr', 'draped_box', 'exchange', 'gobbler',
'gumby', 'hand1', 'heart', 'icon','iron_cross', 'left_side', 'right_side',
'left_tee', 'right_tee', 'leftbutton', 'middlebutton','rightbutton', 'll_angle',
'lr_angle', 'man', 'mouse', 'pencil', 'pirate', 'plus', 'rtl_logo', 'sailboat',
'sb_left_arrow', 'sb_right_arrow', 'sb_up_arrow', 'sb_down_arrow', 'shuttle',
'sizing', 'spider','spraycan', 'star', 'target', 'tcross', 'trek', 'ul_angle',
'umbrella', 'ur_angle', 'X_cursor']
# 创建一个窗口,因为后面还要用到所以用window这个变量来赋值,可以自行更改
window = tk.Tk()
window.title("我的第一个tkinter小程序")
window.geometry("550x550+-10+0")
for i in range(len(cursorList)):
cursor = cursorList[i]
tk.Label(window,text=cursor, cursor=cursor, relief="groove").grid(
column=i // 20, row=i % 20, sticky="we") # 后面会讲到grid,是一种排放组件方式
# 必须一直更新窗口,不然会未响应,如果要自行更新,可以用window.update()
window.mainloop()
设置文本字体
lab = tk.Label(window, text='叠加使用', font=("黑体", 20, "bold", "italic", "underline", "overstrike"),
relief="solid", cursor="star")
lab.pack()
添加内置图标
import tkinter as tk
# 创建一个窗口,因为后面还要用到所以用window这个变量来赋值,可以自行更改
window = tk.Tk()
window.title("我的第一个tkinter小程序")
window.geometry("550x550+-10+0")
bitmaps = ["error", "info", "hourglass", "questhead", "question", "warning",
"gray12", "gray25", "gray50", "gray75"]
for bitmap in bitmaps:
tk.Label(window, text=bitmap, bitmap=bitmap, compound="left").pack()
# 必须一直更新窗口,不然会未响应,如果要自行更新,可以用window.update()
window.mainloop()
添加图片
这个图片是一个tk.PhotoImage对象,支持的格式只有*.gif, *.ppm, *.pgm,较新版的tk支持显示*.png。
在使用tkinter.PhotoImage的时候,需要指定file="文件名"这个关键字参数。
要保证储存PhotoImage图片对象变量不会被Python垃圾回收机制删除(这意味着不能设置成局部变量),否则图片无法正确显示。
image = tkinter.PhotoImage(file="图片名称")
tk.Label(root, image=image, text="It's a monster.", compound="top").pack()
如果想要显示更多的图片文件格式,比如*.jpg该怎么办呢?这时候需要使用pillow工具。这是一个第三方模块,需要用pip安装:pip install pillow,导入时import PIL。
from PIL import Image, ImageTk
image = ImageTk.PhotoImage(Image.open("monster.png"))
tkinter也有一些内部的图片,可以通过字符串传递给image。
包括:"::tk::icons::error","::tk::icons::information","::tk::icons::question","::tk::icons::warning"。
import tkinter as tk
window = tk.Tk()
window.title("我的第一个tkinter小程序")
window.geometry("550x550+-10+0")
for image in ["::tk::icons::error",
"::tk::icons::information",
"::tk::icons::question",
"::tk::icons::warning"]:
tk.Label(window, text=image, image=image, compound="left").pack()
window.mainloop()
显示变量
kinter提供了一些变量对象,可以绑定到组件,可以设置它们的值。绑定的组件会随着设置而刷新。这些对象有StringVar()文本变量,IntVar()整数变量,DoubleVar()浮点数变量,BooleanVar()布尔值变量。
import tkinter as tk
window = tk.Tk()
window.title("我的第一个tkinter小程序")
window.geometry("550x550+-10+0")
var = tk.StringVar()
lab = tk.Label(window, textvariable=var, relief="groove",
font=("黑体", 20, "bold", "italic", "underline", "overstrike"))
lab.pack()
# 设置变量的值
var.set('1234')
# 获取变量的值
sth = var.get()
print(sth)
window.mainloop()
Bution 按钮控件
Button的参数和Label基本类似,也支持text, image, bitmap等功能。Button也有relief,按钮默认的relief是raised。与Label最不同的是,它还可以绑定一个点击事件。
import tkinter as tk
window = tk.Tk()
window.title("我的第一个tkinter小程序")
window.geometry("550x550+-10+0")
def helloCallBack():
print("你点了一下按钮")
B = tk.Button(window, text ="点我", command = helloCallBack)
B.pack()
window.mainloop()
如果鼠标长按按钮,那么按钮不会被触发,而是松开鼠标后触发。这时候,按钮处于一种激活状态。
设置激活时按钮的前景和背景颜色:
B = tk.Button(window, text ="点我", activeforeground="blue", activebackground="yellow")
设置连续触发
按在按钮上,经过repeatdelay毫秒的延迟后,按钮将会重复触发,每次触发的间隔是repeatinterval毫秒。
B = tk.Button(window, text ="点我", command = helloCallBack,
activeforeground="blue", activebackground="yellow",
repeatdelay=1000, repeatinterval=500)