Tkinter 2. 控件(非常齐全、详细)

前言

如果有些参数不理解,可以先看看第一篇Tkinter 1. 基本介绍(尽量先看这篇,以免下面很多参数看不懂。)


(不知道怎么在简书实现页内跳转目录,百度了半天也没有结果,知道的,可以在评论区写出来,我修改一下,内容太多,没有目录跳转,看着会很难受!谢谢!)


目录:

  1. Button 按钮
  2. Checkbutton 多选按钮
  3. Radiobutton 单选按钮
  4. Entry 输入框
  5. Spinbox 限制范围的输入框
  6. Text 文本框
  7. Label 标签
  8. Listbox 列表框
  9. Combobox 下来列表框(ttk)
  10. Frame 框架
  11. Labelframe 可以添加标签的框架
  12. Panedwindow 窗格窗口,就是把窗口分区
  13. Separator 分割线(ttk)
  14. Notebook 标签页(ttk)
  15. Scale 滑块
  16. Scrollbar 滚动条
  17. Progressbar 进度条(ttk)
  18. Menu 菜单
  19. sizegrip 窗口大小拖动块(ttk)
  20. Treeview 树状结构查看器(ttk)
  21. Canvas 画布

Button 按钮

参数

之前未提参数说明

参数 说明
repeatdelay 重复延迟
repeatinterval 重复间隔
command 添加调用多函数,当点击按钮调用该函数
default 指定按钮默认的状态:normal, active, or disabled.
overrelief 跟relief的设置一样,只不过这个是当鼠标移到按钮上才显示样式

实例

import tkinter as tk

root = tk.Tk()

root.geometry('600x400+200+200')

root.title('test app')

mystr = tk.StringVar()

tk.Label(root,
        textvariable=mystr,
        width=20,
        height=3,
        bg='#e33e31').pack()

tag = False
def show():
    global tag
    if tag == False:
        mystr.set('you click!')
        tag = True
    else:
        mystr.set('')
        tag = False

btn = tk.Button(root,
                bd=15,
                text='Click',
                width=10,
                font=('"Microsoft Yahei',20,'bold'),
                relief='sunken',
                bg='#575757',
                fg='white',
                command=show).pack()


root.mainloop()

Checkbutton 多选按钮

参数

之前未提参数说明

参数 说明
indicatoron 选择方法:如果是True就是☑️的选择方法,如果是False,就是按钮的选择方法,而且relief是:sunken
onvalue / offvalue 勾选选项 和取消勾选时输出的值

实例

import tkinter as tk
import tkinter.messagebox


root = tk.Tk()

root.geometry('600x400')

frm = tk.LabelFrame(root,
                    text='喜欢的编程语言',
                    padx=10,
                    pady=10)
                
frm.pack()

var_p = tk.IntVar()
var_j = tk.IntVar()

def check():
    if (var_p.get() == 1) & ( var_j.get() == 1) :
        tkinter.messagebox.showinfo(message='我喜欢python,也喜欢Java')
    elif (var_p.get() == 1) & (var_j.get() == 0) :
        tkinter.messagebox.showinfo(message='我只喜欢python')
    elif (var_p.get() == 0) & (var_j.get() == 1) :
        tkinter.messagebox.showinfo(message='我只喜欢Java')
    else:
        tkinter.messagebox.showinfo(message='我两个都不喜欢')


btn1 = tk.Checkbutton(frm,text='Python',variable=var_p,onvalue=1,offvalue=0,command=check)
btn2 = tk.Checkbutton(frm,text='Java',variable=var_j,onvalue=1,offvalue=0,command=check)

btn1.grid(row=0,column=0)
btn2.grid(row=0,column=1)


root.mainloop()

Radiobutton 单选按钮

参数

之前未提参数说明

参数 说明
indicatoron 选择方法:如果是True就是☑️的选择方法,如果是False,就是按钮的选择方法,而且relief是:sunken

实例

import tkinter as tk
import tkinter.messagebox


root = tk.Tk()

root.geometry('600x400')

frm = tk.LabelFrame(root,
                    text='性别',
                    padx=10,
                    pady=10)

frm.pack()



var_r = tk.IntVar()


def radio():
    if var_r.get() == 1:
        tkinter.messagebox.showinfo(message='你是男的')
    else:
        tkinter.messagebox.showinfo(message="你是女的")


rdo = tk.Radiobutton(frm,text='男',variable=var_r,value=1,command=radio)
rdo2 = tk.Radiobutton(frm,text='女',variable=var_r,value=0,command=radio)

rdo.grid(row=0,column=0)
rdo2.grid(row=1,column=0)



root.mainloop()

Entry 输入框

参数

之前未提参数说明

参数 说明
validate 发生某些动作
validatecommand or vcmd 发生某些动作时,触发该函数
show 适用于输入密码的输入框,当show="*"时,输入密码的时候,不会显示实际内容,只显示*
validate

当输入框获得焦点或者失去焦点等,触发validatecommand上的函数,下面的英语特别简单就不翻了。

输入框中输入内容的索引

  1. 直接用数字表示,0表示第一个字符、1表示第二个字符,以此类推
  2. 'end' 表示输入内容的最后一个字符
  3. ‘insert' 指示与插入光标相邻并紧随其后的字符

常用的函数

  • delete(first, last) 从first删到last (删除内容)
  • insert(index, string) 在索引指示的字符之前插入字符串的字符 (添加内容)
  • get() 获取输入框的内容 (获取内容)

实例

