python之Tkinter控件学习

转载自  http://www.cnblogs.com/kaituorensheng/p/3287652.html#_label0

阅读目录

  • 1. 产品介绍
  • 2. 设计规划
  • 3. 相关知识
  • 4. 源码附件

Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口,位Python的内置模块,直接import tkinter即可使用。

作为实践, 用Tkinter做了个ascii码转化查询表

 

1. 产品介绍

界面

  python之Tkinter控件学习

功能

  • 通过输入字符或数字查询对应的信息
  • 通过选择列表中的信息查询对应的信息

2. 设计规划

规划图

python之Tkinter控件学习

3. 相关知识

首先看怎么产生第一个窗口

from Tkinter import *   #引用Tk模块
root = Tk() #初始化Tk()
root.mainloop() #进入消息循环

几个常用属性

  • title: 设置窗口标题
  • geometry: 设置窗口大小
  • resizable():设置窗口是否可以变化长 宽
python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry('200x100') #是x 不是*
root.resizable(width=False, height=True) #宽不可变, 高可变,默认为True
root.mainloop()
python之Tkinter控件学习

介绍以下几个控件的用法

  • Label
  • Frame
  • Entry
  • Text
  • Button
  • Listbox
  • Scrollbar

说明每个控件最后要加上pack().否则控件是无法显示的.

3.1 Label

说明

  标签

用法

  Label(根对象, [属性列表])

属性

  • text    要现实的文本
  • bg    背景颜色
  • font    字体(颜色, 大小)
  • width  控件宽度
  • height 控件高度

  以下介绍的控件差不多都有这几个属性, 更详细的属性查看参考网页

举例

python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry('300x200')
l = Label(root, text="show", bg="green", font=("Arial", 12), width=5, height=2)
l.pack(side=LEFT) #这里的side可以赋值为LEFT RTGHT TOP BOTTOM
root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

3.2 Frame

说明

  在屏幕上创建一块矩形区域,多作为容器来布局窗体

用法

  Frame(根对象, [属性列表])

举例

要在控件中出现这样的四个词语

校训

厚德        敬业

博学        乐群

  可以规划为

python之Tkinter控件学习

python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry('300x200') Label(root, text='校训'.decode('gbk').encode('utf8'), font=('Arial', 20)).pack() frm = Frame(root)
#left
frm_L = Frame(frm)
Label(frm_L, text='厚德'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP)
Label(frm_L, text='博学'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP)
frm_L.pack(side=LEFT) #right
frm_R = Frame(frm)
Label(frm_R, text='敬业'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP)
Label(frm_R, text='乐群'.decode('gbk').encode('utf8'), font=('Arial', 15)).pack(side=TOP)
frm_R.pack(side=RIGHT) frm.pack() root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

3.3 Entry

说明

  创建单行文本框

用法

  •   创建:lb =Entry(根对象, [属性列表])
  •   绑定变量 var=StringVar()    lb=Entry(根对象, textvariable = var)
  •   获取文本框中的值   var.get()
  •   设置文本框中的值   var.set(item1)

举例

python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry()
var = StringVar()
e = Entry(root, textvariable = var)
var.set("hello")
e.pack() root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

3.4 Text

说明

  向该空间内输入文本

用法

  t = Text(根对象)

  插入:t.insert(mark, 内容)

  删除:t.delete(mark1, mark2)

  其中,mark可以是行号,或者特殊标识,例如

  • INSERT:光标的插入点CURRENT:鼠标的当前位置所对应的字符位置
  • END:这个Textbuffer的最后一个字符
  • SEL_FIRST:选中文本域的第一个字符,如果没有选中区域则会引发异常
  • SEL_LAST:选中文本域的最后一个字符,如果没有选中区域则会引发 异常

举例

python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry('300x200') t = Text(root)
t.insert(1.0, 'hello\n')
t.insert(END, 'hello000000\n')
t.insert(END, 'nono')
t.pack() root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

3.5 Button

说明

  创建按钮

用法

  Button(根对象, [属性列表])

