重拾python(进阶篇)
GUI设计
原来一直都只会打黑框框,感觉自己太菜了,因此要学点这个才行
tkinter
这个库是python自带的图形界面库,不用额外下载
import tkinter
即可引入
其中的一些元件用法如下
根窗口
就是整个程序显示的窗口
root=tkinter.Tk()
#这里就把根窗口创建并且赋值给了root变量
root.title('XXX')
#定义窗口的名字,在窗口左上角显示
root.geometry("500x400")
#定义窗口大小,注意其中的''x''是小写的字母不是''*''
root.mainloop()
#这个函数就可以让根窗口显示了,具体是个什么意思我不是特别清楚
标签
可以显示字符,但是不能够修改
标签的定义:l=tkinter.Label(root,text=,font=,width=,height=,bg=,fg=)
Label=tkinter.Label(root,text='XX',bg='blue',fg='white',font=('Arial',12),width=30,height=5)
#定义一个标签,显示在root上,内容为XX,背景色为Blue,前景色Wiewhite,字体为Arial,字体大小为12,标签宽度为30,高度为5
Label.pack()
#在root上显示标签(这一句不打不行)
一般来讲,一个元件的参数构成可以这样简化:Yuanjian(position,options)
,其中position就是元件的母容器,说白了就是元件放在哪里,options就是剩下的参数,规定元件的各个细节
tkinter里面这些元件用来规定细节的参数很多,了解详细用法可以参见互联网上一些比较好的说明
按钮
按下按钮可以触发相应的函数事件(当然也可以不触发,但…有意思吗哈哈)
按钮的定义:B=tkinter.Button(Root,text=,font=(,),width=,height=,command=)
#这里尝试写一个按下按钮就生成随机数的小程序
var=tkinter.StringVar()
#先定义一个tkinter里面的字符变量用来放要显示的结果
def ReturnRandom():#这里设计一个函数,用来生成随机数
res=random.randint(0,9)#生成随机数
var.set("{0}".fotmat(res))#把随机数放到var变量里面的语句就这样写了,也就是调用var的set函数
Button=tkinter.Button(root,text='XX',font=('Arial',12),width=30,height=5,command=ReturnRandom)
#定义一个Button,参数意思和标签一致,只是command参数不一样.command参数用来指定按下按钮触发的函数,这里是ReturnRandom,注意这里不要在后面加括号
#注意按钮需要的函数一定要写在按钮前面,不然药丸
Button.pack()#把Button放到root上面去
root.mainloop()#显示
输入框
可以输入一些东西并且让程序拿到,输入的时候可以把输入的内容按照明文或者暗文显示
输入框的定义:e=tkinter.Entry(root,show=)
其中show
参数如果跟None
就显示为明文,如果跟*
就为暗文
输入框内容的获取:
var=tkinter.StringVar()#定义一个变量来存
e=tkinter.Entry(root,show='*')#定义输入框
var=e.get()#获取e中的文本
文本框
可以显示多行文本,其实感觉除这个以外和标签没啥区别
列表
就是一列选项可以用来选择
列表定义:lb=tkinter.Listbox(window,listvariable=)
,用listvariable给列表赋值
也可以这样赋值:
lb=tk.Listbox(window)
listItems=[1,2,3,4,5]
for item in listItems:
lb.insert("end",item)
#用循环把值赋给lb这个列表
lb.delete(0)#删除第零个位置的字符
lb.pack()#放上列表
单选按钮(radiobutton)
可以显示一堆选项然后选一个
定义:r1 = tk.Radiobutton(window, text='', variable=, value='', command=)
其中,value
选项是显示在按钮上的字符
多选按钮(checkbutton)
每一个checkbutton都可以选或不选,这样下来用一组checkbutton就可以达到多选的目的了
定义:c = Checkbutton(root, text="我爱GXY", variable=)
尺度滑条(scale)
感觉没谁用到这个…但还是提一下
可以通过滑动滑块来选择值
定义:
# 创建一个尺度滑条,长度200字符,从0开始10结束,以2为刻度,精度为0.01,触发调用print_selection函数
s = tk.Scale(window, label='try me', from_=0, to=10, orient=tk.HORIZONTAL, length=200, showvalue=0, tickinterval=2,
resolution=0.01, command=print_selection)
画板
顾名思义,画画的板子
定义:canvas=tk.Canvas(root,bg=,height=,width=)
加入图片:
image_=tkinter.PhotoImage(file='path')
#path那里输入文件的位置,可以输入相对路径,前提是图片和.py文件在同一文件夹下,否则就输入绝对路径,这里用image_把图片搞进来
Image_=canvas.create_image(250,0,anchor='n',image=image_)
#将图片放到画布上
这里第二句中的参数用于图片锚定点,前面两个数字用于定位坐标,image参数用于引入图片
画各种奇怪的东西:
x0, y0, x1, y1 = 100, 100, 150, 150
line = canvas.create_line(x0 - 50, y0 - 50, x1 - 50, y1 - 50) # 画直线
oval = canvas.create_oval(x0 + 120, y0 + 50, x1 + 120, y1 + 50, fill='yellow') # 画圆 用黄色填充
arc = canvas.create_arc(x0, y0 + 50, x1, y1 + 50, start=0, extent=180) # 画扇形 从0度打开收到180度结束
rect = canvas.create_rectangle(330, 30, 330 + 20, 30 + 20) # 画矩形正方形
canvas.pack()
移动画布中的元素:
# 写个函数,用来一定指定图形
def moveit():
canvas.move(rect, 2, 2) # 移动正方形rect(也可以改成其他图形名字用以移动图形、元素),按每次(x=2, y=2)步长进行移动
# 定义一个按钮用来移动指定图形的在画布上的位置
b = tk.Button(window, text='move item', command=moveit).pack()
菜单
顾名思义,不说了
定义:
#创建一个总的菜单栏,这里可以把他理解成一个容器,用来装其他东西的,在窗口的上方
#这个菜单的母容器是window,也就是根窗口
menubar = tk.Menu(window)
菜单里面嵌菜单和命令:
filemenu = tk.Menu(menubar, tearoff=0)
# 将上面定义的空菜单命名为File,放在菜单栏中,就是装入上面那个menubar容器中
menubar.add_cascade(label='File', menu=filemenu)
# 在File中加入New、Open、Save等小菜单,即我们平时看到的下拉菜单,每一个小菜单可以对应命令操作。
filemenu.add_command(label='New', command=)
filemenu.add_command(label='Open', command=)
filemenu.add_command(label='Save', command=)
filemenu.add_separator() # 添加一条分隔线
filemenu.add_command(label='Exit', command=window.quit) # 用tkinter里面自带的quit()函数
框架(frame)
我理解的就是划出来的一块区域
可以这样创建的:
#创建一个主frame,长在主window窗口上
frame = tk.Frame(window)
frame.pack()
# 创建第二层框架frame,长在主框架frame上面
frame_l = tk.Frame(frame) # 第二层frame,左frame,长在主frame上
frame_r = tk.Frame(frame) # 第二层frame,右frame,长在主frame上
frame_l.pack(side='left')
frame_r.pack(side='right')
# 创建三组标签,为第二层frame上面的内容,分为左区域和右区域,用不同颜色标识
tk.Label(frame_l, text='on the frame_l1', bg='green').pack()
tk.Label(frame_l, text='on the frame_l2', bg='green').pack()
tk.Label(frame_l, text='on the frame_l3', bg='green').pack()
tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack()
一层套一层的,可以可以
弹窗
用来提示的,最好还是不要乱搞
tkinter.messagebox.showinfo(title='Hi', message='你好!') # 提示信息对话窗
tkinter.messagebox.showwarning(title='Hi', message='有警告!') # 提出警告对话窗
tkinter.messagebox.showerror(title='Hi', message='出错了!') # 提出错误对话窗
print(tkinter.messagebox.askquestion(title='Hi', message='你好!')) # 询问选择对话窗return 'yes', 'no'
print(tkinter.messagebox.askyesno(title='Hi', message='你好!')) # return 'True', 'False'
print(tkinter.messagebox.askokcancel(title='Hi', message='你好!')) # return 'True', 'False'
至于tinker如何合理布局等,无力再写下去了2333
互联网是个好东西啊