'''
Created on 2017年9月5日

@author: Nick
'''
'''Tkinter之Label篇'''

#_*_coding:utf-8_*_
import tkinter as tk
from tkinter import *


if __name__ == '__main__':
    root = tk.Tk()
    root.wm_title('Label')
    root.geometry("1800x800+120+100")         #设置窗口大小  并初始化桌面位置
    root.resizable(width = True,height = True)  #宽不可变 高可变  默认True
    
    #控件的显示步骤:
    #1.创建这个控件
    #2.指定这个空间的master,即这个控件属于哪一个
    #3.告诉GM(geometry manager)有一个控件产生了
    
    
    fram1 = Frame(root)
    # text属性使用方法
    Label(fram1,text = 'Hello Tkinter').pack(side = LEFT)
    fram1.pack(side = TOP)
    
    #2、在label上使用内置位图
    # bitmap的使用方法
    '''
其他可用的位图:
    * error
    * hourglass
    * info
    * questhead
    * question
    * warning
    * gray12 
    * gray25 
    * gray50
    * gray75
若要查看各自的效果,可以使用相应的名称将bitmpa = 'error'替换。
据说还可以使用自己指定的位图文件,网上找了一下,格式如下:
    Label(root, bitmap="@/path/bitmapname")
不过我试了一下,从来没有成功过,我已经将位图该为单色的了:(

另:还有的网上的文章说明如何使用PhotoImage和BitmapImage显示bmp或gif文件,提到一点
防止图像文件被python自动回收(garbage collected),应将bmp或gif放到全局(global)或实体
(instance)中,使用如下两种方法,仍未奏效:
#使用image属性
#    bm = PhotoImage(file = 'c:/python.gif')
#    label = Label(root,image = bm)
#    label.bm = bm
#错误信息:
#TclError: image "pyimageXX" doesn't exist
#使用bitmap属性
#    bm = BitmapImage(file='c:/python2.bmp')
#    label = Label(root,bitmap=bm)
#    label.bm = bm
#    label.pack()
#错误信息:
#TclError: format error in bitmap data
虽然二者均没有起作用,还是要说明一下,bitmap与image的关系,如果同时指定这两参数,image
优先。
'''
    fram2 = Frame(root)
    Label(fram2,text = 'Hello Tkinter',bitmap = 'error').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter1',bitmap = 'hourglass').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter2',bitmap = 'info').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter3',bitmap = 'questhead').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter4',bitmap = 'question').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter5',bitmap = 'warning').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter6',bitmap = 'gray12').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter7',bitmap = 'gray25').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter8',bitmap = 'gray50').pack(side = LEFT)
    Label(fram2,text = 'Hello Tkinter9',bitmap = 'gray75').pack(side = LEFT)
    fram2.pack(side = TOP)    
    
    
    #3、改变控件的前景色和背景色
    '''
    fg:前景色
    bg:背景色
    设置背景色的一个大的用处是:可以判断控件的大小(不同的控件使用不同的颜色,后续内容
    可以使用此特性来调试container)
    

(1).使用颜色名称
Red
Green
Blue
Yellow
LightBlue
......
(2).使用#RRGGBB
label = Label(root,fg = 'red',bg = '#FF00FF',text = 'Hello I am Tkinter')
指定背景色为绯红色
(3).除此之外,Tk还支持与OS相关的颜色值,如Windows支持
SystemActiveBorder, 
SystemActiveCaption, 
SystemAppWorkspace, 
SystemBackground,
......

    '''
    fram3 = Frame(root)
    Label(fram3,text = 'Hello Tkinter_fg',fg = 'red').pack(side = LEFT)
    Label(fram3,text = 'Hello Tkinter_bg',bg = 'red').pack(side = LEFT)
    Label(fram3,text = 'Hello Tkinter_fg_bg',fg = 'white',bg = 'black').pack(side = LEFT)
    
    #使用颜色名称
    Label(fram3,fg = 'red',bg = 'blue',text = 'Hello I am Tkinter').pack(side = LEFT)
    #使用颜色值#RRGGBB
    Label(fram3,fg = 'red',bg = '#FF00FF',text = 'Hello I am Tkinter').pack(side = LEFT)
    #使用系统相关的颜色值(Windows),不建议使用这样的值,不利于平台移植
    Label(fram3,fg = 'red',bg = 'SystemButtonShadow',text = 'Hello I am Tkinter').pack(side = LEFT)
    fram3.pack(side = TOP)
    
    #4、设置宽度与高度
    # width:    宽度
    # height:    高度
    fram4 = Frame(root)
    
    #创建三个Label,分别显示red,blue,yellow
    #注意三个Label的大小,它们均与文本的长度有关
    Label(fram4,text = 'red',bg = 'red').pack(side = LEFT)
    Label(fram4,text = 'blue',bg = 'blue').pack(side = LEFT)
    Label(fram4,text = 'yellow',bg = 'yellow').pack(side = LEFT)
    
    #再创建三个Label,与上次不同的是这三个Label均使用width和heigth属性
    #三个Label的大小由width和height指定
    Label(fram4,text = 'red',bg = 'red',width = 10,height = 8).pack(side = LEFT)
    Label(fram4,text = 'blue',bg = 'blue',width = 20,height = 10).pack(side = LEFT)
    Label(fram4,text = 'yellow',bg = 'yellow',width = 15,height = 5).pack(side = LEFT)        
    
    fram4.pack(side = TOP)
    
    
    #5、同时使用图像与文本
    '''
    compound:    指定文本(text)与图像(bitmap/image)是如何在Label上显示,缺省为None,
           当指定image/bitmap时,文本(text)将被覆盖,只显示图像了。可以使用的值:
    left:    图像居左
    right:    图像居右
    top:    图像居上
    bottom:图像居下
    center:文字覆盖在图像上
    bitmap/image:
           显示在Label上的图像
    text:显示在Label上的文本
    label = Label(root,text = 'Error',compound = 'left',bitmap = 'error')
    '''
    fram5 = Frame(root)
    #图像居左,文字居右
    Label(fram5,text = 'Error',bg = 'red',width = 60,height = 40,compound = 'left',bitmap = 'error').pack(side = LEFT)
    #图像居右,文字居左
    Label(fram5,text = 'error',bg = 'blue',width = 60,height = 40,compound = 'right',bitmap = 'error').pack(side = LEFT)
    #图像居上,文字居下
    Label(fram5,text = 'error',bg = 'green',width = 60,height = 40,compound = 'top',bitmap = 'error').pack(side = LEFT)
    #图像居下,文字居上
    Label(fram5,text = 'error',bg = 'yellow',width = 60,height = 40,compound = 'bottom',bitmap = 'error').pack(side = LEFT)
    Label(fram5,text = 'error',bg = 'purple',width = 60,height = 40,compound = 'center',bitmap = 'error').pack(side = LEFT)
    fram5.pack(side = TOP)
    
    
    
    #6、文本的多行显示
    '''
在Tk004中,使用width和heigth来指定控件的大小,如果指定的大小无法满足文本的要求是,会出现
什么现象呢?如下代码:
    Label(root,bg = 'welcome to jcodeer.cublog.cn',width = 10,height = 3).pack()
运行程序,超出Label的那部分文本被截断了,常用的方法是:使用自动换行功能,及当文本长度大于
控件的宽度时,文本应该换到下一行显示,Tk不会自动处理,但提供了属性:
wraplength:    指定多少单位后开始换行
justify:        指定多行的对齐方式
anchor:        指定文本(text)或图像(bitmap/image)在Label中的显示位置
可用的值:
e
w
n
s
ne
se
sw
sn
center
布局如下图

                nw        n        ne
                w      center    e
                sw        s        se

'''
    fram6 = Frame(root)
    #文本不换行显示
    Label(fram6,text = '文本的多行显示,文本的多行显示,文本的多行显示,文本的多行显示文本的多行显示文本的多行显示',bg = 'red',width = 30,height = 10).pack(side = LEFT)
    #左对齐,文本居中
    Label(fram6,text = '文本的多行显示,文本的多行显示,文本的多行显示,文本的多行显示,文本的多行显示,文本的多行显示.',
          bg = 'blue',width = 30,height = 10,
          wraplength = 90,justify = 'left').pack(side = LEFT)
    #右对齐,文本居中
    Label(fram6,text = '文本的多行显示文本的多行显示文本的多行显示文本的多行显示文本的多行显示文本的多行显示',
          bg = 'blue',width = 30,height = 10,
          wraplength = 90,justify = 'right').pack(side = LEFT)
    #居中对齐,文本居中
    Label(fram6,text = '文本的多行显示文本的多行显示文本的多行显示文本的多行显示文本的多行显示文本的多行显示',
          bg = 'blue',width = 30,height = 10,
          wraplength = 90,justify = 'center').pack(side = LEFT)
    fram6.pack(side = TOP)
    
    fram7 = Frame(root)
    #居中对齐,文本居左
    Label(fram7,text = 'hello',bg = 'red',width = 20,height = 5,wraplength = 90,anchor = 'nw').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'green',width = 20,height = 5,wraplength = 90,anchor = 'n').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'blue',width = 20,height = 5,wraplength = 90,anchor = 'ne').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'purple',width = 20,height = 5,wraplength = 90,anchor = 'w').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'white',width = 20,height = 5,wraplength = 90,anchor = 'center').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'gray',width = 20,height = 5,wraplength = 90,anchor = 'e').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'cyan',width = 20,height = 5,wraplength = 90,anchor = 'sw').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'pink',width = 20,height = 5,wraplength = 90,anchor = 's').pack(side = LEFT)
    Label(fram7,text = 'hello',bg = 'yellow',width = 20,height = 5,wraplength = 90,anchor = 'se').pack(side = LEFT)
                 

    #运行一下程序就可以直观的看出,justify与anchor的区别了:一个用于控制多行的对齐;另一个用于控制整个文本块在Label中的位置
    fram7.pack(side = TOP)
    
  
    root.mainloop()


本文转载:CSDN博客