举例

python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry() def printhello():
t.insert('1.0', "hello\n") t = Text()
t.pack()
Button(root, text="press", command = printhello).pack()
root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

3.6 Listbox

说明

  列表控件,可以含有一个或多个文本想,可单选也可多选

用法

  •   创建:lb = ListBox(根对象, [属性列表])
  •   绑定变量 var=StringVar()    lb=ListBox(根对象, listvariable = var)
  •   得到列表中的所有值   var.get()
  •   设置列表中的所有值   var.set((item1, item2, .....))
  •   添加:lb.insert(item)
  •   删除:lb.delete(item,...)
  •   绑定事件 lb.bind('<ButtonRelease-1>', 函数)
  •   获得所选中的选项 lbl.get(lb.curselection())

属性

  selectmode可以为BROWSE MULTIPL SINGLE

举例

python之Tkinter控件学习
# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry() def print_item(event):
print lb.get(lb.curselection()) var = StringVar()
lb = Listbox(root, listvariable = var)
list_item = [1, 2, 3, 4] #控件的内容为1 2 3 4
for item in list_item:
lb.insert(END, item)
lb.delete(2, 4) #此时控件的内容为1 3
var.set(('a', 'ab', 'c', 'd')) #重新设置了,这时控件的内容就编程var的内容了
print var.get()
lb.bind('<ButtonRelease-1>', print_item)
lb.pack() root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

3.7 Scrollbar

说明

  在屏幕上创建一块矩形区域,多作为容器来布局窗体

用法

  Frame(根对象, [属性列表]), 最长用的用法是和别的控件一起使用.

举例

python之Tkinter控件学习
from Tkinter import *
root = Tk()
root.title("hello world")
root.geometry() def print_item(event):
print lb.get(lb.curselection()) var = StringVar()
lb = Listbox(root, height=5, selectmode=BROWSE, listvariable = var)
lb.bind('<ButtonRelease-1>', print_item)
list_item = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
for item in list_item:
lb.insert(END, item) scrl = Scrollbar(root)
scrl.pack(side=RIGHT, fill=Y)
lb.configure(yscrollcommand = scrl.set)
lb.pack(side=LEFT, fill=BOTH)
scrl['command'] = lb.yview root.mainloop()
python之Tkinter控件学习

效果

  python之Tkinter控件学习

4. 源码附件

代码

