tkinter模块 视窗设计相关操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_44015805/article/details/98972503
# -*- 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()









猜你喜欢

转载自blog.csdn.net/weixin_44015805/article/details/98972503