python学习笔记-tkinter

import tkinter

tkinter._test()
import tkinter

base = tkinter.Tk()


base.mainloop()

Tkinter常用组件

  • 按钮

      Button				按钮组件
      RadioButton			单选框组件
      CheckButton			选择按钮组件
      Listbox				列表框组件
    
  • 文本输入组件

      Entry				单行文本框组件
      Text				多行文本框组件
    
  • 标签组件

      Label				标签组件,可以显示图片和文字
      Message				标签组件,可以根据内容将文字换行
    
  • 菜单

      Menu				菜单组件
      MenuButton			菜单按钮组件,可以使用Menu代替
    
  • 滚动条

      scale				滑块组件
      Scrollbar			滚动条组件
    
  • 其他组件

     Canvas				画布组件
     Frame				框架组件,将多个组件编组
     Toplevel			创建子窗口容器组件
    

组件的大致使用步骤

  1. 创建总面板

  2. 创建面板上的各种组件

    1. 指定组件的父组件,即依附关系
    2. 利用相应的属性对组件进行设置
    3. 给组件安排布局
  3. 同步骤2相似,创建好多个组件

  4. 最后,启动总面板的消息循环

import tkinter
# 创建总面板
base = tkinter.Tk()
# 标题
base.wm_title('标题')

lb = tkinter.Label(base, text='Python label')
lb.pack()

# 消息循环
base.mainloop()
# Label

import tkinter

base = tkinter.Tk()
base.wm_title('标题')

lb1 = tkinter.Label(base, text='lb1文字内容').pack()
lb2 = tkinter.Label(base, text='红色背景', background='red').pack()
lb3 = tkinter.Label(base, text='蓝色背景', background='blue').pack()

base.mainloop()
# Button

import tkinter

def showlb1():
    global base
    lb1 = tkinter.Label(base, text='用函数调用').pack()
    
base = tkinter.Tk()
# 生成一个按钮
# command参数指示,当按钮被按下时,执行哪个函数
btn = tkinter.Button(base, text='showlb1', command=showlb1).pack()

base.mainloop()
  • Button的属性:

      anchor 				设置按钮中文字的对其方式,相对于按钮的中心位置
      background(bg) 		设置按钮的背景颜色
      foreground(fg)		设置按钮的前景色(文字的颜色)
      borderwidth(bd)		设置按钮边框宽度
      cursor				设置鼠标在按钮上的样式
      command				设定按钮点击时触发的函数
      bitmap				设置按钮上显示的位图
      font				设置按钮上文本的字体
      width				设置按钮的宽度  (字符个数)
      height				设置按钮的高度  (字符个数)
      state				设置按钮的状态
      text				设置按钮上的文字
      image				设置按钮上的图片
    
  • 鼠标样式

    • “arrow”“circle”“clock”“cross”“dotbox”“exchange”“fleur”“heart”“heart”“man”“mouse”
    • “pirate”“plus”“shuttle”“sizing”“spider”“spraycan”“star”“target”“tcross”“trek”“watch”
# Button

import tkinter

def showlb1():
    global base
    lb1 = tkinter.Label(base, text='用函数调用').pack()
    
base = tkinter.Tk()
# 生成一个按钮
# command参数指示,当按钮被按下时,执行哪个函数
btn = tkinter.Button(base, text='showlb1', command=showlb1, bg='black', fg='white', bd=10, cursor='circle').pack()
base.mainloop()

组件布局

  • 控制组件的摆放方式

  • 三种布局:

    • pack: 按照方位布局
    • place:按照坐标布局
    • grid: 网格布局
  • pack布局

    • 最简单,代码量最少,挨个摆放,默认从上到下
    • 通用使用方式:组件对象.pack(设置属性)
    • side 停靠方位,可选值:left,top,right,bottom
    • fill 填充方式: x,y,both,none
    • expand:yes/no
    • anchor:n, ne, e, se, s, sw, w, nw, or center
    • ipadx:x方向内边距
    • ipady:y方向内边距
    • padx:x方向外边界
    • pady:y方向外边界
  • grid布局

    • 通用使用方式:组件对象.grid(设置,)
    • 利用row,column编号,都是从0开始
    • sticky: N,E,S,W表示上下左右,用来决定组件从哪个方向开始
    • 支持ipadx,padx等参数,跟pack函数含义一样
    • 支持rowspan,columnspan,表示跨行,跨列数量
  • place布局

    • 明确方位的摆放
    • 相对位置布局,随意改变窗口大小会导致混乱
    • 使用place函数,分为绝对布局和相对布局,绝对布局使用x,y参数
    • 相对布局使用relx,rely, relheight, relwidth
