command对象提供的3个execute方法是_python基础 14 Tkinter(3)

16c72f0c9994306552eb310dfaac58ff.png Tkinter中各种组件及众多功能的介绍| - 1 - Canvas组件 Canvas是一个通用的组件,它通常用于显示和编辑图形,可以用它来绘制直线、圆形、多边形,甚至是绘制其他组件。  
在Canvas组件上绘制对象,可以用create_xxx()方法(xxx表示对象 类型,例如直线line、矩形rectangle和文本text等): from tkinter import * root = Tk() #创建Canvas对象
w = Canvas(root, width=200, height=100)
w.pack() # 画一条黄色的横线
w.create_line(0, 50, 200, 50, fill="yellow")
# 画一条红色的竖线(虚线)
w.create_line(100, 0, 100, 100, fill="red", dash=(4, 4))
# 中间画一个蓝色的矩形
w.create_rectangle(50, 25, 150, 75, fill="blue") mainloop() 添加到Canvas上的对象会一直保留着。 如果希望修改它们, 可以使用coords()、itemconfig()和move()方法来移动画布上的对象,或者使用delete()方法来删除: from tkinter import * root = Tk() w = Canvas(root, width=200, height=100)
w.pack() line1 = w.create_line(0, 50, 200, 50, fill="yellow")
line2 = w.create_line(100, 0, 100, 100, fill="red", dash=(4, 4))
rect1 = w.create_rectangle(50, 25, 150, 75, fill="blue") w.coords(line1, 0, 25, 200, 25) #移动,新位置的坐标
w.itemconfig(rect1, fill="red") #设置颜色为red
w.delete(line2)#删除 Button(root, text="删除全部", command=(lambda x=ALL : w.delete(x))).pack() mainloop() 还可以在Canvas上显示文本,使用的是create_text()方法: from tkinter import * root = Tk() w = Canvas(root, width=200, height=100)
w.pack() w.create_line(0, 0, 200, 100, fill="green", width=3)
w.create_line(200, 0, 0, 100, fill="green", width=3)
w.create_rectangle(40, 20, 160, 80, fill="green")
w.create_rectangle(65, 35, 135, 65, fill="yellow") w.create_text(100, 50, text="Fish") mainloop() 使用create_oval()方法绘制椭圆形(或圆形),参数是指定一个限定矩形(Tkinter会自动在这个矩形内绘制一个椭圆): from tkinter import * root = Tk() w = Canvas(root, width=200, height=100)
w.pack() w.create_rectangle(40, 20, 160, 80, dash=(4, 4))
w.create_oval(40, 20, 160, 80, fill="pink")
w.create_text(100, 50, text="Fish") mainloop() 而绘制圆形就是把限定矩形设置为正方形即可: w.create_oval(70, 20, 130, 80, fill="pink") 如果想要绘制多边形,可以使用create_polygon()方法。现在带大家 来画一个五角星。首先,要先确定五个角的坐标。 from tkinter import *
import math as m root = Tk() w = Canvas(root, width=200, height=100, background="red")
w.pack() center_x = 100
center_y = 50
r = 50 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="green", fill="yellow") mainloop() 接着设计一个像Windows画图工具那样的面板 通过响应“鼠标左键按住拖动”事件 (),在鼠标拖动的同时获取鼠标的实时位置(x, y),并绘制一个超小的椭圆来代表一个“点”: from tkinter import * root = Tk() w = Canvas(root, width=400, height=200)
w.pack() def paint(event):
    x1, y1 = (event.x - 1), (event.y - 1)
    x2, y2 = (event.x + 1), (event.y + 1)
    w.create_oval(x1, y1, x2, y2, fill="red")