import tkinter as tk
import tkinter.messagebox


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.geometry('600x400')
        self.set_widget()
        self.bind_event()
        self.mainloop()

    def set_widget(self):

        self.frm = tk.Frame(self,pady=40)
        self.frm.pack()

        tk.Label(self.frm,text='账号').grid(row=0,column=0,pady=10,padx=10)
        tk.Label(self.frm,text='密码').grid(row=1,column=0,pady=10)

        self.name = tk.StringVar()
        self.name.set('请输入邮箱或者手机号')

        self.ety_name = tk.Entry(self.frm,
                                 width=25,
                                 textvariable=self.name,
                                 font=("Microsoft Yahei",8,'italic'),
                                 fg='gray')        
                             
        self.ety_name.grid(row=0,column=1,columnspan=3)



        self.ety_pwd = tk.Entry(self.frm,
                                show='*',
                                width=25,
                                font=("Microsoft Yahei",8))
        self.ety_pwd.grid(row=1,column=1,columnspan=3)

        self.btn_write = tk.Button(self.frm,text='写入',width=5,command=self.write)
        self.btn_write.grid(row=2,column=3)

        self.btn_clear = tk.Button(self.frm,text='删除',width=5,command=self.clear)
        self.btn_clear.grid(row=2,column=1)

        self.mystr = tk.StringVar()

        self.ety_show = tk.Entry(self,textvariable=self.mystr,bg='red')
        self.ety_show.pack()


    def bind_event(self):
        """ 绑定事件"""
        self.ety_name.bind('<FocusIn>',self.clear_tip)
        self.ety_name.bind('<FocusOut>',self.add_tip)

    def clear_tip(self,event):
        self.name.set('')

        self.ety_name.config(font=("Microsoft Yahei",8),fg='black')
    def add_tip(self,event):
        
        if self.ety_name.get() == '' :
            self.name.set('请输入邮箱或者手机号')
            self.ety_name.config(font=("Microsoft Yahei",8,'italic'),fg='gray')
            tkinter.messagebox.showerror(title='警告',message='账号不能为空!')
   
    def write(self):
        data = self.ety_name.get()

        self.ety_show.delete(0,'end') # 先清空避免里面有数据
        self.ety_show.insert('end',data)

    def clear(self):
        self.ety_show.delete(0,'end') # 从第一个字符删到最后一个字符



App()

Spinbox 限制范围的输入框

Spinbox 是用来选择一个数值范围内的数字的输入组件

参数

之前未提参数说明

属性 说明
from_ 设置数值范围的最小值
to 设置数值范围的最大值
command 当点击了Spinbox的滑块时触发函数,手动输入值不会触发
format 设置数字格式,比如'%.2f'代表小数点后保留两位小数
values 用from to 只能设置数值,用这个方法就可以选择字符串,如:values=('nan','nv')
validate\validatecommand 同上

实例

import tkinter as tk
import tkinter.messagebox


root = tk.Tk()

root.geometry('600x400')

def show():
    data = sbox.get()
    tkinter.messagebox.showinfo(message=f'you select {data}')

sbox = tk.Spinbox(root,bg='red',from_=0,to=10,command=show,format='%.2f',justify='center')
sbox.pack()



root.mainloop()

Text 文本框

参数

之前未提参数说明

属性 说明
setgrid 确定此小部件是否控制其顶级窗口的调整大小网格
spacing1 在一段没有手动换行的段落前设置行距(当写的内容超过文本框边界而换行的没问题)
spacing2 在一段没有手动换行的段落之间的每一行设置行距
spacing3 在一段没有手动换行的段落后设置行距
tabs tab键的距离
undo 是否有撤销功能,默认True,有撤销功能
autoseparators 是否在撤消堆栈中自动插入分隔符

Text控件中关于index索引

索引 说明
'insert' 光标所在的位置
'current' 与鼠标最近的位置
'end' 文本区域最后一个字符的下一个位置
'line.char' 某一行的某一个字符,行从1开始,字符从0开始,比如‘1.0’表示第一行的第一个字符
"line.end" 表示某一行到末尾的最后一个位置
tag.first tag.last 标签tag的第一个字符,和最后一个字符
mark 表示紧跟在名称为mark 的标记之后的字符

当有选中文本时,还可以使用以下这种索引:
Text对象的get()方法可以取得目前所选的文字,在使用Text文字区域时,如果有选取文字操作发生时,Text的对象会将所选文字的起始索引放在SEL_FIRST,结束索引放在SEL_LAST,将SEL_FIRST和
SEL_LAST当做get方法的参数,就可以获得目前所选的文字了

函数