# pack布局
import tkinter

base = tkinter.Tk()
btn1 = tkinter.Button(base, text=1, bg='yellow')
btn1.pack(side='left', expand='yes',fill='both', anchor='nw')

btn2 = tkinter.Button(base,text=2)
btn2.pack(side='bottom', expand='no',fill='y', anchor='sw' )

btn3 = tkinter.Button(base,text=3)
btn3.pack(side='top', expand='yes',fill='both', anchor='n')

btn4 = tkinter.Button(base,text=4)
btn4.pack(side='right', expand='yes',fill='both',)

btn5 = tkinter.Button(base,text=5)
btn5.pack(side='left', expand='yes',fill='both',)

btn6 = tkinter.Button(base,text=6)
btn6.pack(side='left', expand='yes',fill='both',)

base.mainloop()
# grid布局
import tkinter

base = tkinter.Tk()
lb1 = tkinter.Label(base, text='账号:')
lb1.grid(row=0, sticky='w')

en = tkinter.Entry(base)
en.grid(row=0, column=1, sticky='e')

lb2 = tkinter.Label(base, text='密码:')
lb2.grid(row=1, sticky='w')

en = tkinter.Entry(base)
en.grid(row=1, column=1, sticky='e')

btn = tkinter.Button(base, text='登录').grid(row=2,column=1,sticky='e')


base.mainloop()

消息机制

  • 消息的传递机制
    • 自动发出事件/消息
    • 消息有系统负责发送到队列
    • 由相关组件进行绑定/设置
    • 后端自动选择感兴趣的事件并做出相应反应
# 消息机制

import tkinter

def baselabel(event):
    global base
    lb = tkinter.Label(base, text='i love python')
    lb.pack()

base = tkinter.Tk()
lb = tkinter.Label(base, text='模拟按钮')
# label绑定相应的消息和处理函数
# 自动获取左键点击,并启动相应的处理函数baseLabel
lb.bind('', baselabel)
lb.pack()

base.mainloop()