w.bind("", paint) Label(root, text="按住鼠标左键并移动,开始绘制你的理想蓝图吧......").pack(side=BOTTOM) mainloop() 1. Canvas组件支持的对象:
• arc(弧形、弦或扇形)。 • bitmap(内建的位图文件或XBM格式的文件)。
• image(BitmapImage或PhotoImage的实例对象)。
• line(线)。
• oval(圆形或椭圆形)。
• polygon(多边形)。
• rectangle(矩形)。
• text(文本)。
• window(组件)。 其中,弦、扇形、椭圆形、圆形、多边形和矩形这些“封闭式”图形 都是由轮廓线和填充颜色组成的,通过outline和fill选项设置它们的颜 色,还可以设置为透明(传入空字符串表示透明)。 2. 坐标系
由于画布可能比窗口大(带有滚动条的Canvas组件),因此Canvas 组件可以选择使用两种坐标系。• 窗口坐标系:以窗口的左上角作为坐标原点。• 画布坐标系:以画布的左上角作为坐标原点。 3. 画布对象显示的顺序
Canvas组件中创建的画布对象都会被列入显示列表中,越接近背景
的画布对象,就越是位于显示列表的下方。显示列表决定当两个画布对 象重叠的时候是如何覆盖的(默认情况下,新创建的会覆盖旧的画布对 象的重叠部分,即位于显示列表上方的画布对象将覆盖下方那个)。当 然,显示列表中的画布对象可以被重新排序。 4. 指定画布对象
Canvas组件提供几种方法用来指定画布对象:
• Item handles。
• Tags。
• ALL。
• CURRENT。 Item handles事实上是一个用于指定某个画布对象的整型数(也称为 画布对象的ID)。当在Canvas组件上创建一个画布对象的时候,Tkinter 将自动为其指定一个在该Canvas组件中独一无二的整型值,然后各种 Canvas的方法可以通过这个值操纵该画布对象。Tag是附在画布对象上的标签,Tag由普通的非空白字符串组成。一 个画布对象可以与多个Tag相关联,一个Tag也可用于描述多个画布对 象。然而,与Text组件不同,没有指定画布对象的Tag不能进行事件绑 定和配置样式。也就是说,Canvas组件的Tag仅为画布对象所拥有。 Canvas组件预定义了两个Tags:ALL和CURRENT。
 • ALL(或"all")表示Canvas组件中的所有画布对象。
• CURRENT(或"current")表示鼠标指针下的画布对象(如果有 的话)。 - 2 - Menu组件 用于实现顶级菜单、下拉菜单和弹出菜单。 创建一个顶级菜单: 需要先创建一个菜单实例,然后使用add()方法将命令和其他子菜单添加进去: from tkinter import * root = Tk() def callback():
 print('你好') #创建顶级菜单
menubar = Menu(root)
menubar.add_command(label = 'hello',command=callback)
menubai.add_command(label = 'quit', command = root.quit) #显示菜单
root.config(menu = menubar) mainloop( ) 创建下拉菜单:需要添加到主窗口上 from tkinter import * root = Tk() def callback():
    print("~被调用了~") # 创建一个顶级菜单
