教你用Python写界面
- 2020 年 1 月 7 日
- 筆記
好代码本身就是最好的文档。当你需要添加一个注释时,你应该考虑如何修改代码才能不需要注释
作为Pyhon开发者,你迟早都会碰到图形用户界面(GUI)应用开发任务,这时候我们就需要一些界面库来帮助我们快速搭建界面,python的界面库很多,我认识的并不多,这里只列出几种我认识的
1.tkinter
Tkinter(也叫Tk接口)是Tk图形用户界面工具包标准的Python接口。Tk是一个轻量级的跨平台图形用户界面(GUI)开发工具。Tk和Tkinter可以运行在大多数的Unix平台、Windows、和Macintosh系统。
Tkinter 由一定数量的模块组成。Tkinter位于一个名为_tkinter(较早的版本名为tkinter)的二进制模块中 。Tkinter包含了对Tk的低 级接口模块,低级接口并不会被应用级程序员直接使用,通常是一个共享库(或DLL),但是在一些情况下它也被Python解释器静态链接。
2.pyqt
PyQt是Qt库的Python版本。PyQt3支持Qt1到Qt3。 PyQt4支持Qt4。它的首次发布也是在1998年,但是当时它叫 PyKDE,因为开始的时候SIP和PyQt没有分开。PyQt是用SIP写的。PyQt 提供 GPL版和商业版。
3.wxpython
wxPython 是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能键全的 GUI 用户界面。 wxPython 是作为优秀的跨平台 GUI 库 wxWidgets 的 Python 封装和 Python 模块的方式提供给用户的。
就如同Python和wxWidgets一样,wxPython也是一款开源软件,并且具有非常优秀的跨平台能力,能够运行在32位windows、绝大多数的Unix或类Unix系统、Macintosh OS X上。
4.Kivy
这是一个非常有趣的项目,基于OpenGL ES 2,支持Android和iOS平台的原生多点触摸,作为事件驱动的框架,Kivy非常适合游戏开发,非常适合处理从widgets到动画的任务。如果你想开发跨平台的图形应用,或者仅仅是需要一个强大的跨平台图形用户开发框架,Kivy都是不错的选择。 5.pygame
Pygame是跨平台Python模块,专为电子游戏设计,包含图像、声音。建立在SDL基础上,允许实时电子游戏研发而无需被低级语言(如机器语言和汇编语言)束缚。
这个库使用来写游戏的,但是你也可以用来写界面,嘿嘿
那选择什么库是个人的喜好,但是我推荐尽可能去选择一种通过且学习资料比较多的吧,我这里选择的是tkinter,项目要求比较急,没怎么挑就选了。。。。
我学习也不是很深,如果你想要进行更深的学习请前往tkinter官方文档
先来看看Tkinter里面的基础控件
接下来的代码讲解中你需要导入这些
from tkinter import * from tkinter.tix import Tk, Control, ComboBox #升级的组合控件包 from tkinter.messagebox import showinfo, showwarning, showerror #各种类型的提示框
在进行界面绘制之前你需要初始化Tk()
root = Tk() # 初始化Tk()
root便是你布局的根节点了,以后的布局都在它之上
root.title("hello tkinter") # 设置窗口标题 root.geometry("800x1000") # 设置窗口大小 注意:是x 不是* root.resizable(width=True, height=True) # 设置窗口是否可以变化长/宽,False不可变,True可变,默认为True root.tk.eval('package require Tix') #引入升级包,这样才能使用升级的组合控件
设置一些窗口属性
1.Label
再来看看Label,它的属性很多
activebackground, activeforeground, anchor, background, bitmap, borderwidth, cursor, disabledforeground, font, foreground, highlightbackground, highlightcolor, highlightthickness, image, justify, padx, pady, relief, takefocus, text, textvariable, underline, wraplength height, state, width
太多了,作用基本和名字一样,这里就不一一说了,你可以自己去试试,我说一下常用的属性
lable = Label(root, text="label", bg="pink",bd=10, font=("Arial",12), width=8, height=3) lable.pack(side=LEFT)
第一个 |
要依附的节点 |
---|---|
text |
上面显示的字 |
bg |
背景颜色 也可以传rgb16进制的形式 |
bd |
边框宽度 |
font |
字体 第一个是字体样式 第二个是字体大小 |
width height |
宽 高 |
bitmap |
图像 |
highlightcolor |
高亮时字体颜色 |
highlightbackground |
高亮时背景颜色 |
textvariable |
绑定的变量 之后如果变量值发生变动 字也会随之改变 |
wraplength |
换行控制 如果是50就表示宽度到50就换行显示 |
最后你需要调用pack()来把控件布置上去,你可以指定布局方式,可定义的属性也非常多
# Booleans NO=FALSE=OFF=0 YES=TRUE=ON=1 # -anchor and -sticky N='n' S='s' W='w' E='e' NW='nw' SW='sw' NE='ne' SE='se' NS='ns' EW='ew' NSEW='nsew' CENTER='center' # -fill NONE='none' X='x' Y='y' BOTH='both' # -side LEFT='left' TOP='top' RIGHT='right' BOTTOM='bottom' # -relief RAISED='raised' SUNKEN='sunken' FLAT='flat' RIDGE='ridge' GROOVE='groove' SOLID = 'solid' # -orient HORIZONTAL='horizontal' VERTICAL='vertical' # -tabs NUMERIC='numeric' # -wrap CHAR='char' WORD='word' # -align BASELINE='baseline' # -bordermode INSIDE='inside' OUTSIDE='outside' # Special tags, marks and insert positions SEL='sel' SEL_FIRST='sel.first' SEL_LAST='sel.last' END='end' INSERT='insert' CURRENT='current' ANCHOR='anchor' ALL='all' # e.g. Canvas.delete(ALL) # Text widget and button states NORMAL='normal' DISABLED='disabled' ACTIVE='active' # Canvas state HIDDEN='hidden' # Menu item types CASCADE='cascade' CHECKBUTTON='checkbutton' COMMAND='command' RADIOBUTTON='radiobutton' SEPARATOR='separator' # Selection modes for list boxes SINGLE='single' BROWSE='browse' MULTIPLE='multiple' EXTENDED='extended' # Activestyle for list boxes # NONE='none' is also valid DOTBOX='dotbox' UNDERLINE='underline' # Various canvas styles PIESLICE='pieslice' CHORD='chord' ARC='arc' FIRST='first' LAST='last' BUTT='butt' PROJECTING='projecting' ROUND='round' BEVEL='bevel' MITER='miter' # Arguments to xview/yview MOVETO='moveto' SCROLL='scroll' UNITS='units' PAGES='pages'
写完这些你运行程序发现还是无法出现界面,那是因为你还少了一句
root.mainloop()
加上这句话使程序进入消息循环,界面便会显示出来
学完了label之后学其他控件也就简单了很多,因为很多属性都是相同的
2.Button
button=Button(root,text='QUIT',command=root.quit,activeforeground="black",activebackground='blue',bg='red',fg='white') button.pack(fill=Y,expand=1)
之前说过的属性如果没有特殊情况就不再说了
command |
点击调用的方法 |
---|---|
activeforeground |
点击时按钮上字的颜色 |
activebackground |
点击时按钮的背景颜色 |
3.Scale
def resize(ev=None): lable.config(font='Helvetica -%d bold'%scale.get()) scale=Scale(root,from_=10,to=40,orient=HORIZONTAL,command=resize) scale.set(12) scale.pack()
和button不同的是command不再是点击事件了而是拖动事件 ,调用set()方法可以设置当前位置
from_ |
滑动条起始值 |
---|---|
to |
滑动条终点值 |
origent |
样式 两种样式 一横一竖 |
4.NumbericUpDown
ct=Control(root,label='Number:',integer=True,max=12,min=2,value=2,step=2) ct.label.config(font='Helvetica 14 bold') ct.pack()
integer |
是否为整数 |
---|---|
max |
最大值 |
min |
最小值 |
value |
初始值 |
step |
步长 |
这是一个数字选择框 其中的字体配置需要使用config()方法来进行配置
5.ComboBox
cb=ComboBox(root,label='Type:',editable=True) for animal in ('dog','cat','hamster','python'): cb.insert(END,animal) cb.pack()
这是一个下拉选择框,label前面要显示的字,editable控制是否可更改
调用insert()给下拉选择框添加选项
6.Menu
def click(): print("点击了一次") menubar=Menu(root) root.config(menu=menubar) filemenu=Menu(menubar,tearoff=0) menubar.add_cascade(label='文件',menu=filemenu) filemenu.add_command(label='新建...',command=click()) filemenu.add_command(label='打开...',command=click()) filemenu.add_command(label='保存',command=click()) filemenu.add_command(label='关闭填写',command=root.quit)
惨淡蓝需要所依附的节点配置menu才能起作用
调用add_cascade给menu添加一项选项
带哦用add_command则是给外层的选项添加一个子选项
7.Frame
frame1 =Frame(root) frame1.pack(fill=X) lable1=Label(frame1,text='您的花名: ') lable1.grid(row=1,column=0)
frame相当于一个局部的窗体,可以用来装载其它控件
使用grid能让你更容易把握控件的位置,你可以指定它出现在几行几列,是否跨行跨列,跨几行等等
8.Radiobutton
frame2=Frame(root) frame2.pack(fill=X) lable2=Label(frame2,text='您的性别: ') lable2.grid(row=1,column=0) sex=StringVar() sex_male=Radiobutton(frame2,text='男',fg='blue',variable=sex,value='男') sex_male.grid(row=1,column=2) sex_female=Radiobutton(frame2,text='女',fg='red',variable=sex,value='女') sex_female.grid(row=1,column=4)
这是一个单选框,里面的属性之前也说过
9.ListBox
frame4 =Frame(root) frame4.pack(fill=X) lable4=Label(frame4,text='4、请删除您不会的变成语言: ') lable4.grid(row=1,column=0) listbox=Listbox(frame4) listbox.grid(row=1,column=1) for item in ["C","C++","JAVA","PYTHON","R","SQL","JS"]: listbox.insert(END,item) DELETE=Button(frame4,text="删除",command=lambda listbox=listbox:listbox.delete(ANCHOR)) DELETE.grid(row=1,column=2) language=Button(frame4,text="确定") language.grid(row=2,column=1)
这是一个列表,注意这里按钮点击事件的写法是用lambda表达式写的
10.Canvas
canvas = Canvas(window, width = 200, height = 100, bg = "White") canvas.pack()
这是一个画板,你可以在上面画各种形状,上例子:
from tkinter import * class CanvasDemo: def __init__(self): window = Tk() window.title("CanvasDemo") self.canvas = Canvas(window, width = 200, height = 100, bg = "White") self.canvas.pack() frame = Frame(window) frame.pack() btRectangle = Button(frame, text = "长方形", command = self.displayRect) btOval = Button(frame, text="椭 圆", command=self.displayOval) btArc = Button(frame, text = "圆 弧", command = self.displayArc) btPolygon = Button(frame, text="多边形", command=self.displayPolygon) btLine = Button(frame, text=" 线 ", command=self.displayLine) btString = Button(frame, text="文 字", command=self.displayString) btClear = Button(frame, text="清 空", command=self.clearCanvas) btRectangle.grid(row = 1, column = 1) btOval.grid(row=1, column=2) btArc.grid(row=1, column=3) btPolygon.grid(row=1, column=4) btLine.grid(row=1, column=5) btString.grid(row=1, column=6) btClear.grid(row=1, column=7) window.mainloop() def displayRect(self): self.canvas.create_rectangle(10, 10, 190, 90, tags = "rect") def displayOval(self): self.canvas.create_oval(10, 10, 190, 90, tags = "oval", fill = "red") def displayArc(self): self.canvas.create_arc(10, 10, 190, 90, start = -90, extent = 90, width = 5, fill = "red", tags = "arc") def displayPolygon(self): self.canvas.create_polygon(10, 10, 190, 90, 30, 50, tags = "polygon") def displayLine(self): self.canvas.create_line(10, 10, 190, 90, fill = 'red', tags = "line") self.canvas.create_line(10, 90, 190, 10, width = 9, arrow = "last", activefill = "blue", tags = "line") def displayString(self): self.canvas.create_text(60, 40, text = "Hi,i am a string", font = "Tine 10 bold underline", tags = "string") def clearCanvas(self): self.canvas.delete("rect", "oval", "arc", "polygon", "line", "string") CanvasDemo()
11.CheckButton
frame8=Frame(root) frame8.pack() agree=StringVar() agree=Checkbutton(frame8,text='我同意',variable=agree,onvalue='确定',offvalue="不确定",) agree.grid()
这是一个多选框,oncalue代表被勾选时的值,offvalue代表不被勾选时的值
12.LabelFrame
frame10=Frame(root) frame10.pack() group=LabelFrame(frame10,text='特别鸣谢',padx=5,pady=5) group.grid() w=Label(group,text='容器框') w.pack()
这是个容器框,padx,pady分别控制在x,y方向上的外边距
差不多这些控件已经够用了,我这还有几个小例子供你练习