Tkinter的绑定

  • bind_all: 全局范围的绑定,默认的是全局快捷键,比如F1是帮助文档
  • bind_class: 接受三个参数,第一个是类名,第二个是事件,第三个是操作
    • w.bind_class(“Entry”, ", my_paste)
  • bind:单独对某一个实例绑定
  • unbind: 解绑,需要一个参数,即你要解绑哪个事件

Entry

  • 输入框,功能单一
  • entry[“show”] = “*”, 设置遮挡字符
import tkinter

# 登录模拟
def reg():
    # 从输入框中获取用户输入消息
    name = en1.get()
    pwd = en2.get()
    
    t1 = len(name)
    t2 = len(pwd)
    
    if name == 'admin' and pwd == 'password':
        lb3['text'] = '登录成功'
    else:
        lb3['text'] = '用户名或密码错误'
        # 输入框删除掉用户输入的内容
        # 注意delete的两个参数,表示从第几个删除到第几个
        en1.delete(0,t1)
        en2.delete(0,t2)

base = tkinter.Tk()

lb1 = tkinter.Label(base, text='账号:')
lb1.grid(row=0, sticky='w')

en1 = tkinter.Entry(base)
en1.grid(row=0, column=1, sticky='e')

lb2 = tkinter.Label(base, text='密码:')
lb2.grid(row=1, sticky='w')

en2 = tkinter.Entry(base)
en2.grid(row=1, column=1, sticky='e')
en2['show'] = '*'

btn = tkinter.Button(base, text='登录', command=reg)
btn.grid(row=2, column=1,sticky='e')

lb3 = tkinter.Label(base, text='')
lb3.grid(row = 3)

base.mainloop()

菜单

1. 普通菜单

  • 第一个Menu类定义的是parent
  • add_command 添加菜单项,如果菜单是顶层菜单,则从左向右添加,否则就是下拉菜单
    • label: 指定菜单项名称
    • command: 点击后相应的调用函数
    • acceletor: 快捷键
    • underline: 制定是否菜单信息下有横线
    • menu:属性制定使用哪一个作为顶级菜单
import tkinter

base = tkinter.Tk()
menubar = tkinter.Menu(base)

for item in ['File', 'Edit', 'View', 'About']:
    menubar.add_command(label=item)
    
base['menu'] = menubar

base.mainloop()

级联菜单

  • add_cascade:级联菜单,作用是引出后面的菜单
  • add_cascade的menu属性:指明把菜单级联到哪个菜单上
  • label: 名称
  • 过程:
    1. 建立menu实例
    2. add_command
    3. add_cascade
import tkinter

base = tkinter.Tk()

menubar = tkinter.Menu(base)

emenu = tkinter.Menu(menubar)
for item in ['Copy', 'Past', 'Cut']:
    emenu.add_separator()
    emenu.add_command(label=item)

menubar.add_cascade(label='File')
menubar.add_cascade(label='Edit', menu=emenu)
menubar.add_cascade(label='About')

base['menu'] = menubar

base.mainloop()

弹出式菜单

  • 弹出菜单也叫上下文菜单
  • 实现的大致思路
    1. 简理财单并向菜单添加各种功能
    2. 监听鼠标右键
    3. 如果右键点击,则根据位置判断弹出
    4. 调用Menu的pop方法
  • add_separator: 添加分隔符
import tkinter

def makeLabel():
    global base
    lb1 = tkinter.Label(base, text='I Love Python').pack()
    
base = tkinter.Tk()
menubar = tkinter.Menu(base)
for x in ['香菇鸡块', '蒜苔腊肉', '东坡肘子']:
    menubar.add_separator()
    menubar.add_command(label=x)
    
menubar.add_command(label='麻辣香锅', command=makeLabel)

# 事件处理函数一定要至少有一个参数,且第一个参数表示的是系统事件
def pop(event):
    # 注意使用 event.x 和 event.x_root的区别 
    #menubar.post(event.x_root, event.y_root)
    menubar.post(event.x_root, event.y_root)
    
base.bind('', pop)
base.mainloop()

canvas 画布

  • 画布: 可以自由的在上面绘制图形的一个小舞台
  • 在画布上绘制对象, 通常用create_xxxx,xxxx=对象类型, 例如line,rectangle
  • 画布的作用是把一定组件画到画布上显示出来
  • 画布所支持的组件:
    • arc
    • bitmap
    • image(BitmapImage, PhotoImage)
    • line
    • oval
    • polygon
    • rectangle
    • text
    • winodw(组件)
  • 每次调用create_xxx都会返回一个创建的组件的ID,同时也可以用tag属性指定其标签
  • 通过调用canvas.move实现一个一次性动作
import tkinter

base = tkinter.Tk()
cvs = tkinter.Canvas(base, width=300, height=200)
cvs.pack()

cvs.create_line(23,23, 190,234)
cvs.create_text(56,67, text='I Love Python')

base.mainloop()
import tkinter
import math as m

base = tkinter.Tk()
w = tkinter.Canvas(base, width=300, height=300, bg='black')
w.pack()

center_x = 150
center_y = 150
r = 150

points = [
        #左上点
        center_x - int(r * m.sin(2 * m.pi / 5)),
        center_y - int(r * m.cos(2 * m.pi / 5)),

        #右上点
        center_x + int(r * m.sin(2 * m.pi / 5)),
        center_y - int(r * m.cos(2 * m.pi / 5)),

        #左下点
        center_x - int(r * m.sin( m.pi / 5)),
        center_y + int(r * m.cos( m.pi / 5)),

        #顶点
        center_x,
        center_y - r,

        #右下点
        center_x + int(r * m.sin(m.pi / 5)),
        center_y + int(r * m.cos(m.pi / 5)),
    ]

# 创建一个多边形
w.create_polygon(points, outline='white', fill='red')
w.create_text(150,150, text="五角星")

base.mainloop()
import tkinter

base = tkinter.Tk()

def btnClick(event):
        global  w
        w.move(id_ball, 10,5)
        w.move("fall", 2,7)



w = tkinter.Canvas(base, width=500, height=400)
w.pack()
w.bind("", btnClick)

# 创建组件后返回id
id_ball  = w.create_oval(20,20, 50,50, fill="green")

# 创建组件使用tag属性
w.create_text(123,56, fill="red", text="ILovePython", tag="fall")
# 创建的时候如果没有指定tag可以利用addtag_withtag添加
# 同类函数还有 addtag_all, addtag_above, addtag_xxx等等
id_rectangle = w.create_rectangle(56,78,173,110, fill="gray")
w.addtag_withtag("fall", id_rectangle)


base.mainloop()

你可能感兴趣的:(python,tkinter)