函数 功能说明
bbox(index) 返回值是一个 4 元组:(x, y, width, height)
compare(index1, op, index2) 返回对比 index1 和 index2 指定的两个字符的结果,op—’<’, ‘<=’, ‘==’, ‘>=’, ‘>’ 或 ‘!=’
delete(index1, index2=None) 删除给定范围的文本或嵌入对象
dlineinfo(index) 返回给定索引指定的字符所在行的边界框,返回值是一个 5 元组:(x, y, width, height, offset),offset 表示从该行的顶端到基线的偏移
dump(index1, index2=None, command=None, **kw) 返回 index1 和 index2 之间的内容 返回的值是一个由 3 元组(关键词,值,索引)组成的列表,关键词参数的顺序为:all, image, mark, tag, text, window ,如果需要筛选个别关键词,可以用 dump(index1, index2, image=True, text=True) 这样的形式调用;如果指定了 command 函数,那么会为列表中的每一个三元组作为参数调用一次该函数(这种情况下,dump() 不返回值
edit_modified(arg=None) 查询和设置 modified 标志
edit_redo() 恢复”上一次的“撤销”操作
edit_reset() 清空存放操作记录的栈
edit_separator() 插入一个“分隔符”到存放操作记录的栈中,用于表示已经完成一次完整的操作
edit_undo() 撤销最近一次操作
get(index1, index2=None) 返回 index1 到 index2(不包含)之间的文本
index(index) 将 index 参数指定的位置以 “line.column” 的索引形式返回
insert(index, chars, *args) 在 index 参数指定的位置插入字符串,参数 tags 用于指定文本的样式
peer_create(self, newPathName, cnf={}, **kw) 用给定的newPathName创建一个同级的文本工具和任何可选的标准配置选项,默认统计文本工具和它的父级工具一样有着相同的起始线和终止线。但是这些可以被标准配置参数重写
peer_names() 返回这个工具的同级工具的列表,不包括这个工具本身
replace(index1, index2, chars, *args) 将 index1 到 index2 之间的内容替换为 chars 参数指定的字符串,如果需要为替换的内容添加 Tag,可以在 args 参数指定 Tag
search(pattern, index, stopindex=None,forwards=None, backwards=None, exact=None,regexp=None, nocase=None, count=None, elide=None) 太长写在下面
see(index) 滚动内容,确保 index 指定的位置可见

search

  • 从 index 开始搜索 pattern,到 stopindex 结束(不指定表示搜索到末尾)
  • 如果成功找到,以 “line.column” 返回第一个匹配的字符;否则返回空字符串
  • forwards 参数设置为 True 表示向前(->)搜索
  • backwards 参数设置为 True 表示向后(<-)搜索
  • exact 参数设置为 True 表示搜索与 pattern 完全匹配的结果
  • regexp 参数设置为 True,则 pattern 被解释为 Tcl 格式的正则表达式
  • nocase 参数设置为 True 是忽略大小写,默认是区分大小写的搜索
  • count 参数指定为一个 IntVar 的 Tkinter 变量,用于存放当找到匹配的字符个数(如果匹配结果中没有嵌入的 image 或 window 对象的话,一般该值等于 pattern 的字符个数)

Tags

1. Tags可以设置的属性

  • background color——背景色
  • bgstipple bitmap——背景位图
  • borderwidth pixels——边框宽度
  • elide boolean——指定是否应该删除数据。已删除的数据(字符、图像、嵌入的窗口等)不显示并且在屏幕上不占用空间,但进一步的行为与普通数据一样
  • fgstipple bitmap——前景位图
  • font fontName——字体
  • foreground color——前景色
  • justify justify——对齐方式 left, right, or center.
  • lmargin1 pixels——第一行左边边距
  • lmargin2 pixels——当一行内容过多而换行,换行的那些行的左边边距
  • lmargincolor color
  • offset pixels——指定文本基线应垂直偏移整行基线的量
  • overstrike boolean——删除线
  • overstrikefg color——删除线颜色
  • relief relief
  • rmargin pixels——右边距
  • rmargincolor color——右边距颜色
  • selectbackground color
  • selectforeground color
  • spacing1 pixels
  • spacing2 pixels
  • spacing3 pixels
  • tabs tabList
  • tabstyle style
  • underline boolean——是否设置下划线
  • underlinefg color——指定显示下划线时使用的颜色
  • wrap mode —— none, char, or word

2. Tags方面的函数

tag_add(tagName, index1, index2...)

  • 为 index1 到 index2 之间的内容添加一个 Tag(tagName 参数指定)
  • 如果 index2 参数忽略,则单独为 index1 指定的内容添加 Tag

tag_bind(tagName, sequence, func, add=None)

  • 给tag绑定事件(sequence)
    • 如 Enter, Leave, ButtonPress, Motion, and KeyPress 等事件
import tkinter as tk
import tkinter.messagebox

root = tk.Tk()

root.geometry('600x400')

tx = tk.Text(root)
tx.pack()

tx.tag_config('tg1',background='red',foreground='white',underline=True)

tx.insert('end','xxxxxxxxxx','tg1')

def show(event):
    tkinter.messagebox.showinfo(message='hello')
tx.tag_bind('tg1','<Enter>',show)


root.mainloop()

tag_unbind(tagName, sequence, funcid=None)

  • 解绑

tag_cget(tagName, option)

  • 返回 tagName 指定的 option 选项的值

tag_config( tagName, cnf=None, **kw)

  • 配置一些属性:背景颜色,前景色,字体等等,可设置的属性在上面有提到
  • 和tag_configure 一样

tag_delete(tagNames)

  • 删除tags

tag_lower(tagName, belowThis=None)

  • 降低 Tag 的优先级
  • 如果 belowThis 参数不为空,则表示 tagName 需要比 belowThis 指定的 Tag 优先级更低

tag_raise(tagName, aboveThis=None)

  • 提升Tag的优先级
  • 如果 aboveThis 参数不为空,则表示 tagName 需要比 aboveThis 指定的 Tag 优先级更高

tag_names(index=None)

  • 返回所有标签名称的列表

tag_nextrange(tagName, index1, index2=None)

  • 在 index1 到 index2 的范围内第一个 tagName 的位置
  • 如果没有则返回空字符串

tag_prevrange(tagName, index1, index2=None)

  • ag_nextrange() 的反向查找,也就是查找范围是 index2 到 index1

tag_ranges(tagName)

  • 返回所有 tagName 指定的文本,并将它们的范围以列表的形式返回

tag_remove(tagName, index1, index2=None)

  • 删除 index1 到 index2 之间所有的 tagName
  • 如果忽略 index2 参数,那么只删除 index1 指定的那个字符的 tagName

Text控件中插入其他组件

window_cget(index, option)

  • 返回 index 参数指定的嵌入 window 对象的 option 选项的值
  • 如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常

window_config(index, cnf=None, **kw)

  • 修改 index 参数指定的嵌入 window 对象的一个或多个 option 选项的值
  • 如果给定的位置没有嵌入 window 对象,则抛出 TclError 异常

window_create(index, cnf={}, **kw)

  • align ——对齐方式: TOP、CENTER、BOTTOM 或 BASELINE
  • create——指定一个回调函数用于创建嵌入的 window 组件,该函数没有参数,并且必须创建 Text 的子组件并返回。
  • padx
  • pady
  • stretch——该选项控制当行的高度大于嵌入组件的高度时,嵌入组件是否延伸。默认值是 False,表示组件保持原形;设置为 True 表示将该组件垂直部分延伸至行的高度
  • window ——插入的控件
import tkinter as tk


root = tk.Tk()

root.geometry('600x400')

tx = tk.Text(root)
tx.pack()

btn = tk.Button(tx,text='Click')

tx.window_create('end',window=btn)


root.mainloop()

window_names()

  • 返回 Text 组件中嵌入的所有 window 对象的名字

Text控件中插入图片

image_cget(index, option)

  • 返回 index 参数指定的嵌入 image 对象的 option 选项的值
  • 如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常

image_configure(index, cnf=None, **kw)

  • 修改 index 参数指定的嵌入 image 对象的一个或多个 option 选项的值
  • 如果给定的位置没有嵌入 image 对象,则抛出 TclError 异常

image_create( index, cnf={}, **kw)

  • align——设定此图像的垂直对齐,可以是 TOP、CENTER、BOTTOM 或 BASELINE
  • image—— image 对象必须是 Tkinter 的 PhotoImage 或 BitmapImage 实例
  • name——你可以为该图像实例命名
  • padx
  • pady

image_names()

  • 返回 Text 组件中嵌入的所有 image 对象的名字

Mark文本标记

Mark(标记)通常被用来当作书签,它可以帮助用户快速找到内容的指定位置,并且跟随相应的字符一起移动。

Mark 有两种类型的标记,分别是“INSERT”和“CURRENT”,其含义如下:

  • INSERT:指定当前插入光标的位置,Tkinter 会在该位置绘制一个闪烁的光标;
  • CURRENT:用于指定当前光标所处坐标最邻近的位置。

Mark相关的函数

方法 说明
mark_gravity(markName, direction=None) 设置 Mark 的移动方向,默认是 "right",也可以设置为 "left" ,表示即如果在 Mark 处插入文本的话,Mark 的标记移动方向,也就是文本的插入方向。
mark_names() 返回 Text 组件中所有 Marks 的名字
mark_next(index) 返回在 index 指定的位置后边的一个 Mark 的名字
mark_previous(index) 返回在 index 指定的位置前边的一个 Mark 的名字
mark_set(markName, index) 移动 Mark 到 index 参数指定的位置,如果 markName 参数指定的 Mark 不存在,则创建一个新的 Mark
mark_unset(*markNames) 删除指定的 Mark

实例


import tkinter as tk
import tkinter.messagebox




class App(tk.Tk):

    def __init__(self):
        super().__init__()
        self.geometry('600x500')
        self.set_widget()
        self.mainloop()

    def set_widget(self):

        self.text = tk.Text(self)
        self.text.pack()

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

        tk.Label(self.frm,text='标记名称').grid(row=0,column=0)
        tk.Label(self.frm,text='插入内容').grid(row=1,column=0)

        self.ety_mark = tk.Entry(self.frm)
        self.ety = tk.Entry(self.frm)
        self.ety_mark.grid(row=0,column=1,columnspan=2)
        self.ety.grid(row=1,column=1,columnspan=2)

        self.btn_add = tk.Button(self.frm,text='添加标记',command=self.add_mark)
        self.btn_delete = tk.Button(self.frm,text='删除标记',command=self.delete_mark)
        self.btn_add.grid(row=2,column=1)
        self.btn_delete.grid(row=2,column=2)

        self.btn_show = tk.Button(self.frm,text='显示标记',command=self.show_mark)
        self.btn_write = tk.Button(self.frm,text='插入内容',command=self.write)
        self.btn_show.grid(row=3,column=1)
        self.btn_write.grid(row=3,column=2)



    def add_mark(self):
        """添加标记"""
        mark = self.ety_mark.get()
        if mark == '':
            tkinter.messagebox.showerror(message='请输入标记的名称')
            return
        else:
            self.text.mark_set(mark,'insert')

    def delete_mark(self):
        """删除标记"""
        mark = self.ety_mark.get()
        if mark == '':
            tkinter.messagebox.showerror(message='请输入标记的名称')
            return
        else:
            self.text.mark_unset(mark)

    def show_mark(self):
        """显示标记"""
        mark = self.ety_mark.get()
        if mark == '':
            tkinter.messagebox.showerror(message='请输入标记的名称')
            return
        else:
            try:
                self.text.see(mark)
            except tk.TclError:
                tkinter.messagebox.showerror(message=f'{mark}该标记不存在')

    def write(self):
        """往标记的位置写入内容"""
        mark = self.ety_mark.get()
        contents = self.ety.get()

        if (mark != '') & (contents != ''):
            self.text.insert(mark,contents)
        else:
            tkinter.messagebox.showerror(message='标记名称和插入内容不能有空白!') 


App()


Label 标签

参数

实例

import tkinter as tk
import sys
import os

ui_dir = os.path.dirname(os.path.realpath(sys.argv[0]))
ico_path = os.path.join(ui_dir,'ico/logox16.ico')

root = tk.Tk()

root.geometry('600x300+100+100')  

root.configure(bg='#1BA135')

lab = tk.Label(text='账号',
                relief='sunken',
                width=10,
                bg='#14B5F1',
                fg='#FA536C',
                bitmap=ico_path).grid(row=0,column=0)

lab2 = tk.Label(text='密码',
                relief='sunken',
                width=10,
                bg='#14B5F1',
                fg='#FA536C').grid(row=1,column=0)



root.title('test app') # 设置窗口的标题

root.mainloop()



Listbox 列表框

参数

之前未提参数说明

参数 说明
activestyle 指定绘制活动元素的样式: dotbox none underline
selectmode 指定用于操作选择的几种样式之一: single(单选),browse (默认,也是单选,但拖动鼠标或通过方向键可以直接改变选项),multiple (多选),extended(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现)

函数

函数 说明
activate(index) 将给定索引号对应的选项激活,即文本下方画一条下划线
bbox(index) 返回给定索引号对应的选项的边框,返回值是一个以像素为单位的 4 元祖表示边框:(xoffset, yoffset, width, height), xoffset 和 yoffset 表示距离左上角的偏移位置
curselection() 返回一个元组,包含被选中的选项序号(从 0 开始)
delete(first, last=None) 删除参数 first 到 last 范围内(包含 first 和 last)的所有选项
get(first, last=None) 返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本
index(index) 返回与 index 参数相应选项的序号
itemcget(index, option) 获得 index 参数指定的项目对应的选项(由 option 参数指定)
itemconfig(index, **options) 设置 index 参数指定的项目对应的选项(由可变参数 **option 指定)
nearest(y) 返回与给定参数 y 在垂直坐标上最接近的项目的序号
selection_set(first, last=None) 设置参数 first 到 last 范围内(包含 first 和 last)选项为选中状态,使selection_includes(序号) 可以判断选项是否被选中。
size() 返回 Listbox 组件中选项的数量
xview(*args) 该方法用于在水平方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现。 如果第一个参数是 "moveto",则第二个参数表示滚动到指定的位置:0.0 表示最左端,1.0 表示最右端;如果第一个参数是 "scroll",则第二个参数表示滚动的数量,第三个参数表示滚动的单位(可以是 "units" 或 "pages"),例如:xview("scroll", 2, "pages")表示向右滚动二行。
yview(*args) 该方法用于在垂直方向上滚动 Listbox 组件的内容,一般通过绑定 Scollbar 组件的 command 选项来实现

实例



import tkinter as tk
import tkinter.messagebox


class App(tk.Tk):

    def __init__(self):
        super().__init__()
        self.geometry('600x400')
        self.set_widget()
        self.mainloop()
    
    def set_widget(self):

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

        tk.Label(self.frm,text='Item').grid(row=0,column=0)
        tk.Label(self.frm,text='Like').grid(row=0,column=1)

        self.items = tk.StringVar()
        self.items.set(['Python','Java','C++'])

        self.likes = tk.StringVar()

        self.listbox_items = tk.Listbox(self.frm,listvariable=self.items)
        self.listbox_items.grid(row=1,column=0)
        self.listbox_items.selection_set(0) # 设置默认选中选项,index从0开始

        self.listbox_likes = tk.Listbox(self.frm,listvariable=self.likes)
        self.listbox_likes.grid(row=1,column=1)

        self.btn_add = tk.Button(self.frm,text='Add',width=10,command=self.add_itme)
        self.btn_add.grid(row=2,column=0)

        self.btn_delete = tk.Button(self.frm,text='Delete',width=10,command=self.delete_itme)
        self.btn_delete.grid(row=2,column=1)

    def add_itme(self):
        try:
            item = self.listbox_items.get(self.listbox_items.curselection())

            num = self.listbox_likes.size()
        
            if num > 0 :
                
                likes = self.listbox_likes.get(0,num-1)
                if item not in likes:
                    self.listbox_likes.insert('end',item)
                else:
                    tkinter.messagebox.showerror(message=f'{item}已经存在了。')
            else:
                self.listbox_likes.insert('end',item)
        except tk.TclError:
            tkinter.messagebox.showerror(message='无效选择,必须选中item列表框的项目才能新增')
    def delete_itme(self):

        delete_item = self.listbox_likes.curselection()
        if not delete_item :
            tkinter.messagebox.showerror(message='没有选择要删除的项目,只能删除like列表框中的项目')

        else:  
            self.listbox_likes.delete(delete_item)

                

App()

ttk_combobox 下拉列表

参数

之前未提参数说明

参数 说明
postcommand 点击下拉列表后,显示内容之前,执行的命令
values 指定下拉列表显示的值

函数

  • current(newIndex) 设置默认选中的项目
  • get() 获取选中的值
  • set(value) 添加值

实例

import tkinter.ttk as tk2
import tkinter as tk
import tkinter.messagebox


root = tk.Tk()

root.geometry('600x400')

contents = ['Java','Python','C++']


cbx = tk2.Combobox(root,values=contents,justify='center',width=8)
cbx.pack()

def show():
    data = cbx.get()
    tkinter.messagebox.showinfo(message=data)
btn = tk.Button(root,text='show',command=show)

btn.pack()

root.mainloop()


Frame 框架

参数

之前未提参数说明

参数 说明
visual 为新窗口指定视觉信息

实例

import tkinter as tk

root = tk.Tk()

root.geometry('600x400')

frm1 = tk.Frame(root,bg='red',padx=10,pady=10)
frm1.pack()

tk.Label(frm1,text='Frame1').pack()


frm2 = tk.Frame(root,bg='yellow',padx=10,pady=10)
frm2.pack()

tk.Label(frm2,text='Frame2').pack()

root.mainloop()

Labelframe 可以添加标签的框架

参数

之前未提参数说明

参数 说明
class 指定窗口的类,这个类会在查询选项数据库的时候用到窗口的其他选项,后面也会用到绑定等其他用途
labelanchor 标签位置(n北,e东,s南,w西,还有ne, nw, se, sw等)
labelwidget 标签使用的组件,如果省略,框架使用Text文本组件
visual 为新窗口指定视觉信息

实例


Panedwindow 窗格窗口

参数

之前未提参数说明

参数 说明
orient vertical 分成上下两部分,horizontal分成左右两部分
showhandle 显示手柄
handlepad 手柄到分隔线距离
handlesize 手柄到大小
sashrelief 分割线到样式,'sunken'等
sashwidth 分割线等宽度

Pane 参数

参数 说明
after 添加新的子组件到指定子组件后边
before 添加新的子组件到指定子组件前边
height
minsize 该选项控制窗格不得低于的值
padx 指定子组件的水平内边距
pady 指定子组件的垂直那边句
sticky 指定子组件位于窗格的位置可选的值有:"e"、"s"、"w"、"n".
width

函数

函数 说明
add(child,options)) 向窗口添加新窗格,并且设置相关属性
paneconfig(child, **options) 设置子组件的各种选项
forget(child) 删除指定的窗格
panecget(child, option) 获得子组件指定选项的值
insert(pos ,child options) 在指定位置插入窗格
panes() 返回所有窗格

