Python GUI之tkinter窗口视窗教程大集合(看这篇就够了)
一、Tkinter是什么 Tkinter 是使用 python 进行窗口视窗设计的模块。Tkinter模块(“Tk 接口”)是Python 的标准Tk GUI工具包的接口。作为 python 特定的GUI界面,是一个图像的窗口,tkinter是python 自带的,可以编辑的GUI界面,我们可以用GUI 实现很多直观的功能,比如想开发一个计算器,如果只是一个程序输入,输出窗口的话,是没用用户体验的。所有开发一个图像化的小窗口,就是必要的。
对于稍有GUI编程经验的人来说,Python 的Tkinter界面库是非常简单的。python 的GUI库非常多,选择Tkinter,一是最为简单,二是自带库,不需下载安装,随时使用,三则是从需求出发,Python作为一种脚本语言,一种胶水语言,一般不会用它来开发复杂的桌面应用,它并不具备这方面的优势,使用Python,可以把它作为一个灵活的工具,而不是作为主要开发语言,那么在工作中,需要制作一个小工具,肯定是需要有界面的,不仅自己用,也能分享别人使用,在这种需求下,Tkinter是足够胜任的!
这篇文章主要做一个简单概述和实践编程,对于从没有接触过GUI的新手,在脑中树立一个基本的界面编程概念,同时自己也能学会如何简单的实现一些小的图形窗口功能。
对于Tkinter编程,可以用两个比喻来理解:
第一个,作画。我们都见过美术生写生的情景,先支一个画架,放上画板,蒙上画布,构思内容,用铅笔画草图,组织结构和比例,调色板调色,最后画笔勾勒。相应的,对应到tkinter编程,那么我们的显示屏就是支起来的画架,根窗体就是画板,在tkinter中则是Toplevel,画布就是tkinter中的容器(Frame),画板上可以放很多张画布(Convas),tkinter中的容器中也可以放很多个容器,绘画中的构图布局则是tkinter中的布局管理器(几何管理器),绘画的内容就是tkinter中的一个个小组件,一幅画由许多元素构成,而我们的GUI界面,就是有一个个组件拼装起来的,它们就是widget。
第二个,我们小时候都玩过积木,只要发挥创意,相同的积木可以堆出各种造型。tkinter的组件也可以看做一个个积木,形状或许不同,其本质都是一样的,就是一个积木,不管它长什么样子,它始终就是积木!所以这些小组件都有许多共性,另外,个人认为,学习界面编程,最重要的不是一开始学习每个积木的样子,不是学习每个组件怎么用,而是这些组件该怎么放。初始学习中,怎么放远远比怎么用重要的多。网上有大量的文章资料,基本全是介绍组件怎么用的,对于怎么放,也就是tkinter中的布局管理器,都是一笔带过,这对初学者有点本末倒置,或许绝大部分是转载的原因吧,极少是自己真正写的。组件怎么用不是最迫切的,用到的时候再去了解也不迟,边用边学反而更好。因此我将专门写一章,详细介绍布局管理器的使用。
二、Tkinter 控件详细介绍 1. 常用窗口部件及简要说明: Tkinter支持16个核心的窗口部件,这个16个核心窗口部件类简要描述如下:
Button: 一个简单的按钮,用来执行一个命令或别的操作。
Canvas: 组织图形。这个部件可以用来绘制图表和图,创建图形编辑器,实现定制窗口部件。
Checkbutton: 代表一个变量,它有两个不同的值。点击这个按钮将会在这两个值间切换。
Entry: 文本输入域。
Frame: 一个容器窗口部件。帧可以有边框和背景,当创建一个应用程序或dialog(对话)版面时,帧被用来组织其它的窗口部件。
Label: 显示一个文本或图象。
Listbox: 显示供选方案的一个列表。listbox能够被配置来得到radiobutton或checklist的行为。
Menu: 菜单条。用来实现下拉和弹出式菜单。
Menubutton: 菜单按钮。用来实现下拉式菜单。
Message: 显示一文本。类似label窗口部件,但是能够自动地调整文本到给定的宽度或比率。
Radiobutton: 代表一个变量,它可以有多个值中的一个。点击它将为这个变量设置值,并且清除与这同一变量相关的其它radiobutton。
Scale: 允许你通过滑块来设置一数字值。
Scrollbar: 为配合使用canvas, entry, listbox, and text窗口部件的标准滚动条。
Text: 格式化文本显示。允许你用不同的样式和属性来显示和编辑文本。同时支持内嵌图象和窗口。
Toplevel: 一个容器窗口部件,作为一个单独的、最上面的窗口显示。
messageBox :消息框,用于显示你应用程序的消息框。(Python2中为tkMessagebox)
2. Tkinter 模块元素简要说明
注意在Tkinter中窗口部件类没有分级;所有的窗口部件类在树中都是兄弟关系。
所有这些窗口部件提供了Misc和几何管理方法、配置管理方法和部件自己定义的另外的方法。此外,Toplevel类也提供窗口管理接口。这意味一个典型的窗口部件类提供了大约150种方法。
三、 动手实践学习 1. 创建主窗口及Label部件(标签)创建使用 我们要学习使用上面提到的这些控件首先要创建一个主窗口,就像作画一样,先要架好架子和画板,然后才能在上面放画纸和各种绘画元素,创建好主窗口才能在上面放置各种控件元素。而创建过程是很简单的,如下:
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) l = tk.Label(window, text='你好!this is Tkinter' , bg='white' , font=('微软雅黑' , 12 ), width=30 , height=2 ) l.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
简单说明:
Button(按钮)部件是一个标准的Tkinter窗口部件,用来实现各种按钮。按钮能够包含文本或图象,并且你能够将按钮与一个Python函数或方法相关联。当这个按钮被按下时,Tkinter自动调用相关联的函数或方法。
按钮仅能显示一种字体,但是这个文本可以跨行。另外,这个文本中的一个字母可以有下划线,例如标明一个快捷键。默认情况,Tab键用于将焦点移动到一个按钮部件。
什么时候用按钮部件
简言之,按钮部件用来让用户说“马上给我执行这个任务”,通常我们用显示在按钮上的文本或图象来提示。按钮通常用在工具条中或应用程序窗口中,并且用来接收或忽略输入在对话框中的数据。关于按钮和输入的数据的配合,可以参看Checkbutton和Radiobutton部件。
如何创建:
普通的按钮很容易被创建,仅仅指定按钮的内容(文本、位图、图象)和一个当按钮被按下时的回调函数即可:
b = tk.Button(window, text=”hit me”, command=hit_me)
没有回调函数的按钮是没有用的,当你按下这个按钮时它什么也不做。你可能在开发一个应用程序的时候想实现这种按钮,比如为了不干扰你的beta版的测试者:
b = tk.Button(window, text=”Help”, command=DISABLED)
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) var = tk.StringVar() l = tk.Label(window, textvariable=var, bg='white' , fg='black' , font=('微软雅黑' , 12 ), width=30 , height=2 ) l.pack() on_hit = False def hit_me (): global on_hit if on_hit == False : on_hit = True var.set ('you hit me' ) else : on_hit = False var.set ('' ) b = tk.Button(window, text='hit me' , font=('Arial' , 12 ), width=10 , height=1 , command=hit_me) b.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
3. Entry窗口部件 简单说明:
Entry是tkinter类中提供的的一个单行文本输入域,用来输入显示一行文本,收集键盘输入(类似 HTML 中的 text)。
什么时候用:
需要用户输入用户信息时,比如我们平时使用软件、登录网页时,用户交互界面让我们登录账户信息等时候可以用到。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) e1 = tk.Entry(window, show='*' , font=('微软雅黑' , 14 )) e2 = tk.Entry(window, show=None , font=('微软雅黑' , 14 )) e1.pack() e2.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
4. Text窗口部件 简单说明:
Text是tkinter类中提供的的一个多行文本区域,显示多行文本,可用来收集(或显示)用户输入的文字(类似 HTML 中的 textarea),格式化文本显示,允许你用不同的样式和属性来显示和编辑文本,同时支持内嵌图象和窗口。
什么时候用:
在需要显示编辑用户、产品多行信息时,比如显示用户详细描述文字,产品简介等等,支持随时编辑。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) e = tk.Entry(window, show=None ) e.pack() def insert_point (): var = e.get() t.insert('insert' , var) def insert_end (): var = e.get() t.insert('end' , var) b1 = tk.Button(window, text='insert point' , width=10 , height=2 , command=insert_point) b1.pack() b2 = tk.Button(window, text='insert end' , width=10 , height=2 , command=insert_end) b2.pack() t = tk.Text(window, height=4 ) t.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
5. Listbox窗口部件 简单说明:
Text是tkinter类中提供的的列表框部件,显示供选方案的一个列表。listbox能够被配置来得到radiobutton或checklist的行为。
什么时候用:
在有一个很多内容选项组成的列表提供用户选择时会用到。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) var1 = tk.StringVar() l = tk.Label(window, bg='white' , fg='black' , font=('微软雅黑' , 12 ), width=10 , textvariable=var1) l.pack() def print_selection (): value = lb.get(lb.curselection()) var1.set (value) b1 = tk.Button(window, text='print selection' , width=15 , height=2 , command=print_selection) b1.pack() var2 = tk.StringVar() var2.set ((1 , 2 , 3 , 4 )) lb = tk.Listbox(window, listvariable=var2) list_items = [11 , 22 , 33 , 44 ] for item in list_items: lb.insert('end' , item) lb.insert(1 , 'first' ) lb.insert(2 , 'second' ) lb.delete(2 ) lb.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
简单说明:
Radiobutton: 代表一个变量,它可以有多个值中的一个。点击它将为这个变量设置值,并且清除与这同一变量相关的其它radiobutton。
什么时候用:
在有一个很多内容选项组成的选项列表提供用户选择时会用到,用户一次只能选择其中一个,不能多选。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) var = tk.StringVar() l = tk.Label(window, bg='green' , width=20 , text='empty' ) l.pack() def print_selection (): l.config(text='you have selected ' + var.get()) r1 = tk.Radiobutton(window, text='Option A' , variable=var, value='A' , command=print_selection) r1.pack() r2 = tk.Radiobutton(window, text='Option B' , variable=var, value='B' , command=print_selection) r2.pack() r3 = tk.Radiobutton(window, text='Option C' , variable=var, value='C' , command=print_selection) r3.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
简单说明:
Checkbutton: 代表一个变量,它有两个不同的值。点击这个按钮将会在这两个值间切换,选择和取消选择。
什么时候用:
在有一个很多内容选项组成的选项列表提供用户选择时会用到,用户一次可以选择多个。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) l = tk.Label(window, bg='yellow' , width=20 , text='empty' ) l.pack() def print_selection (): if (var1.get() == 1 ) & (var2.get() == 0 ): l.config(text='I love only Python ' ) elif (var1.get() == 0 ) & (var2.get() == 1 ): l.config(text='I love only C++' ) elif (var1.get() == 0 ) & (var2.get() == 0 ): l.config(text='I do not love either' ) else : l.config(text='I love both' ) var1 = tk.IntVar() var2 = tk.IntVar() c1 = tk.Checkbutton(window, text='Python' , variable=var1, onvalue=1 , offvalue=0 , command=print_selection) c1.pack() c2 = tk.Checkbutton(window, text='C++' , variable=var2, onvalue=1 , offvalue=0 , command=print_selection) c2.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
8. Scale窗口部件 简单说明:
Scale: 尺度(拉动条), 允许你通过滑块来设置一数字值。
什么时候用:
在需要用户给出评价等级,或者给出一个评价分数,或者拉动滑动条提供一个具体的数值等等。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) l = tk.Label(window, bg='green' , fg='white' , width=20 , text='empty' ) l.pack() def print_selection (v ): l.config(text='you have selected ' + v) 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) s.pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
9. Canvas窗口部件 简单说明:
Canvas:画布, 提供绘图功能(直线、椭圆、多边形、矩形) 可以包含图形或位图,用来绘制图表和图,创建图形编辑器,实现定制窗口部件。
什么时候用:
在比如像用户交互界面等,需要提供设计的图标、图形、logo等信息是可以用到画布。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) canvas = tk.Canvas(window, bg='green' , height=200 , width=500 ) image_file = tk.PhotoImage(file='pic.gif' ) image = canvas.create_image(250 , 0 , anchor='n' , image=image_file) 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 ) rect = canvas.create_rectangle(330 , 30 , 330 + 20 , 30 + 20 ) canvas.pack() def moveit (): canvas.move(rect, 2 , 2 ) b = tk.Button(window, text='move item' , command=moveit).pack() window.mainloop() if __name__ == "__main__" : main()
所用图片:
当然你可以随意用你的一张图片导入画布试一试效果,图片可以用画图工具改一下像素大小,以免图片太大,导入画布显示不全,当然你也可以用我提供的素材,下面是链接:https://files.cnblogs.com/files/shwee/pic.gif
图片锚定点位置参数图:
测试效果:
简单说明:
Menu: 菜单条,用来实现下拉和弹出式菜单,点下菜单后弹出的一个选项列表,用户可以从中选择
什么时候用:
在比如像软件或网页交互界面等,需要提供菜单选项功能提供用户选择菜单选项功能时用到。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) l = tk.Label(window, text=' ' , bg='green' ) l.pack() counter = 0 def do_job (): global counter l.config(text='do ' + str (counter)) counter += 1 menubar = tk.Menu(window) filemenu = tk.Menu(menubar, tearoff=0 ) menubar.add_cascade(label='File' , menu=filemenu) filemenu.add_command(label='New' , command=do_job) filemenu.add_command(label='Open' , command=do_job) filemenu.add_command(label='Save' , command=do_job) filemenu.add_separator() filemenu.add_command(label='Exit' , command=window.quit) editmenu = tk.Menu(menubar, tearoff=0 ) menubar.add_cascade(label='Edit' , menu=editmenu) editmenu.add_command(label='Cut' , command=do_job) editmenu.add_command(label='Copy' , command=do_job) editmenu.add_command(label='Paste' , command=do_job) submenu = tk.Menu(filemenu) filemenu.add_cascade(label='Import' , menu=submenu, underline=0 ) submenu.add_command(label='Submenu_1' , command=do_job) window.config(menu=menubar) window.mainloop() if __name__ == "__main__" : main()
测试效果: https://images2018.cnblogs.com/blog/1372069/201808/1372069-20180808224139791-265028894.gif
11. Frame 窗口部件 简单说明:
Frame:框架,用来承载放置其他GUI元素,就是一个容器,是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器.
什么时候用:
在比如像软件或网页交互界面等,有不同的界面逻辑层级和功能区域划分时可以用到,让交互界面逻辑更加清晰。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) tk.Label(window, text='on the window' , bg='red' , font=('微软雅黑' , 16 )).pack() frame = tk.Frame(window) frame.pack() frame_l = tk.Frame(frame) frame_r = tk.Frame(frame) frame_l.pack(side='left' ) frame_r.pack(side='right' ) 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() window.mainloop() if __name__ == "__main__" : main()
测试效果:
12. messageBox窗口部件 简单说明:
messageBox:消息框,用于显示你应用程序的消息框。(Python2中为tkMessagebox),其实这里的messageBox就是我们平时看到的弹窗。 我们首先需要定义一个触发功能,来触发这个弹窗,这里我们就放上以前学过的button按钮,通过触发功能,调用messagebox吧,点击button按钮就会弹出提示对话框。下面给出messagebox提示信息的几种形式:
1 2 3 4 5 6 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='你好!' )) print(tkinter.messagebox.askyesno(title='Hi' , message='你好!' )) print(tkinter.messagebox.askokcancel(title='Hi' , message='你好!' ))
什么时候用:
在比如像软件或网页交互界面等,有不同的界面逻辑层级和功能区域划分时可以用到,让交互界面逻辑更加清晰。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 import tkinter as tk import tkinter.messagebox def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) def hit_me (): tkinter.messagebox.showinfo(title='Hi' , message='你好!' ) tk.Button(window, text='hit me' , bg='green' , font=('微软雅黑' , 14 ), command=hit_me).pack() window.mainloop() if __name__ == "__main__" : main()
测试效果:
13. 窗口部件三种放置方式pack/grid/place 参考来源:
The Grid Geometry Manager The Pack Geometry Manager The Place Geometry Manager
1. Grid:The Grid Geometry Manager
grid 是方格, 所以所有的内容会被放在这些规律的方格中。例如:
1 2 3 for i in range (3 ): for j in range (3 ): tk.Label(window, text=1 ).grid(row=i, column=j, padx=10 , pady=10 , ipadx=10 , ipady=10 )
以上的代码就是创建一个三行三列的表格,其实 grid 就是用表格的形式定位的。这里的参数 row 为行,colum 为列,padx 就是单元格左右间距,pady 就是单元格上下间距,ipadx是单元格内部元素与单元格的左右间距,ipady是单元格内部元素与单元格的上下间距。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) for i in range (3 ): for j in range (3 ): tk.Label(window, text=1 ).grid(row=i, column=j, padx=10 , pady=10 , ipadx=10 , ipady=10 ) window.mainloop() if __name__ == "__main__" : main()
测试效果:
2. Pack:The Pack Geometry Manager
我们常用的pack(), 他会按照上下左右的方式排列.例如:
1 2 3 4 tk.Label(window, text='P' , fg='red' ).pack(side='top' ) tk.Label(window, text='P' , fg='red' ).pack(side='bottom' ) tk.Label(window, text='P' , fg='red' ).pack(side='left' ) tk.Label(window, text='P' , fg='red' ).pack(side='right' )
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) tk.Label(window, text='P' , fg='red' ).pack(side='top' ) tk.Label(window, text='P' , fg='red' ).pack(side='bottom' ) tk.Label(window, text='P' , fg='red' ).pack(side='left' ) tk.Label(window, text='P' , fg='red' ).pack(side='right' ) window.mainloop() if __name__ == "__main__" : main()
测试效果:
3. Place:The Place Geometry Manager
再接下来我们来看place(), 这个比较容易理解,就是给精确的坐标来定位,如此处给的(50, 100),就是将这个部件放在坐标为(x=50, y=100)的这个位置, 后面的参数 anchor=’nw’,就是前面所讲的锚定点是西北角。例如:
1 tk.Label(window, text='Pl' , font=('微软雅黑' , 20 ), ).place(x=50 , y=100 , anchor='nw' )
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 import tkinter as tk def main (): window = tk.Tk() window.title('My Window' ) window.geometry('500x300' ) tk.Label(window, text='Pl' , font=('微软雅黑' , 20 ), ).place(x=50 , y=100 , anchor='nw' ) window.mainloop() if __name__ == "__main__" : main()
测试效果:
14. 综合练习,用户登录窗口例子 编写一个用户登录界面,用户可以登录账户信息,如果账户已经存在,可以直接登录,登录名或者登录密码输入错误会提示,如果账户不存在,提示用户注册,点击注册进去注册页面,输入注册信息,确定后便可以返回登录界面进行登录。
示例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 import tkinter as tk import tkinter.messageboximport pickledef main (): window = tk.Tk() window.title('Welcome to HD Website' ) window.geometry('400x300' ) canvas = tk.Canvas(window, width=400 , height=135 , bg='green' ) image_file = tk.PhotoImage(file='pic.gif' ) image = canvas.create_image(200 , 0 , anchor='n' , image=image_file) canvas.pack(side='top' ) tk.Label(window, text='Welcome' , font=('微软雅黑' , 16 )).pack() tk.Label(window, text='User name:' , font=('微软雅黑' , 14 )).place(x=10 , y=170 ) tk.Label(window, text='Password:' , font=('微软雅黑' , 14 )).place(x=10 , y=210 ) var_usr_name = tk.StringVar() var_usr_name.set ('example@python.com' ) entry_usr_name = tk.Entry(window, textvariable=var_usr_name, font=('微软雅黑' , 14 )) entry_usr_name.place(x=120 ,y=175 ) var_usr_pwd = tk.StringVar() entry_usr_pwd = tk.Entry(window, textvariable=var_usr_pwd, font=('微软雅黑' , 14 ), show='*' ) entry_usr_pwd.place(x=120 ,y=215 ) def usr_login (): usr_name = var_usr_name.get() usr_pwd = var_usr_pwd.get() try : with open ('usrs_info.pickle' , 'rb' ) as usr_file: usrs_info = pickle.load(usr_file) except FileNotFoundError: with open ('usrs_info.pickle' , 'wb' ) as usr_file: usrs_info = {'admin' : 'admin' } pickle.dump(usrs_info, usr_file) usr_file.close() if usr_name in usrs_info: if usr_pwd == usrs_info[usr_name]: tkinter.messagebox.showinfo(title='Welcome' , message='How are you? ' + usr_name) else : tkinter.messagebox.showerror(message='Error, your password is wrong, try again.' ) else : is_sign_up = tkinter.messagebox.askyesno('Welcome! ' , 'You have not sign up yet. Sign up now?' ) if is_sign_up: usr_sign_up() def usr_sign_up (): def sign_to_HD_Website (): np = new_pwd.get() npf = new_pwd_confirm.get() nn = new_name.get() with open ('usrs_info.pickle' , 'rb' ) as usr_file: exist_usr_info = pickle.load(usr_file) if np != npf: tkinter.messagebox.showerror('Error' , 'Password and confirm password must be the same!' ) elif nn in exist_usr_info: tkinter.messagebox.showerror('Error' , 'The user has already signed up!' ) else : exist_usr_info[nn] = np with open ('usrs_info.pickle' , 'wb' ) as usr_file: pickle.dump(exist_usr_info, usr_file) tkinter.messagebox.showinfo('Welcome' , 'You have successfully signed up!' ) window_sign_up.destroy() window_sign_up = tk.Toplevel(window) window_sign_up.geometry('300x200' ) window_sign_up.title('Sign up window' ) new_name = tk.StringVar() new_name.set ('example@python.com' ) tk.Label(window_sign_up, text='User name: ' ).place(x=10 , y=10 ) entry_new_name = tk.Entry(window_sign_up, textvariable=new_name) entry_new_name.place(x=130 , y=10 ) new_pwd = tk.StringVar() tk.Label(window_sign_up, text='Password: ' ).place(x=10 , y=50 ) entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*' ) entry_usr_pwd.place(x=130 , y=50 ) new_pwd_confirm = tk.StringVar() tk.Label(window_sign_up, text='Confirm password: ' ).place(x=10 , y=90 ) entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*' ) entry_usr_pwd_confirm.place(x=130 , y=90 ) btn_comfirm_sign_up = tk.Button(window_sign_up, text='Sign up' , command=sign_to_HD_Website) btn_comfirm_sign_up.place(x=180 , y=120 ) btn_login = tk.Button(window, text='Login' , command=usr_login) btn_login.place(x=120 , y=240 ) btn_sign_up = tk.Button(window, text='Sign up' , command=usr_sign_up) btn_sign_up.place(x=200 , y=240 ) window.mainloop() if __name__ == "__main__" : main()
测试效果:
注:不同电脑可能配置环境略有不同,如有小错误可以自己调试一下。
转载于:https://www.cnblogs.com/shwee/p/9427975.html