版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
# -*- coding: utf-8 -*-
'''
参考网址:
https://morvanzhou.github.io/tutorials/python-basic/tkinter/1-1-why/#%E7%AE%80%E5%8D%95%E4%BB%8B%E7%BB%8D
使用:
示例1 主窗体Tk、显示标签Label、文字变量StringVar()、按钮Button及函数定义事件
示例2 文本框entry、输入框Text、插入insert
示例3 列表部件Listbox
示例4 选择按钮Radiobutton
示例5 尺度部件Scale
示例6 勾选按钮Checkbutton
示例7 Canvas画布
示例8 菜单Menu
示例9 Frame框架
示例10 弹窗Messagebox (注意:import tkinter.Messagebox)
示例11 pacd、grid、place放置位置的用法
最后例子: 创建登录窗口
其中使用到:主窗口Tk、 画布Canvas(上方图片背景)、 显示标签Label(提示用户名密码)、 输入框Entry(输入用户名密码)、 按钮Button(点击登录)
'''
#下面开始代码:
# =============================================================================
# #示例1:主窗体、标签、文字变量储存器标签、按钮及事件
# #主窗体Tk、标签Label、文字变量StringVar()、按钮Button及函数定义事件
# =============================================================================
#import tkinter as tk
#
#
##窗口主体框架(主窗口、标题、大小)
##设置顶级窗口
#window=tk.Tk() #实例化 顶级窗口
#window.title('my title') #设置顶级窗口标题
#window.geometry('500x300') #设置顶级窗口尺寸
#
#
#
##窗口内容(窗口上的控件)
##设置标签
#l=tk.Label(window, #指定顶级窗口
# text='标签文本内容', #设置标签文本内容
# bg='green', #设置背景颜色
# font='Arial,12', #设置字体、字号
# width=15,height=2 #设置标签的宽、高
# )
#l.pack() #固定窗口位置
#
#
##设置标签 文本可变化
#var=tk.StringVar() #文字变量储存器
#l=tk.Label(window,
# textvariable=var, #标签文本,使用textvariable 替换 text,因为textvariable可以变化
# bg='blue',
# font='Arial,12',
# width=15,height=2
# )
#l.pack()
#
##设置命令函数来判断点击状态 和 设置点击事件
#on_hit=False #默认初始化状态为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='按钮文本',
# width=15,height=2,
# command=hit_me
# )
#b.pack()
#
#
#
#window.mainloop() #窗口展示
# =============================================================================
# #示例2: 文本框、输入框、插入功能
# #主窗口Tk、文本框Entry、输入框Text、插入insert按钮(两种不同类型插入文本框按钮)
# =============================================================================
#import tkinter as tk
#
#
#window=tk.Tk()
#window.title('主窗口标题')
#window.geometry('600x300')
#
#
##创建输入框 用户输入任何内容都显示为 *
#e=tk.Entry(window,show='+') #创建输入框
#e.pack()
#
##创建文本框 用于显示
#t=tk.Text(window,height=2) #创建文本框
#t.pack()
#
#
##定义触发事件函数
#def insert_point():
# var=e.get() #获取输入框内容
# t.insert('insert',var) #文本框内插入 在插入点插入 内容 var
#
#def insert_end():
# var=e.get() #获取输入框内容
# t.insert('end',var) #文本框内插入 在最后位置插入 内容 var
#
##创建两个按钮 分别触发两种情况
#b1=tk.Button(window, text='insert point', width=15,height=2,command=insert_point)
#b1.pack()
#
#b2=tk.Button(window, text='insert end',command=insert_end)
#b2.pack()
#
#
#
#window.mainloop()
# =============================================================================
# #示例3:Listbox列表部件
# #主窗体、显示标签Label、按钮Button及事件、列表部件Listbox
# =============================================================================
#import tkinter as tk
#
#
#window=tk.Tk()
#window.title('Listbox列表部件')
#window.geometry('600x300')
#
#
#
##创建一个标签Label用于显示
#var1=tk.StringVar() #文字变量 后面通过定义事件来 var1.set() 改变文本内容
#l=tk.Label(window, bg='yellow', width=4, textvariable=var1) #用textvariable来替换text,可变化文字内容
#l.pack()
#
#
##创建函数 定义按钮点击事件
#def print_selection():
# value=lb.get(lb.curselection()) #获取当前选中的文本 Listbox方法curselection()
# var1.set(value) #给var1设置文本值,即变换标签文本内容。
#
#
##创建按钮
#b1=tk.Button(window, text='print selection', width=15, height=2, command=print_selection)
#b1.pack()
#
#
##创建一个Listbox和变量var2,并将var2的值赋给Listbox
#var2=tk.StringVar()
#var2.set((11,22,33,44)) #为变量设置值
#
#lb=tk.Listbox(window, listvariable=var2) #创建Listbox列表部件
#
#list_items=[1,2,3,4]
#for item in list_items:
# lb.insert('end',item) #循环插入数字 在Listbox的最后
#lb.insert(1,'first') #Listbox列表部件内插入 位置1,内容first
#lb.insert(2,'second') #Listbox列表部件内插入 位置2,内容second
#lb.delete(2) #Listobx列表部件内删除 位置2
#lb.pack()
#
#
#
#window.mainloop()
# =============================================================================
# #示例4:Radiobutton选择按钮
# #主窗体Tk、显示标签Label、选择按钮Radiobutton
# =============================================================================
#import tkinter as tk
#
#
#window=tk.Tk()
#window.title('Radiobutton选择按钮')
#window.geometry('600x300')
#
#
#var=tk.StringVar()
#l=tk.Label(window, bg='yellow', width=20, text='empty')
#l.pack()
#
#
#def print_selection():
# l.config(text='you have selected ' + var.get())
#
#
##创建选择按钮 Radiobutton
##当我们选择其中一个选项,把 value 的值 A 放到变量 var 中,然后复制给variable
#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()
# =============================================================================
# #示例5:Scale尺度部件
# #主窗体Tk、显示标签Label、尺度部件Scale
# =============================================================================
#import tkinter as tk
#
#
#window=tk.Tk()
#window.title('Scale尺度部件')
#window.geometry('600x300')
#
#
##创建标签 用于显示
#l=tk.Label(window, bg='yellow', 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_=5, to=11, orient=tk.HORIZONTAL,
# length=200, showvalue=0, tickinterval=2, resolution=0.01,command=print_selection)
#s.pack()
#
#
#
#window.mainloop()
# =============================================================================
# #示例6:Checkbutton勾选项按钮
# #主窗体Tk、显示标签Label、勾选项按钮Checkbutton
# =============================================================================
#import tkinter as tk
#
##创建主窗体
#window=tk.Tk()
#window.title('Checkbutton勾选项')
#window.geometry('600x300')
#
#
##创建标签 用于显示
#l=tk.Label(window, bg='yellow', width=20, text='empty')
#l.pack()
#
#
##创建函数 定义按钮事件
#def print_selection():
# if(var1.get()==1) & (var2.get()==0): #如果选择了var1
# l.config(text='I love only Python')
# elif(var1.get()==0 & var2.get()==1): #如果选择了var2
# 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')
#
##创建勾选项按钮 Checkbutton
#var1=tk.IntVar()
#c1=tk.Checkbutton(window, text='python', variable=var1, onvalue=1, offvalue=0, command=print_selection)
#c1.pack()
#
#var2=tk.IntVar()
#c2=tk.Checkbutton(window, text='C++', variable=var2, onvalue=1, offvalue=0, command=print_selection)
#c2.pack()
#
#
#
#window.mainloop()
# =============================================================================
# #示例7:Canvas画布
# #主窗体Tk、画布部件Canvas、新建:图像create_image、直线create_line、圆形create_oval、扇形、矩形等
# #添加画布部件按钮事件 移动画布上部件canvas.move(,,,)
# =============================================================================
#import tkinter as tk
#
#
#window=tk.Tk()
#window.title('Canvas画布')
#window.geometry('600x500')
#
#
##创建画布部件 Canvas
#canvas=tk.Canvas(window, bg='blue', height=200,width=400)
#canvas.pack()
#
##画布上新建一个图像
#image_file=tk.PhotoImage(file='图片\\ins.gif')
#image=canvas.create_image(10, 10, anchor='nw', image=image_file) #参数10,10为画布坐标;anchor='nw'为图片左上角锚点
#
##画布上新建一条直线
#x0,y0,x1,y1=50,50,80,80
#line=canvas.create_line(x0,y0,x1,y1) #新建直线,参数为坐标(x0,y0) 到 坐标(x1,y1)
#
##画布上新建一个圆形
#oval=canvas.create_oval(150,150,180,180,fill='red') #新建圆形,填充色红色
#
##画布上新建一个扇形
#arc=canvas.create_arc(150,150,180,180,start=0,extent=90) #新建扇形 度数从0度画到90度
#
##画布上新建一个矩形
#rect=canvas.create_rectangle(100,30,120,60) #新建矩形 参数定义左上、右下。
#
#
##创建函数 定义移动rect矩形移动事件
#def moveit():
# canvas.move(rect,0,2)
#
#
##创建按钮 添加事件移动矩形
#b1=tk.Button(window, text='Move', width=15,height=2, command=moveit)
#b1.pack()
#
#
#
#window.mainloop()
# =============================================================================
# #示例8:Menubar菜单
# #菜单栏Menu、层级菜单add_cascade()、小菜单add_command()、层级层级菜单add_cascade()
# =============================================================================
#import tkinter as tk
#
#
##创建主窗体
#window=tk.Tk()
#window.title('Menubar菜单')
#window.geometry('600x500')
#
#
##创建标签 用来显示
#l=tk.Label(window, text='do nothing', bg='yellow')
#l.pack()
#
#
#
##创建函数 定义点击菜单事件
#counter=0
#def do_job():
# global counter
# l.config(text='do ' + str(counter))
# counter+=1
#
#
#
##首先创建 菜单栏 Menu 在window主窗口上
#menubar=tk.Menu(window) #先创建菜单栏,可以理解成一个容器,在窗口的上方
#
#
############################################################
##然后创建 层级菜单 File 在菜单栏上
#filemenu=tk.Menu(menubar,tearoff=0) #定义一个空菜单单元
#menubar.add_cascade(label='File',menu=filemenu) #添加层级菜单。 即:将上面定义的控菜单命名为 File,放在菜单栏中
#
##创建小菜单 File -> New 即下拉菜单
#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() #添加一条分割线
##创建小菜单 Exit
#filemenu.add_command(label='Exit',command=window.quit)
#
#
##继续创建 层级菜单 Import 在层级菜单File上
#submenu=tk.Menu(filemenu) #定义一个空白菜单单元
#filemenu.add_cascade(label='Import',menu=submenu,underline=0) #给放入的菜单‘submenu’命名为'Import'
#
#submenu.add_command(label='Submenu1',command=do_job)
#
################################################################
#
#
#
#
##最后配置菜单
#window.config(menu=menubar)
#
#
#
#window.mainloop()
# =============================================================================
# #示例9:Frame框架
# #主窗体Tk、主Frame框架Frame(window)、子Frame框架Frame(frame)
# =============================================================================
#import tkinter as tk
#
#window=tk.Tk()
#window.title('Frame框架')
#window.geometry('600x500')
#
##创建标签 在主窗体上
#tk.Label(window, text='on the window').pack()
#
#
##创建主Frame框架 在主窗体上 并显示
#frm=tk.Frame(window).pack()
#
##创建两个子Frame框架 在主Frame框架上
#frm_l=tk.Frame(frm)
#frm_r=tk.Frame(frm)
##指定子Frame框架显示位置
#frm_l.pack(side='left')
#frm_r.pack(side='right')
#
##创建标签 用于显示 在两个子Frame框架上 并显示
#tk.Label(frm_l,text='on the frm_l1').pack()
#tk.Label(frm_l,text='on the frm_l2').pack()
#
#tk.Label(frm_r,text='on the frm_r').pack()
#
#
#
#window.mainloop()
# =============================================================================
# #示例10:Messagebox弹窗
# #提示信息对话框tk.message.showinfo(title='',message='') 以及 其他提示框
# =============================================================================
#import tkinter as tk
#import tkinter.messagebox #注意这里必须引入子模块,否则报错找不到messagebox
#
#
#window=tk.Tk()
#window.title('Messangebox弹窗')
#window.geometry('600x500')
#
#
#
#def hit_me():
# tk.messagebox.showinfo(title='Hi',message='这里是弹窗message...')
#'''
#弹窗的几种形式:
#tk.message.showinfo(title='',message='') #提示信息对话框
#tk.message.showwarning() #提示警告对话框
#tk.message.showerror() #提示错误对话框
#tk.message.askquestion() #询问选择对话框
#'''
#
#
#tk.Button(window, text='hit me', command=hit_me).pack()
#
#
#
#
#window.mainloop()
# =============================================================================
# #示例11:pack、grid、place 放置位置
# #pack显示位置为上下左右、grid矩形显示、place指定位置显示
# =============================================================================
#import tkinter as tk
#
#
#window=tk.Tk()
#window.title('pack、grid、place 放置位置')
#window.geometry('600x500')
#
#
###pack显示位置上下左右
##tk.Label(window,text='1').pack(side='top') #显示位置为 上
##tk.Label(window,text='2').pack(side='bottom') #显示位置为 下
##tk.Label(window,text='3').pack(side='left') #显示位置为 下
##tk.Label(window,text='4').pack(side='right') #显示位置为 下
#
#
###grid矩形显示
###grid参数(行、列、间距、行距)
##for i in range(4):
## for j in range(3):
## tk.Label(window,text='1').grid(row=i, column=j, padx=10, pady=10) #grid参数(行、列、间距、行距)
#
#
##place指定位置显示
##place参数(坐标x,y,锚点左上)
#tk.Label(window,text='1').place(x=100,y=100,anchor='nw')
#
#
#
#window.mainloop()
# =============================================================================
# #例子: 创建登录窗口
# #主窗口Tk、 画布Canvas(上方图片背景)、 显示标签Label(提示用户名密码)、 输入框Entry(输入用户名密码)、 按钮Button(点击登录)
# =============================================================================
import tkinter as tk
import tkinter.messagebox
import pickle
#创建主窗体 登录窗口的大小
window=tk.Tk()
window.title('登录窗口1')
window.geometry('450x300')
#创建画布Canvas 用来作为背景色或图片背景 延伸:换背景
canvas=tk.Canvas(window,width=450,height=200) #创建画布
image_file=tk.PhotoImage(file='图片\\welcome.gif') #图像操作
image=canvas.create_image(0,0,anchor='nw',image=image_file) #添加图像到画布
canvas.pack(side='top') #画布显示窗口上方
#创建标签Label 用来显示登录名和密码框等提示效果
tk.Label(window,text='User name: ').place(x=50,y=150) #创建标签 用于显示登录名
tk.Label(window,text='Pass word: ').place(x=50,y=190) #创建标签 用于显示密码框
#创建输入框Entry 用来跟随在标签名后面输入效果
var_usr_name=tk.StringVar() #定义变量
var_usr_name.set('[email protected]') #变量赋值
entry_usr_name=tk.Entry(window, textvariable=var_usr_name ) #创建一个输入框
entry_usr_name.place(x=160,y=150)
var_usr_pwd=tk.StringVar()
entry_usr_pwd=tk.Entry(window, textvariable=var_usr_pwd, show='*') #show参数将密码变成其他字符
entry_usr_pwd.place(x=160,y=190)
#创建函数 定义点击事件
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) #pickle.load()读取序列化数据,从文件中读取
except:
#创建文件,并写入字典数据
with open('usrs_info.pickle','wb') as usr_file:
usrs_info={'admin':'admin'}
pickle.dump(usrs_info,usr_file) #pickle.dump(,)存储序列化数据 到执行文件
if usr_name in usrs_info:
if usr_pwd == usrs_info[usr_name]:
tk.messagebox.showinfo(title='Welcome',message='How are you ? '+ usr_name)
else:
tk.messagebox.showerror(message='Error,your password is wrong, try again...')
else:
is_sign_up=tk.messagebox.askyesno('Welcome',
'U have not sign up yet, Sign up today?')
if is_sign_up:
usr_sign_up()
#创建函数 定义点击 注册按钮事件
def usr_sign_up():
#首先函数内 设置注册窗口 即在函数内定义窗口,注册事件执行后弹出此窗口 没有 window.mainloop()操作
window_sign_up=tk.Toplevel(window)
window_sign_up.title('注册窗口')
window_sign_up.geometry('350x200')
#注册窗口内 创建用户名标签、创建用户名输入框
tk.Label(window_sign_up, text='User name: ').place(x=10,y=10)
new_name=tk.StringVar()
new_name.set('[email protected]')
entry_new_name=tk.Entry(window_sign_up, textvariable=new_name)
entry_new_name.place(x=150,y=10)
#注册窗口内 创建密码标签、创建密码输入框
tk.Label(window_sign_up, text='Pass word: ').place(x=10,y=50)
new_pwd=tk.StringVar()
entry_usr_pwd=tk.Entry(window_sign_up, textvariable=new_pwd, show='*')
entry_usr_pwd.place(x=150,y=50)
#注册窗口内 创建再次输入密码标签、创建再次输入密码输入框
tk.Label(window_sign_up, text='Confirm Password: ').place(x=10,y=90)
new_pwd_confirm=tk.StringVar()
entry_usr_pwd_confirm=tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*')
entry_usr_pwd_confirm.place(x=150,y=90)
#函数内创建函数 定义点击 注册窗口内的 注册按钮事件
def sign_to_Mofan_Python():
#获取注册窗口内输入的 注册用户名、注册密码、再次输入的注册密码
nn=new_name.get()
np=new_pwd.get()
npf=new_pwd_confirm.get()
#打开文件 读取序列化数据文件
with open('usrs_info.pickle','rb') as usr_file:
exist_usr_info=pickle.load(usr_file)
#如果注册密码 和 再次输入的注册密码 不一致,则弹出错误提示框。
if np != npf:
tk.messagebox.showerror('Error','Password and confirm password must be the same!')
#如果注册用户名 已经存在于 序列化数据 中,则弹出错误提示框。
elif nn in exist_usr_info:
tk.messagebox.showerror('Error','此用户名已被注册...')
#除以上情况外,则将注册用户名和密码 写入字典数据,并存储此字典数据为序列化数据到文件,另外弹出信息提示框。
else:
exist_usr_info[nn]=np
with open('usrs_info.pickle','wb') as usr_file:
pickle.dump(exist_usr_info,usr_file)
tk.messagebox.showinfo('Welcome','注册成功!')
#注册窗口消失
window_sign_up.destroy()
#注册窗口内创建提交注册按钮 用来点击提交注册内容
btn_confirm_sign_up= tk.Button(window_sign_up, text='Sign up', command=sign_to_Mofan_Python)
btn_confirm_sign_up.place(x=150,y=130)
#创建按钮Button 用来准备执行事件
btn_login=tk.Button(window, text='Login', command=usr_login)
btn_login.place(x=160,y=230)
btn_sign_up=tk.Button(window,text='Sign up', command=usr_sign_up)
btn_sign_up.place(x=250,y=230)
window.mainloop()