实例


import formatter
import tkinter as tk
from turtle import width


root = tk.Tk()

root.geometry('600x400')

pw1 = tk.PanedWindow(root,orient='horizontal',sashwidth=5,sashrelief='sunken')
pw1.pack(fill='both',expand=True)

frm_L = tk.Frame(pw1)
pw1.add(frm_L,padx=10,pady=10,width=150)

pw2 = tk.PanedWindow(pw1,orient='vertical',sashwidth=5,sashrelief='sunken')
pw1.add(pw2)

frm_R_T = tk.Frame(pw2)
pw2.add(frm_R_T,height=100,padx=10,pady=10)

frm_R_B = tk.Frame(pw2)
pw2.add(frm_R_B,padx=10,pady=10)


btn1 = tk.Button(frm_L,text='Left')
btn1.pack()

btn2 = tk.Button(frm_R_T,text='Right-Top')
btn2.pack()

btn3 = tk.Button(frm_R_B,text='Right-bottom')
btn3.pack()

root.mainloop()

ttk_separator 分割线

参数

实例

import tkinter as tk
import tkinter.ttk as tk2


root = tk.Tk()

root.geometry('600x400')


lbl1 = tk.Label(root,text='one')

lbl1.pack()

sp = tk2.Separator(root,orient='horizontal')
sp.pack(fill='x')

