莫烦python之tkinter窗口

参考:https://morvanzhou.github.io/tutorials/python-basic/tkinter/1-1-why/


Tkinter 是使用 python 进行窗口视窗设计的模块.
简单的构造, 多平台, 多系统的兼容性, 能让它成为让你快速入门定制窗口文件的好助手.
它在 python 窗口视窗模块中是一款简单型的. 所以用来入门, 熟悉 窗口视窗的使用, 非常有必要.

import tkinter as tk

一、Label & Button 标签和按钮
    代码效果:点击按钮,标签显示不同内容
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('300x100')  #定义窗口大小

    var = tk.StringVar()
    l = tk.Label(window,                 #定义一个在window上面的label
            textvariable=var,      # 标签的文字,是个字符串变量
            bg='green',                     # 背景颜色
            font=('Arial', 12),             # 字体和字体大小
            width=15, height=2              # 标签长宽
        )
    l.pack()    # 固定窗口位置,l.space()设置点位置
    on_hit = False          #全局变量控制显示

    def hit_me():
            global on_hit
            if on_hit ==False:
                var.set('you hit me')
                on_hit = True
           else:
                var.set('')
                on_hit = False

    b = tk.Button(window,text='hit me',width=15,
              height=2,command=hit_me)
    b.pack()

    window.mainloop()           #window不断刷新

二、Entry & Text 输入, 文本框
    代码效果:entry输入的文字通过button点击显示在text中
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('300x200')  #定义窗口大小

    e = tk.Entry(window,show=None)  #显示字符,show='*'输入的字符显示为*
    e.pack()

    def insert_point():
            var = e.get()   #获取Entry的值
            t.insert('insert',var)      #插到光标之前,如果是insert(1.1,var)表示插入第一行第一列
    def insert_end():
            var = e.get()
            t.insert('end',var)         #插到文本最后之前

    b1 = tk.Button(window,text='insert_point',width=15,
              height=2,command=insert_point)
    b1.pack()
    b2 = tk.Button(window,text='insert_end',width=15,
              height=2,command=insert_end)
    b2.pack()

    t = tk.Text(window,height=2)
    t.pack()

    window.mainloop()           #window不断刷新

三、Listbox 列表部件
    代码效果:选中列表,显示在某个地方
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('300x200')  #定义窗口大小

    var1 = tk.StringVar()
    l = tk.Label(window,bg='yellow',width=4,textvariable=var1)
    l.pack()

    def print_selection():
            value = lb.get(lb.curselection())       #拿出选中的listbox的值
            var1.set(value)                         #放到label中

    b1 = tk.Button(window,text='print selection',width=15,
              height=2,command=print_selection)
    b1.pack()

    var2 = tk.StringVar()
    var2.set((11,22,33,44,55))
    lb = tk.Listbox(window,listvariable=var2)
    list_items = [1,2,3,4]
    for item in  list_items:        #插入列表到listbox
            lb.insert('end',item)
    lb.insert(1,'first')
    lb.insert(2,'second')
    lb.delete(2)                    #删除
    lb.pack()

    window.mainloop()           #window不断刷新

四、Radiobutton 选择按钮
    代码效果:单选按钮改变label内容
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('300x200')  #定义窗口大小

    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())      #l的参数进行改变
    r1 = tk.Radiobutton(window,text='Option A',
                    variable=var,value='A',     #选中该按钮时把var赋值为A
                    command=print_selection)
    r2 = tk.Radiobutton(window,text='Option B',
                    variable=var,value='B',
                    command=print_selection)
    r3 = tk.Radiobutton(window,text='Option C',
                    variable=var,value='C',
                    command=print_selection)
    r1.pack()
    r2.pack()
    r3.pack()

    window.mainloop()           #window不断刷新

五、Scale 尺度 类似一个数字滚动条
    代码效果:拉动滚动条,选中一个数字
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('300x200')  #定义窗口大小

    l = tk.Label(window,bg='yellow',width=20,text='empty')
    l.pack()

    def print_selection(v):
            l.config(text='you have selected ' + v)      #l的参数进行改变

    s = tk.Scale(window,label='try me',         #名字
             from_=5,to=11,                 #范围
             orient=tk.HORIZONTAL,          #横向
             length=200,                    #长度
             showvalue=1,                   #显示值
             tickinterval=3,                #隔单位显示
             resolution=0.1,                #保留的小数
             command=print_selection        #有个默认的传入值
             )
    s.pack()

    window.mainloop()           #window不断刷新

六、Checkbutton 勾选项:与Radiobutton类似,复选按钮
    代码效果:多选效果
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('300x200')  #定义窗口大小

    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,#选中赋值1,未选中赋值0
                    command=print_selection)
    c2 = tk.Checkbutton(window, text='Java', variable=var2, onvalue=1, offvalue=0,
                    command=print_selection)
    c1.pack()
    c2.pack()

    window.mainloop()           #window不断刷新

