Python tkinter canvas方法的Bitmap、stipple参数和组件Bitmap属性的使用以及xbm文件

xbm文件使用纯文本描述单色位图图像,是一种被广泛使用的通用文件格式,扩展名为xbm。在图形界面(GUI)中,小的单色简单图形、图标和鼠标位图可采用xbm文件。在python中,Canvas多个方法的参数Bitmap和stipple以及组件属性Bitmap都可使用xbm文件显示图形。win10和winXP程序工具栏有很大不同,工具栏中没有传统按钮组件,而是由很多图形代替按钮的功能,可用方法create_bitmap在Canvas上生成xbm文件图像创建win10风格工具栏。有兴趣可参看博文:用方法create_bitmap在Canvas上生成xbm文件图像创建win10风格工具栏。
创建xbm格式位图文件有很多方法,这里介绍使用Win10画图程序和转换图像格式的网页创建xbm文件的方法。具体方法如下:用win10画图程序画一个图形,例如矩形、直线和椭圆等,其外边界宽高各为指定像素,例如30,然后保存为24位位图(.bmp;.dib)格式。未实验保存为其它格式,如png格式,能否转换为xbm格式。打开网页https://convertio.co/zh/jpg-xbm/。在网页中将被转换文件扩展名改为:BMP,选择并上传要转换的BMP文件后,点击转换,完成后下载即可得到xbm文件。该文件可以被win10的记事本程序打开,将这个字符串拷贝到程序中,建立一个字符串实例。通过这个实例可创建一个BitmapImage类实例,Python组件属性image或方法的参数image可使用这一个BitmapImage类实例显示图形。
Python某些能显示图像的组件有属性bitmap和image,tkinter canvas方法create_bitmap有参数bitmap,方法create_image有参数image,方法create_oval、create_arc 、create_polygon、create_line、create_text和create_rectangle等有参数stipple。经常用到是image属性或参数,支持多种图像格式,包括xbm。以前没使用过bitmap和stipple属性或参数,直到前边博文才第一次使用。bitmap和stipple不能赋值位图类实例,也不能赋值bmp格式文件名,仅能赋值xbm格式文件名,格式为:bitmap="@pic/line.xbm",字符串中,@表示后边是文件路径。下边是一个验证程序,介绍使用bitmap、stipple和image的各种方法,那些方法和组件能使用xbm文件及如何使用。
注意,必须先创建line.xbm和circle.xbm文件,并拷贝到下边程序所在文件夹的子文件夹pic中,程序才能正常运行。

import tkinter as tk
root = tk.Tk()
root.geometry('300x300')
BITMAP = """
#define 4aba778e0c9f4fadf164c6324c112d14X7ECc5xgAHJPRiYq_width 30
#define 4aba778e0c9f4fadf164c6324c112d14X7ECc5xgAHJPRiYq_height 30
static char 4aba778e0c9f4fadf164c6324c112d14X7ECc5xgAHJPRiYq_bits[] = {
  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  0x1C, 0x00, 0x00, 0x00, 0x3C, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 
  0xF8, 0x00, 0x00, 0x00, 0xF0, 0x01, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 
  0xC0, 0x07, 0x00, 0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 
  0x00, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 
  0x00, 0xF0, 0x01, 0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x07, 0x00, 
  0x00, 0x80, 0x0F, 0x00, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x00, 0x3E, 0x00, 
  0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0xF8, 0x00, 0x00, 0x00, 0xF0, 0x01, 
  0x00, 0x00, 0xE0, 0x03, 0x00, 0x00, 0xC0, 0x07, 0x00, 0x00, 0x80, 0x07, 
  0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 
  };
"""
#以上"""  """之间内容是用记事本查看line.xbm文件的内容,拷贝到这里。
b1 = tk.BitmapImage(data=BITMAP)    
b2=tk.BitmapImage(file="pic/line.xbm")
cv = tk.Canvas(root,height=300,width=300,bg='#7FFFFE')
cv.pack()
cv.create_image(30,30,image=b1)     #image支持多种格式文件,jpg、png、xbm等
cv.create_image(70,30,image=b2)
#cv.create_bitmap(30,30,bitmap=b1)              #出错,bitmap不支持对象ID,仅支持文件名?
#cv.create_bitmap(30,30,bitmap="@line.bmp")     #出错,bitmap只支持xbm文件
#下句将显示一条线段,将鼠标移到该线段上方,变为圆,参数disabledbitmap也可以使用xbm文件
cv.create_bitmap(110,30,bitmap="@pic/line.xbm",activebitmap="@pic/circle.xbm",background='blue',foreground='red')
tk.Label(cv,image=b1).place(x=150,y=15,width=60,height=60)      #用bitmap=b1出错,加bg='red'出错
tk.Label(cv,bitmap="@pic/line.xbm").place(x=220,y=15,width=60,height=60)
but=tk.Button(cv,image=b1,activebackground='lightskyblue',bg='blue',fg='red')#按钮按下是激活状态,fg='red'无用
but.place(x=30,y=55,width=60,height=60)
but1=tk.Button(cv,bitmap="@pic/line.xbm",activebackground='lightskyblue',bg='green',fg='red')    #fg='red'有用
but1.place(x=30,y=150,width=60,height=60)
#下句填充圆,将鼠标移到该矩形上方,填充变为直线
cv.create_rectangle(100, 100, 250, 250,fill="red",stipple = "@pic/circle.xbm",activestipple="@pic/line.xbm")
root.mainloop()

python自带一些位图,Python组件属性或方法参数bitmap和stipple可直接使用。下边程序说明使用方法。感觉"question"等是文件名?如Python用文件名读xbm文件,但在内存中又是如何保存这些文件的呢,想了很久也没找到实现的方法。

from tkinter import *
canvas_width = 300
canvas_height =200
master = Tk()
canvas = Canvas(master,width=canvas_width,height=canvas_height)
canvas.pack()
bitmaps = ["error", "gray75", "gray50", "gray25", "gray12", "hourglass", "info", "questhead", "question", "warning"]
nsteps = len(bitmaps)
step_x = int(canvas_width / nsteps)
for i in range(0, nsteps):
   canvas.create_bitmap((i+1)*step_x - step_x/2,50, bitmap=bitmaps[i])
   
Label(master,bitmap="question").place(x=150,y=100,width=60,height=60)

canvas.create_rectangle(30, 100, 100, 170,
outline='red', # 边框颜色
stipple = 'gray12', # 填充的位图
fill="red", # 填充颜色
width=5 # 边框宽度
)
mainloop()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值