lbl2 = tk.Label(root,text='two')
lbl2.pack()

root.mainloop()

ttk_notebook 标签页

参数

之前未提参数说明

参数 说明
sticky 设置标签里面的组件放置的位置。n, s, e, w.

函数

tab_id从0开始

函数 说明
add(child, **kw) 新建标签页.
forget(tab_id) 移除标签页
hide(tab_id) 隐藏指定 tab_id的标签页
identify(x, y) 返回位置 x, y 处的选项卡元素的名称.
index(tab_id) 返回由 tab_id 指定的选项卡的数字索引 或者 标签总数( 当tab_id 是 “end”的时候).
insert(pos, child, **kw) 在指定位置插入标签
select(tab_id=None) 选中指定的标签.
tabs() 返回所有标签

实例

import tkinter as tk
import tkinter.ttk as tk2

root = tk.Tk()

root.geometry('600x400')

nt = tk2.Notebook(root,height=300,width=300)
nt.pack()

tab1 = tk.Frame(nt)
tab2 = tk.Frame(nt)
tab3 = tk.Frame(nt)

def sel():
    nt.select(2)
btn = tk.Button(tab1,text='test',command=sel)
btn.pack()

nt.add(tab1,text='Python',sticky='w',padding=30)
nt.add(tab2,text='Java')
nt.add(tab3,text='C++')