# -*- coding:cp936 -*-
from Tkinter import * class show:
num_info_hash = {}
char_info_hash = {}
num_char = {}
char_num = {}
def __init__(self): self.root = Tk()
self.root.title("ASCII码查询".decode('gbk').encode('utf8'))
#self.root.geometry('470x320')
########
self.frm = Frame(self.root)
#Top
Label(self.root, text="ASCII码查询".decode('gbk').encode('utf8'), font=('Arial', 15)).pack()
self.load_sys()
self.frm = Frame(self.root)
#Left
self.frm_L = Frame(self.frm)
self.frm_LT = Frame(self.frm_L)
self.var_char = StringVar()
Entry(self.frm_LT, textvariable=self.var_char, width = 5, font =('Verdana',15)).pack(side=RIGHT)
Label(self.frm_LT, text = '字符'.decode('gbk').encode('utf8'), font =('Arial',12)).pack(side=LEFT)
self.frm_LT.pack() self.var_L_char = StringVar()
self.lb_char = Listbox(self.frm_L, selectmode=BROWSE, listvariable=self.var_L_char, font =('Verdana',12), width=10, height=13)
self.lb_char.bind('<ButtonRelease-1>', self.get_char)
for key in self.char_num:
self.lb_char.insert(END, key[0])
self.scrl_char = Scrollbar(self.frm_L)
self.scrl_char.pack(side=RIGHT, fill=Y)
self.lb_char.configure(yscrollcommand = self.scrl_char.set)
self.lb_char.pack(side=LEFT, fill=BOTH)
self.scrl_char['command'] = self.lb_char.yview self.frm_L.pack(side = LEFT) #Mid
self.frm_M = Frame(self.frm)
self.t_show = Text(self.frm_M, width=20, height=5, font =('Verdana',15))
self.t_show.insert('1.0', '')
self.t_show.pack() self.frm_MB = Frame(self.frm_M)
Button(self.frm_MB, text="清除".decode('gbk').encode('utf-8'), command=self.clear, width=6, height=1, font=('Arial', 10)).pack(side=LEFT)
Button(self.frm_MB, text="查询".decode('gbk').encode('utf-8'), command=self.search, width=6, height=1, font=('Arial', 10)).pack(side=RIGHT)
self.frm_MB.pack(side=BOTTOM) self.frm_M.pack(side=LEFT) #Right
self.frm_R = Frame(self.frm)
self.frm_RT = Frame(self.frm_R)
self.var_int = StringVar()
Entry(self.frm_RT, textvariable=self.var_int, width=5, font =('Verdana',15)).pack(side=LEFT)
Label(self.frm_RT, text='十进制'.decode('gbk').encode('utf-8'), font =('Arial',12)).pack(side=RIGHT)
self.frm_RT.pack()
self.var_R_int = StringVar()
self.lb_int = Listbox(self.frm_R, selectmode=BROWSE, listvariable=self.var_R_int, font =('Verdana',12), width=10, height=13)
self.lb_int.bind('<ButtonRelease-1>', self.get_int,)
for key in self.num_char:
self.lb_int.insert(END, key[0])
self.scrl_int = Scrollbar(self.frm_R)
self.scrl_int.pack(side=RIGHT, fill=Y)
self.lb_int.configure(yscrollcommand = self.scrl_int.set)
self.lb_int.pack(side=LEFT, fill=BOTH)
self.scrl_int['command'] = self.lb_int.yview self.frm_R.pack(side = LEFT) self.frm.pack()
######## def get_char(self, event):
self.var_char.set('')
self.var_int.set('')
tmp = self.lb_char.get(self.lb_char.curselection())
self.var_char.set(tmp)
def get_int(self, event):
self.var_int.set('')
self.var_char.set('')
tmp = self.lb_int.get(self.lb_int.curselection())
self.var_int.set(tmp)
def clear(self):
self.var_char.set('')
self.var_int.set('')
self.t_show.delete('1.0', '10.0')
def search(self):
self.t_show.delete('1.0', '100.0')
tmp_char = self.var_char.get()
tmp_int = self.var_int.get()
if tmp_char != '':
if not self.char_info_hash.has_key(tmp_char):
self.t_show.insert('1.0', "您输入的字符不在128个字符之内".decode('gbk').encode('utf8'))
else:
self.t_show.insert('1.0', '十六进制:'.decode('gbk').encode('utf8') + '\t' + self.char_info_hash[tmp_char][2] + '\n')
self.t_show.insert('1.0', '十进制:'.decode('gbk').encode('utf8') +'\t' + self.char_info_hash[tmp_char][1] + '\n')
self.t_show.insert('1.0', '八进制:'.decode('gbk').encode('utf8') + '\t' + self.char_info_hash[tmp_char][0] + '\n')
self.t_show.insert('1.0', '字符:'.decode('gbk').encode('utf8') +'\t' + tmp_char + '\n\n')
self.var_char.set('')
self.var_int.set('')
elif tmp_int !='':
if not self.num_info_hash.has_key(tmp_int):
self.t_show.insert('1.0', "请输入介于0~127之间的整数".decode('gbk').encode('utf8'))
else:
self.t_show.insert('1.0', '字符:'.decode('gbk').encode('utf8') +'\t' + self.num_info_hash[tmp_int][2] + '\n')
self.t_show.insert('1.0', '十六进制:'.decode('gbk').encode('utf8') + '\t' + self.num_info_hash[tmp_int][1] + '\n')
self.t_show.insert('1.0', '八进制:'.decode('gbk').encode('utf8') + '\t' + self.num_info_hash[tmp_int][0] + '\n')
self.t_show.insert('1.0', '十进制:'.decode('gbk').encode('utf8') + '\t' + tmp_int + '\n\n')
self.var_char.set('')
self.var_int.set('')
else:
self.t_show.insert('1.0', '请选择或输入'.decode('gbk').encode('utf8')) def load_sys(self):
f = file('asc')
for line in f:
chunk = line.strip().split('\t')
self.num_char[int(chunk[1])] = chunk[3]
self.char_num[chunk[3]] = int(chunk[1])
self.num_info_hash[chunk[1]] = [chunk[0], chunk[2], chunk[3]]
self.char_info_hash[chunk[3]] = [chunk[0], chunk[1], chunk[2]] self.num_char =sorted(self.num_char.iteritems(), key = lambda asd:asd[0])
self.char_num =sorted(self.char_num.iteritems(), key = lambda asd:asd[1]) def main():
d = show()
mainloop()
if __name__== "__main__":
main()