七、Canvas画布:在一个区域放图画,并更换位置形状等,好像只能放gif图片
    代码效果:点击按钮移动正方形
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('500x500')  #定义窗口大小

    canvas = tk.Canvas(window,bg='green',height=300,width=500)
    image_file = tk.PhotoImage(file='G:\canvas.gif')
    image =canvas.create_image(0,0,anchor='nw',image=image_file)     #把图片放到哪个点,起点是西北

    x0,y0,x1,y1=300,200,380,280     #坐标
    line = canvas.create_line(x0,y0,x1,y1)
    oval = canvas.create_oval(x0,y0,x1,y1,fill='red')
    arc = canvas.create_arc(x0-80,y0+30,x1-80,y1+30,start=0,extent=180) #扇形打开的角度
    rect = canvas.create_rectangle(100,200,180,280)
    canvas.pack()

    def moveit():
            canvas.move(rect,0,2)   #移动rect元素,x移动0,y移动2
    b = tk.Button(window,text='move',command=moveit).pack()

    window.mainloop()           #window不断刷新

八、Menubar 菜单:窗口菜单按钮
    代码效果:点击菜单数字累加
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('500x500')  #定义窗口大小

    l = tk.Label(window,text='',bg='yellow')
    l.pack()
    counter = 0

    def do_job():
            global counter
            l.config(text='do '+ str(counter))  #把counter转为字符串
            counter+=1

    menubar = tk.Menu(window)
    filemenu = tk.Menu(menubar, tearoff=0)   #traroff表示能否分开
    menubar.add_cascade(label='File', menu=filemenu) #filemenu名字为file,添加到menubar上
    filemenu.add_command(label='New', command=do_job)    #给filemenu绑定方法
    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)   #traroff表示能否分开
    menubar.add_cascade(label='Edit', menu=editmenu) #filemenu名字为file,添加到menubar上
    editmenu.add_command(label='Cut', command=do_job)    #给filemenu绑定方法
    editmenu.add_command(label='Cop', command=do_job)
    editmenu.add_command(label='Paste', command=do_job)


    submenu = tk.Menu(filemenu)##和上面定义菜单一样,不过此处实在`File`上创建一个空的菜单
    filemenu.add_cascade(label='Import', menu=submenu, underline=0)##给放入的菜单`submenu`命名为`Import`
    submenu.add_command(label="Submenu1", command=do_job)##这里和上面也一样,在`Import`中加入一个小菜单命令`Submenu1`


    window.config(menu=menubar) #改变window的参数设置menu

    window.mainloop()           #window不断刷新

九、Frame 框架:容器, Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件
    代码效果:不同frm放到不同位置
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('200x100')  #定义窗口大小

    tk.Label(window,text='on the window').pack()

    frm = tk.Frame(window).pack()

    frm_l = tk.Frame(frm)
    frm_r = tk.Frame(frm)

    ###这里是控制小的`frm`部件在大的`frm`的相对位置,此处`frm_l`就是在`frm`的左边,`frm_r`在`frm`的右边
    frm_l.pack(side='left')
    frm_r.pack(side='right')
    
    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_r1').pack()
    window.mainloop()           #window不断刷新

十、messagebox 弹窗,消息窗口,注意要单独导入import tkinter.messagebox
    代码效果:点击按钮弹窗
    import tkinter.messagebox
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('200x100')  #定义窗口大小

    def hit_me():
    #    print(tk.messagebox.askokcancel("askokcancel Demo", '发射导弹?'))      #return true or false
    #    print(tk.messagebox.askquestion("askquestion Demo", "买个优盘?"))     #询问信息:return 'yes' or 'no'
            print(tk.messagebox.askretrycancel("askretrycancel Demo", "启动失败,重试?"))    #return true or false
    #    print(tk.messagebox.askyesno("askyesno Demo", "我帅吗?"))                #return true or false
    #    tk.messagebox.showerror("showerror Demo", "出错啦!")          #错误
    #    tk.messagebox.showinfo("showinfo Demo", "新年快乐")            #信息提示
    #    tk.messagebox.showwarning("showwarning Demo", "你在偷懒!")     #警告

    tk.Button(window,text='hit me',command=hit_me).pack()

    window.mainloop()           #window不断刷新

十一、pack grid place 放置位置
    代码效果:不同形式不同效果
    import tkinter as tk

    window = tk.Tk()            #定义窗口
    window.title('my window')   #定义窗口名
    window.geometry('400x400')  #定义窗口大小

    # #pack()通过side设置上下左右
    # tk.Label(window,text=1).pack()
    # tk.Label(window,text=1).pack(side='top')
    # tk.Label(window,text=1).pack(side='bottom')
    # tk.Label(window,text=1).pack(side='left')
    # tk.Label(window,text=1).pack(side='right')

    # #网格形式设置
    # for i in range(4):
    #     for j in range(3):
    #         tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)    #row为行,colum为列,padx就是单元格左右间距,pady就是单元格上下间距。

    #place放置点
    tk.Label(window,text=1).place(x=10,y=100,anchor='w')   #anchor设置方位

    window.mainloop()           #window不断刷新


猜你喜欢

转载自blog.csdn.net/qq_20367813/article/details/79788427