root.mainloop()

Scale滑块

参数

之前未提参数说明

参数 说明
from_ 设置滑块的取值范围,最小值
to 设置滑块的取值范围,最大值
troughcolor 滑块槽里面的颜色
command 当移动滑块是触发函数,并且会传入一个参数(滑块的值)给函数。
digits 一个整数,指定在将刻度值转换为字符串时应保留多少个有效数字
label Scale标签名
length Scale的长度,单位:像素(pixels)
orient horizontal or vertical 设置滑块是水平放置,还是垂直放置
resolution 步长,设置每次移动多少
showvalue 显示值,现在选中的值
sliderlength 设置滑块的大小
tickinterval 设置刻度的间隔值,并显示刻度

实例


Scrollbar 滚动条

参数

之前未提参数说明

参数 说明
troughcolor 指定用于滚动条和刻度等小部件中的矩形槽区域的颜色
elementborderwidth 箭头和滑块周围边框的宽度
jump 等于True时,表示直到用户释放鼠标按钮才调用命令;等于False时,滑块的每个小拖动都会导致调用命令
orient 有:horizontal or vertical可以设置

实例

import tkinter as tk
import tkinter.messagebox

root = tk.Tk()

root.geometry('600x400')

contents = []

for i in range(20):
    e = f'this is {i} line'
    contents.append(e)

var_contents = tk.StringVar()

var_contents.set(contents)

list_box = tk.Listbox(root,listvariable=var_contents)


scorll_bar = tk.Scrollbar(root)
scorll_bar.pack(side='right',fill='y')

list_box.config(yscrollcommand=scorll_bar.set)
scorll_bar.config(command=list_box.yview)

list_box.pack()


root.mainloop()

ttk_progressbar 进度条

参数

之前未提参数说明

参数 说明
orient “horizontal” or “vertical”.水平放置 或者垂直放置进度条
length 进度条的长度
mode “determinate” (固定) or “indeterminate”(不固定)
maximum 最大值
value 进度条的当前值。在 determinate 模式下代表已完成的工作量。在 indeterminate 模式下,解释为 maximum 的模;也就是说,当本值增至 maximum 时,进度条完成了一个“周期”。
phase 只读属性。只要值大于 0 且在 determinate 模式下小于最大值,控件就会定期增大该属性值。当前主题可利用本属性提供额外的动画效果。

函数

函数 说明
cget(option) 返回指定选项的当前值
configure(option,value option value) 修改或查询小部件选项
start(interval=None) 开启自增模式:安排一个循环的定时器事件,每隔 interval 毫秒调用一次
step(amount=None) 步长,每次递增多少,默认1
stop() 停止
state(stateSpec) 修改或查询小部件状态

实例

import time
import tkinter as tk
import tkinter.ttk as tk2
import tkinter.messagebox


root = tk.Tk()

root.geometry('600x400')
def func1():
    """ 有固定量的,到一定量就停止 """
    for i in range(1,101):
        v.set(i)
        root.update() # 没有这句过程的增量不会显示出来
        time.sleep(0.1)

def func2():
    """ 没有固定量的,一直增加,到头后重新来一次,一直循环 """
    pb2.start()
   

btn1 = tk.Button(root,text='固定',command=func1)
btn1.grid(row=0,column=0,padx=10)

btn2 = tk.Button(root,text='非固定',command=func2)
btn2.grid(row=1,column=0)

v = tk.IntVar()
v.set(0)

pb1 = tk2.Progressbar(root,length=300,variable=v,maximum=100)
pb1.grid(row=0,column=1)

pb2 = tk2.Progressbar(root,length=300,value=0,maximum=100)
pb2.grid(row=1,column=1)

root.mainloop()

Menu 菜单

参数

属性 说明
activebackground 激活状态的背景色
activeforeground 激活状态的前景色
accelerator 指定快捷键
background 背景色
bitmap 位图
columnbreak 分栏符
command 选中后执行的回调
font 字体
foreground 前景色
hidemargin 隐藏边缘
image 图片
indicatoron 指示器开启
label 标签
menu 菜单对象
offvalue off状态下的值
onvalue on状态下的值
selectcolor 选中后的颜色
selectimage 选中后的图片
state 状态
underline 下划线
value
variable 变量

添加菜单命令

  • 添加菜单命令 menu.add_commmand()
  • 添加子菜单 menu.add_cascade()
  • 添加分割线 menu.add_separator()
  • 添加复选菜单 menu.add_checkbutton()
  • 添加单选菜单 menu.add_radiobutton()

实例




import tkinter as tk
import tkinter.messagebox

# 1. 普通菜单的设置
# 2. 二级菜单的设置
# 3. 给菜单命令添加快捷键注释,以及添加快捷键
# 4. 添加鼠标右击弹出菜单。



def show():
    tkinter.messagebox.showinfo(message='you click!')

def __show(event):
    # 和上面的函数功能相同,只是因为bind的时候会传入一个参数event,所以要有一个接收的参数。
    show()


root = tk.Tk()

root.geometry('600x400')

## 添加菜单的流程
# 1. 新建一个菜单
# 2. 往菜单里添加命令
# 3. 往菜单栏里添加新建的菜单

menubar = tk.Menu(root)

file_menu = tk.Menu(menubar,tearoff=0)



file_menu.add_command(label='open',command=show,accelerator='Ctrl+o') # 这边的快捷键设置,只是添加一个文字而已,没有快捷键的作用。
file_menu.add_command(label='create',command=show,accelerator='Ctrl+t')
file_menu.add_separator()

var_p = tk.IntVar()
var_j = tk.IntVar()
var_r = tk.IntVar()

