GUI设计

原来一直都只会打黑框框,感觉自己太菜了,因此要学点这个才行

tkinter

找到一个dalao写的非常详细的教程,先贴在这里

这个库是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

互联网是个好东西啊