menubar = Menu(root) # 创建一个下拉菜单“文件”,然后将它添加到顶级菜单中
filemenu = Menu(menubar, tearoff=False)
filemenu.add_command(label="打开", command=callback)
filemenu.add_command(label="保存", command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出", command=root.quit)
menubar.add_cascade(label="文件", menu=filemenu) # 创建另一个下拉菜单“编辑”,然后将它添加到顶级菜单中
editmenu = Menu(menubar, tearoff=False)
editmenu.add_command(label="剪切", command=callback)
editmenu.add_command(label="拷贝", command=callback)
editmenu.add_command(label="粘贴", command=callback)
menubar.add_cascade(label="编辑", menu=editmenu) # 显示菜单
root.config(menu=menubar) mainloop() 弹出菜单 from tkinter import * root = Tk() def callback():
    print("~被调用了~") # 创建一个弹出菜单
menu = Menu(root, tearoff=False) # tearoff默认是true,窗口可以移动
menu.add_command(label="撤销", command=callback)
menu.add_command(label="重做", command=callback) frame = Frame(root, width=512, height=512)
frame.pack() #创建popup方法,menu.post弹出菜单
def popup(event):
    menu.post(event.x_root, event.y_root) # 绑定鼠标右键
frame.bind("", popup) mainloop() 添加单选或多选按钮,与Checkbutton 和 Radiobutton组件类似(多了个勾勾) from tkinter import * root = Tk() def callback():
    print("~被调用了~") # 创建一个顶级菜单
menubar = Menu(root) # 创建 checkbutton 关联变量
openVar = IntVar()
saveVar = IntVar()
exitVar = IntVar() # 创建一个下拉菜单“文件”,然后将它添加到顶级菜单中
filemenu = Menu(menubar, tearoff=True)
filemenu.add_checkbutton(label="打开", command=callback, variable=openVar)
filemenu.add_checkbutton(label="保存", command=callback, variable=saveVar)
filemenu.add_separator()
filemenu.add_checkbutton(label="退出", command=root.quit, variable=exitVar)
menubar.add_cascade(label="文件", menu=filemenu) # 创建 radiobutton 关联变量
editVar = IntVar()
editVar.set(1) # 创建另一个下拉菜单“编辑”,然后将它添加到顶级菜单中
editmenu = Menu(menubar, tearoff=True)
editmenu.add_radiobutton(label="剪切", command=callback, variable=editVar, value=1)
editmenu.add_radiobutton(label="拷贝", command=callback, variable=editVar, value=2)
editmenu.add_radiobutton(label="粘贴", command=callback, variable=editVar, value=3)
menubar.add_cascade(label="编辑", menu=editmenu) # 显示菜单
root.config(menu=menubar) mainloop() - 3 - Menubutton组件 该组件适用于 希望菜单按钮出现在其他位置的时候。 创建一个Menubutton组件,并创建一个Menu组件与之关联: from tkinter import * root = Tk() def callback():
    print("~被调用了~") mb = Menubutton(root, text="点我", relief=RAISED)
mb.pack() filemenu = Menu(mb, tearoff=False)
filemenu.add_checkbutton(label="打开", command=callback, selectcolor="yellow")
filemenu.add_command(label="保存", command=callback)
filemenu.add_separator()
filemenu.add_command(label="退出", command=root.quit)
mb.config(menu = filemenu) mainloop() - 4 - OptionMenu组件 选择菜单 from tkinter import * root = Tk() variable = StringVar()
variable.set("one") w = OptionMenu(root, variable, "one", "two", "three")
w.pack() mainloop() 将很多选项添加到选项菜单中: from tkinter import * OPTIONS = [
    "California",
    "458",
    "FF",
    "ENZO",
    "LaFerrari"
    ] root = Tk() variable = StringVar()
variable.set(OPTIONS[0]) w = OptionMenu(root, variable, *OPTIONS)#OPTIONS前面加一个*可以将列表解开。
w.pack() def callback():
    print(variable.get()) Button(root, text="点我", command=callback).pack() mainloop() - 5 - 事件绑定 鼠标按键位置: from tkinter import * root = Tk() def callback(event):
 print('点击位置:',event.x,event.y) frame = Frame(root, width = 200, height = 200)
frame.bind('',callback) #当点击鼠标左键时执行callback,注意button1是左键,2是右键 frame.pack() mainloop() 键盘:需要焦点 from tkinter import * root = Tk() def callback(event):
 print(event.char) frame = Frame(root, width = 200, height = 200)
frame.bind('',callback)#键盘是Key
frame.focus_set()#创建焦点 frame.pack() mainloop() 获取鼠标实时位置: from tkinter import * root = Tk() def callback(event):
 print('当前位置:',event.x, event.y) frame = Frame(root, width = 200, height = 200)
frame.bind('',callback)#实时位置Motion frame.pack() mainloop() 事件序列 事件序列语法描述为。 • 事件序列包含在尖括号(<...>)中。
• type部分的内容是最重要的,它通常用于描述普通的事件类型, 例如鼠标单击或键盘按键单击(详见表17-5)。
• modifier部分的内容是可选的,它通常用于描述组合键,例如 Ctrl+C,Shift+单击(详见表17-6)。
• detail部分的内容是可选的,它通常用于描述具体的按键,例如 Button-1表示鼠标左键。 5e07ac3785fe5942e009663ace7e1208.png 推荐使用BUttonRelease modifier 1269c666841573cb8fa85516c16f0127.png Event对象 e1644630865079d04704863d9c5b0c33.png 当事件为的时候,detail可以通过设定具体的按键名(keysym)来筛选。 例如,表示按下键盘上的 大写字母H时候触发事件,表示按下键盘上的Tab按键的时候 触发事件。表17-8列举了键盘所有特殊按键的keysym和keycode(下面按键码 对应的是美国标准101键盘的“Latin-1”字符集,键盘标准不同对应的按键码不同,但按键名是一样的)。 de42a1ae6a9a1b2235df9049436bd038.png 113ed17672119647635d4e9407afb602.png - 6 - Message组件 Message(消息)组件是Label组件的变体,用于显示多行文本消息,能够自动换行,并调整文本的尺寸使其适应给定的尺寸。 from tkinter import * root = Tk() w1 = Message(root, text="这是一则消息", width=100)
w1.pack() w2 = Message(root, text="这是一则骇人听闻的长长长长长消息!", width=100)#自动换行了
w2.pack() mainloop() - 7 - Spinbox组件 Spinbox组件(Tk8.4新增)是Entry组件的变体,用于从一些固定的值中选取一个。  Spinbox组件与Entry组件用法非常相似,主要区别是使用Spinbox组件时,可以通过范围或者元组指定允许用户输入的内容。 可以通过参数调节频率等等细节 from tkinter import * root = Tk() w = Spinbox(root, from_=0, to=10)#设置从0到10的范围让用户进行选择
w.pack() mainloop() 还可以通过元组指定允许输入的值: w = Spinbox(root, values= ' 你', '好') - 8 - PanedWindow组件 空间管理组件,与Frame类似,为组件提供一个框架,但允许用户调整应用程序的空间划分 创建一个2窗格的PanedWindow组件:布局可以改变 from tkinter import * m = PanedWindow(orient=VERTICAL)
m.pack(fill=BOTH, expand=1) top = Label(m, text="top pane")
m.add(top) bottom = Label(m, text="bottom pane")
m.add(bottom) mainloop() 创建一个三窗格: from tkinter import * m1 = PanedWindow()
m1.pack(fill=BOTH, expand=1) left = Label(m1, text="left pane")
m1.add(left) m2 = PanedWindow(orient=VERTICAL)
m1.add(m2) top = Label(m2, text="top pane")
m2.add(top) bottom = Label(m2, text="bottom pane")
m2.add(bottom) mainloop() 把“分割线”显式地显示出来,并且可以为它附上一个“手柄”(handle)调整位置: from tkinter import * m1 = PanedWindow(showhandle=True, sashrelief=SUNKEN)
m1.pack(fill=BOTH, expand=1) left = Label(m1, text="left pane")
m1.add(left) m2 = PanedWindow(orient=VERTICAL, showhandle=True, sashrelief=SUNKEN)
m1.add(m2) top = Label(m2, text="top pane")
m2.add(top) bottom = Label(m2, text="bottom pane")
m2.add(bottom) mainloop() - 9 - Toplevel组件 是一个独立的顶级窗口,这种窗口通常拥有标题栏、边框等部件。   需要额外的对话框弹出框的时候使用Toplevel 下面例子,单击一下“创建顶级窗口”按钮就出现一个顶级窗口: from tkinter import * root = Tk() def create():
    top = Toplevel()
    top.title("FishC Demo")     msg = Message(top, text="I love FishC.com")
    msg.pack() Button(root, text="创建顶级窗口", command=create).pack() mainloop() attributes()方法 用于设置和获取窗口属性,如果只给出选项名,将返回当前窗口该选项的值。 注意:以下选项不支持关键字参数,需要在选项前添加下画线(_)并用 字符串的方式表示,用逗号(,)隔开选项和值。 下面演示将Toplevel的窗口设置为50%透明: from tkinter import * root = Tk() def create():
    top = Toplevel()
    top.title("FishC Demo")
    top.attributes("-alpha", 0.5)#添加 — 与 ,     msg = Message(top, text="I love FishC.com")
    msg.pack() Button(root, text="创建顶级窗口", command=create).pack() mainloop() - end-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值