def check():
    if (var_p.get() == 1) & ( var_j.get() == 1) :
        tkinter.messagebox.showinfo(message='我喜欢python,也喜欢Java')
    elif (var_p.get() == 1) & (var_j.get() == 0) :
        tkinter.messagebox.showinfo(message='我只喜欢python')
    elif (var_p.get() == 0) & (var_j.get() == 1) :
        tkinter.messagebox.showinfo(message='我只喜欢Java')
    else:
        tkinter.messagebox.showinfo(message='我两个都不喜欢')

def radio():
    if var_r.get() == 1:
        tkinter.messagebox.showinfo(message='你是男的')
    else:
        tkinter.messagebox.showinfo(message="你是女的")

############ checkbutton是可以多选
file_menu.add_checkbutton(label='python',variable=var_p,onvalue=1,offvalue=0,command=check)
file_menu.add_checkbutton(label='java',variable=var_j,onvalue=1,offvalue=0,command=check)
file_menu.add_separator()
############ radiobutton是只能单选
file_menu.add_radiobutton(label='男',variable=var_r,value=1,command=radio)
file_menu.add_radiobutton(label='女',variable=var_r,value=0,command=radio)


menubar.add_cascade(label='File',menu=file_menu)


# 子菜单
sub_menu = tk.Menu(file_menu,tearoff=0)

sub_menu.add_command(label='From csv',command=show)
sub_menu.add_command(label='From PDF',command=show)
sub_menu.add_command(label='From Excel',command=show)

file_menu.add_cascade(label='Import data From',menu=sub_menu)



root.config(menu=menubar)

######## 添加快捷键

root.bind_all("<Control-o>",__show)
root.bind_all("<Control-t>",__show)

######## 鼠标右击弹出菜单

def pop_up_menu(event):
    # 在鼠标点击的地方弹出菜单
    pop_menu.post(event.x_root,event.y_root) 

pop_menu = tk.Menu(root,tearoff=0)

pop_menu.add_command(label='eidt',command=show)
pop_menu.add_command(label='save',command=show)

root.bind("<Button-3>",pop_up_menu)

########


root.mainloop()


OptionMenu

import tkinter as tk
import tkinter.messagebox

root = tk.Tk()

root.geometry('600x400')

mystr = tk.StringVar()


m = tk.OptionMenu(root,mystr,'Python','Java','C++')
m.pack()
def show():
    tkinter.messagebox.showinfo(message=f'i like {mystr.get()}')
btn = tk.Button(root,text='show',command=show)

btn.pack()

root.mainloop()

ttk_sizegrip 窗口大小拖动块

控件允许用户通过按下并拖动控制柄来调整内部顶层窗口的大小。就是一个用来调整窗口大小的控件。


import tkinter as tk
import tkinter.ttk as tk2



root = tk.Tk()

root.geometry('600x400')

tk2.Sizegrip(root).place(x=560,y=360)

root.mainloop()

ttk_treeview 树状结构查看器

参数

Widget Options