文本

        nul
soh
stx
etx
eot
enq
ack
bel
bs
ht
0a nl
0b vt
0c ff
0d er
0e so
0f si
dle
dc1
dc2
dc3
dc4
nak
syn
etb
can
em
1a sub
1b esc
1c fs
1d gs
1e re
1f us
sp
!
"
#
$
%
&amp;
`
(
)
2a *
2b +
2c ,
2d -
2e .
2f / 3a :
3b ;
3c &lt;
3d =
3e &gt;
3f ?
@
A
B
C
D
E
F
G
H
I
4a J
4b K
4c L
4d M
4e N
4f O
P
Q
R
S
T
U
V
W
X
Y
5a Z
5b [
5c \
5d ]
5e ^
5f _
'
a
b
c
d
e
f
g
h
i
6a j
6b k
6c l
6d m
6e n
6f o
p
q
r
s
t
u
v
w
x
y
7a z
7b {
7c |
7d }
7e ~
7f del

Python Tkinter参考资料之(通用控件属性)

大部分控件的共享选项:

选项(别名)

说明

单位

典型值

没有此属性的控件

background(bg)

当控件显示时,给出的正常颜色

color

'gray25'
'#ff4400'
 

borderwidth(bd)

设置一个非负值,该值显示画控件外围3D边界的宽度;(特别的由relief选项决定这项决定).控件内部的3D效果也可以使用该值,该值可以是Tkinter(Tk_GetPixels)接受的任何格式 

pixel

3  

cursor

指定控件使用的鼠标光标,该值可以是Tkinter(Tk_GetPixels)接受的任何格式

cursor

gumby  

font

指定控件内部文本的字体

font

 'Helvetica'
('Verdana',8)
Canvas Frame
Scrollbar
Toplevel 

foreground(fg)

 指定控件的前景色 color  'black'
'#ff2244'
Canvas Frame
Scrollbar
Toplevel 

highlightbackground

指出经过没有输入焦点的控件加亮区域颜色  color 'gray30' Menu 

highlightcolor

指出经过没有输入焦点的控件周围长方区域加亮颜色  color  'royalblue'  Menu 

highlightthickness

设置一个非负值,该值指出一个有输入焦点的控件周围加亮方形区域的宽度,该值可以是 Tk_GetCursor)接受的任何格式.如果为0,则不画加亮区域 pixel  2.1m  Menu 

relief

指出控件3D效果.可选值为RAISED,SUNKEN,FLAT,RIDGE,SOLID,GROOVE.该值指出控件内部相对于外部的外观样式,比如RAISED意味着控件内部相对于外部突出  constant  RAISED
GROOVE 
 

takefocus

决定窗口在键盘遍历时是否接收焦点(比如Tab,shift-Tab).在设定焦点到一个窗口之前,遍历脚本检查takefocus选项的值,值0意味着键盘遍历时完全跳过,值1意味着只要有输入焦点(它及所有父代都映射过)就接收.空值由脚本自己觉定是否接收,当前的算法是如果窗口被禁止,或者没有键盘捆绑或窗口不可见时,跳过  boolean  1 YES   

width

指定一个整数,设置控件宽度,控件字体的平局字符数.如果值小于等于0,控件选择一个能够容纳目前字符的宽度

integer

32

Menu

很多控件共享的选项:

选项(别名)

说明

单位

典型值

仅此类控件

activebackground 指定画活动元素的背景颜色.元素(控件或控件的一部分)在鼠标放在其上并按动鼠标按钮引起某些行为的发生时,是活动的.如果严格的Modf一致性请求通过设置tk_strictModf变量完成,该选项将被忽略,正常背景色将被使用.对Windows和Macintosh系统,活动颜色将只有在鼠标按钮1被按过元素时使用  color 'red'
'#fa07a3'
Button
Checkbutton
Menu
Menubutton
Radiobutton
Scale
Scrollbar
activeforeground 指定画活动元素时的前景颜色.参见上面关于活动元素的定义   color 'cadeblue' Button
Menu
Checkbutton
Menubutton
Radiobutton 
anchor 指出控件信息(比如文本或者位图)如何在控件中显示.必须为下面值之一:
N,NE,E,SE,S,SW,W,NW或者CENTER.比如NW(NorthWest)指显示信息时使左上角在控件的左上端
 constant   Button
Checkbutton
Label
Message
Menubutton
Radiobutton 
bitmap  指定一个位图在控件中显示,以Tkinter(Tk_GetBitmap)接受的任何形式.位图显示的精确方式受其他选项如锚或对齐的影响.典型的,如果该选项被指定,它覆盖指定显示控件中文本的其他选;bitmap选项可以重设为空串以使文本能够被显示在控件上.在同时支持位图和图像的控件中,图像通常覆盖位图  bitmap   Button
Checkbutton
Label
Menubutton
Radiobutton
command  指定一个与控件关联的命令.该命令通常在鼠标离开控件之时被调用,对于单选按钮和多选按钮,tkinter变量(通过变量选项设置)将在命令调用时更新   command  setupData  Button
Checkbutton
Radiobutton
Scale
Scrollbar 
disabledforeground 指定绘画元素时的前景色.如果选项为空串(单色显示器通常这样设置),禁止的元素用通常的前景色画,但是采用点刻法填充模糊化   color  'gray50' 

Button
Checkbutton
Radiobutton
Menu
Menubutton

height 指定窗口的高度,采用字体选项中给定字体的字符高度为单位,至少为1   integer 1  4  Button
Canvas
Frame
Label
Listbox
Checkbutton
Radiobutton
Menubutton
Text
Toplevel 
image  指定所在控件中显示的图像,必须是用图像create方法产生的.如果图像选项设定,它覆盖已经设置的位图或文本显示;更新恢复位图或文本的显示需要设置图像选项为空串    image   Button
Checkbutton
Label
Menubutton
Radiobutton 
justify 当控件中显示多行文本的时候,该选项设置不同行之间是如何排列的,其值为如下之一:
LEFT,CENTER或RIGHT.LEFT指每行向左对齐,CENTER指每行居中对齐,RIGHT指向右对齐 
 constant  RIGHT  Button
Checkbutton
Entry
Label
Menubutton
Message
Radiobutton 
padx  指定一个非负值设置控件X方向需要的边距.该值为Tkinter(Tk_GetPixels)接受的格式.当计算需要多大的窗口时,控件会把此值加到正常大小之上(由控件中显示内容决定);如果几何管理器能够满足此请求,控件将在左端或右端得到一个给定的多余空边.大部分控件只用此项于文本,如果它们显示位图或图像,通常忽略空边选项   pixels 2m  10  Button
Checkbutton
Label
Menubutton
Message
Radiobutton
Text 
pady  指定一个非负值设置控件Y方向需要的边距.该值为Tkinter(Tk_GetPixels)接受的格式.当计算需要多大的窗口时,控件会把此值加到正常大小之上(由控件中显示内容决定);如果几何管理器能够满足此请求,控件将在上端或下端得到一个给定的多余空边.大部分控件只用此项于文本,如果它们显示位 图或图像,通常忽略空边选项   pixels 12  3m  Button
Checkbutton
Label
Menubutton
Message
Radiobutton
Text 
selectbackground  指定显示选中项时的背景颜色   color  blue  Canvas
Listbox
Entry
Text 
selectborderwidth  指定一个非负值,给出选中项的三维边界宽度,值可以是任何
Tkinter(Tk_GetPixels)接受的格式 
 pixel

Canvas
Entry
Listbox
Text

selectforeground 指定显示选中项的前景颜色   color yellow  Canvas
Entry
Listbox
Text 
state 

指定控件下列两三个状态之一(典型是复选按钮):
NORMAL和DISABLED或NORMAL,ACTIVE和NORMAL.在NORMAL状态,控件有前景色和背景显示;在ACTIVE状态,控件按activeforeground和activebackground选项显示;在DISABLED状态下,控件不敏感,缺省捆绑将拒绝激活控件,并忽略鼠标行为,此时,由disabled foreground和background选项决定如何显示

 constant ACTIVE 

Button
Checkbutton
Entry
Menubutton
Scale
Radiobutton
Text

text  指定控件中显示的文本,文本显示格式由特定控件和其他诸如锚和对齐选项决定   string 'Display'  Button
Checkbutton
Label
Menubutton
Message
Radiobutton 
textvariable  指定一个变量名字.变量值被转变为字符串在控件上显示.如果变量值改变,控件将自动更新以反映新值,字符串显示格式由特定控件和其他诸如锚和对齐选项决定   variable widgetConstant  Button
Checkbutton
Entry
Label
Menubutton
Message
Radiobutton 
underline  指定控件中加入下划线字符的整数索引.此选项完成菜单按钮与菜单输入的键盘遍历缺省捆绑.0对应控件中显示的第一个字符,1对应第二个,以此类推   integer Button
CheckButton
Label
Menubutton
Radiobutton 
wraplength  对于能够支持字符换行的控件,该选项指定行的最大字符数,超过最大字符数的行将转到下行显示,这样一行不会超过最大字符数.该值可以是窗口距离的任何标准格式.如果该值小于或等于0,不换行,换行只有在文本中的换行符的地方才出现   pixel 41,65  Button
Checkbutton
Label
Menubutton
Radiobutton
xscrollcommand  指定一个用来与水平滚动框进行信息交流的命令前缀,当控件窗口视图改变(或者别的任何滚动条显示的改变,如控件的总尺寸改变等等),控件将通过把滚动命令和两个数连接起来产生一个命令.两个数分别为0到1之间的分数,代表文档中的一个位置,0表示文档的开头,1.0表示文档的结尾处,0.333表示整个文档的三分之一处,如此等等.第一个分数代表窗口中第一个可见文档信息,第二个分数代表紧跟上一个可见部分之后的信息.然后命令把它们传到Tcl解释器执行.
典型的,xscrollcommand选项由滚动条标识跟着set组成,如set.x.scrollbar set将引起滚动条在窗口中视图变化时被更新.如果此项没有指定,不执行命令 
 function   Canvas
Entry
Listbox
Text 
yscrollcommand  指定一个用来与垂直滚动框进行信息交流的命令前缀,当控件窗口视图改变(或者别的任何滚动条显示的改变,如控件的总尺寸改变等等),控件将通过把滚动命令和两个数连接起来产生一个命令.两个数分别为0到1之间的分数,代表文档中的一个位置,0表示文档的开头,1.0表示文档的结尾处,0.333表示整个文档的三分之一处,如此等等.第一个分数代表窗口中第一个可见文档信息,第二个分数代表紧跟上一个可见部分之后的信息.然后命令把它们传到Tcl解释器执行.
典型的,yscrollcommand选项由滚动条标识跟着set组成,如set.y.scrollbar set将引起滚动条在窗口中视图变化时被更新.如果此项没有指定,不执行命令 
 function   Canvas
Entry
Listbox
Text

资料来源——《Python与Tkinter编程》附录B

上一篇:XML Attributes(XML属性)


下一篇:安装yum