Option Description
columns 列标识符列表,指定列数及其名称。
displaycolumns 指定显示的列,#all表示显示所有
height 指定可见的行数
selectMode 选择模式: extended(可以多选), browse(一次只能选择一个项目), or none.
show 显示树的哪些元素:tree(在 #0 列显示树的文本标签),headings(显示标题),“tree headings”(显示所有元素)

Item Options

Option Description
text tiem的标签名称
image 设置图片,显示在标签的左侧
values 设置item的值
open True/False ,是否点开,显示还是隐藏子级

Widget Commands

get_children(item=None)

  • 返回属于项的子级列表

set_children(item, *newchildren)

  • 将项的子项替换为新子项

column(column, option=None, **kw)

  • 查询或修改指定列的选项

Options

  • id:返回列的名称
  • anchor:指定此列中的文本应如何相对于单元格对齐 n, e, s, w center 等
  • minwidth:列的最小宽度(以像素为单位)
  • stretch:指定调整小部件大小时是否应调整列的宽度。True or False
  • width:列的宽度(以像素为单位)

delete(*items)

  • 删除指定的项目

exists(item)

  • 判断项目时存在

focus(item=None)

  • 当有填入参数item,则聚焦于该item,如果没有,会聚焦于最近的,或者没有

heading(column, option=None, **kw)

  • 查询或修改指定列的标题选项

Option

  • text:列的名称
  • image:图标
  • anchor:标题的对齐方式,n e s w center 等
  • command:添加函数

insert(parent, index, iid=None, **kw)

  • 创建新项并返回新创建项的项标识符

item(item, option=None, **kw)

  • 查询或修改指定项的选项

move(item, parent, index)

  • 将项目移动到父子列表中的位置索引

next(item)

  • 下一个项目

prev(item)

  • 上一个项目

selection()

  • Returns a tuple of selected items

selection_set(*items)

  • items becomes the new selection 点中项目

selection_add(*items)

  • Add items to the selection

selection_remove(*items)

  • Remove items from the selection

xview(args) 和 yview(args)

  • 用于设置拖动条的

实例

复制以下代码运行测试时,需要自己填一份Excel表格数据,记得修改路径,数据类似下面这样的

import tkinter as tk
import tkinter.ttk as tk2
import pandas as pd
import tkinter.messagebox

# 这边记得修改路径,换成你的
df = pd.read_excel('C:/Users/data.xlsx')
titles = list(df.columns)


root = tk.Tk()

root.geometry('600x400')

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


tv = tk2.Treeview(frm,columns=titles,show='headings',padding=10)
for col in titles:
    tv.heading(column=col,text=col)
    tv.column(col,anchor='center') # 这是列里面数据的对其方式
tv.pack()

def get_data():
    for i in range(len(df)):
        tv.insert(parent='',index='end',values=list(df.iloc[i]))
    tv.selection_set(tv.get_children()[0])


def clear():
    """ 删除所有项目"""
    items = tv.get_children()
    for item in items:
        tv.delete(item)

def delete():
    """ 删除所选项目 """
    
    ss = tv.selection() # 获取选择的项目,返回的是item对象
    if ss :
        for s in ss:
            tv.delete(s)
    else:
        tkinter.messagebox.showerror(message='没有选中要删除的行')
def t_up():
    
    """ 向上移动 """
    items = tv.get_children()
    
    select = tv.selection() # 获取当前选中的
    
    if select:

        if select[0] != items[0]:
            prev = tv.prev(select[0])  # 当前选中的上一个

            tv.selection_set(prev) # 点中项目
        else:
            tkinter.messagebox.showerror(message='这是第一个不能再往上了!')
    else:
        tkinter.messagebox.showerror(message='没有选中任何一行,不能移动')
def t_down():
    """ 向下移动 """

    items = tv.get_children()
    num = len(items)

    select = tv.selection() # 获取当前选中的
    
    if select:

        if select[0] != items[num-1]:
            prev = tv.next(select)  # 当前选中的上一个

            tv.selection_set(prev) # 点中项目
        else:
            tkinter.messagebox.showerror(message='这是最后一个不能再往下拉!')
    else:
        tkinter.messagebox.showerror(message='没有选中任何一行,不能移动')
        
btn = tk.Button(frm,text='GetData',command=get_data)
btn.pack()

btn_d = tk.Button(frm,text='DeleteSelect',command=delete)
btn_d.pack()

btn_c = tk.Button(frm,text='ClearAll',command=clear)
btn_c.pack()


btn_up = tk.Button(frm,text='Up',command=t_up)
btn_up.pack()

btn_down = tk.Button(frm,text='Down',command=t_down)
btn_down.pack()


root.mainloop()


Canvas 画布

参数

之前未提参数说明

参数 说明
confine 指定 Canvas 控件是否允许滚动超出 scrollregion 选项设置的滚动范围,默认值为 True
closeenough 指定一个浮点值,该值指示鼠标光标必须离项目多近才能被认为是在项目“内部”。默认为 1.0

Canvas控件绘图常用方法

画线 create_line(x0, y0, x1, y1, ... , xn, yn, options)

Options

  • activedash 当画布对象状态为 "active" 的时候,绘制虚线
  • activefill 当画布对象状态为 "active" 的时候,填充颜色
  • activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
  • activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
  • disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
  • disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
  • disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
  • disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
  • arrow
    • "first" 表示添加箭头到线段开始的位置
    • "last" 表示添加箭头到线段结束的位置
    • "both" 表示两端均添加箭头
  • arrowshape 用一个三元组来指定箭头的形状,默认值是 (8, 10, 3),元组中的数值分别代表箭头中三条边的长度
  • capstyle 线条的样式
    • "butt"(线段的两段平切于起点和终点)
    • "projecting"(线段的两段在起点和终点的位置将 width 选项设置的长度分别延长一半)
    • "round"(线段的两段在起点和终点的位置将 width设置的长度分别延长一半,并以圆角进行绘制)
  • dash 绘制虚线,该选项值是一个整数元组,元组中的元素分别代表短线的长度和间隔,比如 (3, 5) 代表 3 个像素的短线和 5 个像素的间隔
  • dashoffset 指定虚线开始的偏移位置,比如 dash=(5, 1, 2, 1),dashoffset=3,则从 2 开始画虚线
  • fill 指定填充的颜色,空字符串表示透明
  • joinstyle 指定当绘制两个相邻线段之间时接口的样式,默认为 "round"
    • "round"(以连接点为圆心,1/2 width 选项设置的长度为半径来绘制圆角)
    • "bevel"(在连接点处将两线段的夹角做平切操作)
    • "miter"(沿着两线段的夹角延伸至一个点)
  • offset 指定当点画模式时填充位图的偏移
  • smooth 默认值为 False,若设置为 True,表示将以曲线的样式代替所绘线段
  • splinesteps 当绘制曲线的时,该选项指定由多少条折线来构成曲线,默认值是 12,这里需要注意,只有当 smooth 选项为 True 时该选项才会生效。
  • state 指定该画布对象的状态,默认值为 "normal",参数值有 "normal","disabled"(不可用)和 "hidden"(隐藏)三种状态。
  • stipple 指定一个位图进行填充,默认值为空字符串,表示实心
  • tags 为创建的画布对象添加标签
  • width 指定边框的宽度

圆形或椭圆形 create_oval(x0, y0, x1, y1, options)

至少三个点的多边形 create_polygon(x0, y0, x1, y1, ... , xn, yn, options)

矩形 create_rectangle(x0, y0, x1, y1, options)

弧形 create_arc(coord, start, extent, fill)

文本 create_text(x0, y0, text, options)

图片 create_image(x, y, image)

位图 create_bitmap(x, y, bitmap)

  • 有gray12、gray25、gray50、gray75、hourglass、error、questhead、info、warning 或 question可选。

对于扇形、矩形、三角形、圆形等,这些封闭式图形可设置的参数

属性 方法
activedash 当画布对象状态为 "active" 的时候,绘制虚线
activefill 当画布对象状态为 "active" 的时候,填充颜色
activeoutline 当画布对象状态为 "active" 的时候,绘制轮廓线
activeoutlinestipple 当画布对象状态为 "active" 的时候,指定填充轮廓的位图
activestipple 当画布对象状态为 "active" 的时候,指定填充的位图
activewidth 当画布对象状态为 "active" 的时候,指定边框的宽度
dash 指定绘制虚线轮廓,与绘制线段的含义相同
dashoffset 指定虚线轮廓开始的偏移位置
disableddash 当画布对象状态为 "disabled" 的时候,绘制虚线
disabledfill 当画布对象状态为 "disabled" 的时候,填充颜色
disabledoutline 当画布对象状态为 "disabled" 的时候,绘制轮廓线
disabledoutlinestipple 当画布对象状态为 "disabled" 的时候,指定填充轮廓的位图
disabledstipple 当画布对象状态为 "disabled" 的时候,指定填充的位图
disabledwidth 当画布对象状态为 "disabled" 的时候,指定边框的宽度
extent 指定跨度(从 start 选项指定的位置开始到结束位置的角度)默认值是 90.0
fill 与上述表格的含义相同,表示指定的填充颜色,若为空字符串则为透明色
offset 指定当点画模式时填充位置的偏移,参数值为 "x,y"坐标偏移和位置偏移两种方式,比如 "ne"/"e" 等
outline 指定轮廓的颜色
outlineoffset 指定当点画模式绘制轮廓时位图的偏移
outlinestipple 当 outline 选项被设置时,该选项用于指定一个位图来填充边框,默认值是空字符串,表示黑色
start 指定起始位置的偏移角度
style 默认创建的是扇形,指定该方法创建的是扇形("pieslice")、弓形("chord")还是弧形("arc")
tags 为创建的画布对象添加标签
width 指定边框的宽度
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容