python图形界面化编程GUI(二)常用的组件(Text、Radiobutton、Checkbutton、Canvas)和布局管理器(gird、pack、place)
Text文本框
Text(多行文本框)的主要用于显示多行文本,还可以显示 网页链接, 图片, HTML 页面, 甚至 CSS 样式表,添加组件 等。主要用来显示信息,也常被当做简单的文本处理器、⽂本编辑器或者 网页浏览器来使用。IDLE就是 Text 组件构成的。
insert插入的时候可以用INSERT代表当前光标的位置,END代表在结尾的位置,也可以用插入小数的形式,2.3代表第二行第三列后插入。
from tkinter import *
from tkinter import messagebox#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件'''# 文本框的高度和宽度self.w1 = Text(root,width=40,height=12,bg='gray')self.w1.pack()# INSERT 表示光标当前的位置,END表示结尾的位置# self.w1.insert(INSERT,'hello')# self.w1.insert(END,'world') # 在文本框中输入hello world# 小数点代表 行.列,插入到第几行第几列后的位置self.w1.insert(1.0,'1234567890\nabcdefg')self.w1.insert(2.3,'今天上课很开心\n')if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
from tkinter import *
import webbrowser#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件'''# 文本框的高度、宽度及背景色self.w1 = Text(root,width=40,height=12,bg='gray')self.w1.pack()# 在文本框里插入内容# INSERT 表示光标当前的位置,END表示结尾的位置# self.w1.insert(INSERT,'hello')# self.w1.insert(END,'world') # 在文本框中输入hello world# 小数点代表 行.列,插入到第几行第几列后的位置self.w1.insert(1.0,'1234567890\nabcdefg')self.w1.insert(2.3,'今天上课很开心\n')Button(self, text='重复插入文本', command=self.insertText).pack(side='left')Button(self, text='返回文本', command=self.returnText).pack(side='left')Button(self, text='添加图片', command=self.addImage).pack(side='left')Button(self, text='添加组件', command=self.addWidget).pack(side='left')Button(self, text='通过tag精确控制文本', command=self.testTag).pack(side='left')def insertText(self):# INSERT 在光标位置处插入self.w1.insert(INSERT,' 你好啊 ')# END 在最后面插入self.w1.insert(END,'好好学习')# 在第一行第八列后插入self.w1.insert(1.8,'图形编程')def returnText(self):# Indexes(索引)是⽤来指向 Text 组件中⽂本的位置,Text 的组件索引也是对应实际字符之间的位置。# 核⼼:⾏号以 1 开始 列号以 0 开始# 获取第一行第三列到第六列的内容,截取文本,左闭右开print(self.w1.get(1.2, 1.6)) # 3456print("所有⽂本内容:\n" + self.w1.get(1.0, END))def addImage(self):# global photoself.photo = PhotoImage(file="images/shou.gif")# 文本框内插入图片self.w1.image_create(END, image=self.photo)def addWidget(self):# 添加按钮,并没有command绑定功能,点击后没反应b1 = Button(self.w1, text='编程语言')# 在 text 创建组件的命令,在光标处self.w1.window_create(INSERT, window=b1)def testTag(self): # 精确控制self.w1.delete(1.0, END) # 清除文本框内容# 插入新的内容self.w1.insert(INSERT, "good good study,day day up!\n好好学习\n程序猿\n百度,搜⼀下就知道")# 文本标记,添加设置,定位到第一行的第一列到第九列# good baidu 是传入的参数,用于定位 ,无任何意义self.w1.tag_add("good", 1.0, 1.9)self.w1.tag_config("good", background="yellow", foreground="red")self.w1.tag_add("baidu", 4.0, 4.2)self.w1.tag_config("baidu", underline=True)# 绑定时间self.w1.tag_bind("baidu", "<Button-1>", self.webshow)def webshow(self, event):# 点击后,访问网站,超链接webbrowser.open("http://www.baidu.com")if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
Radiobutton(单选框)
单选按钮 Radiobutton 控件⽤于选择同⼀组单选按钮中的⼀个。Radiobutton 可以显示⽂本,也可以显示图像。
from tkinter import *
from tkinter import messagebox#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件'''# 改变StringVar,button按钮上的文字也随之改变self.v = StringVar()# 设定默认值为Fself.v.set('F')# 创建单选按钮的组件,显示在画板上,选项的内容是可变的self.r1 = Radiobutton(self,text='男性',value='M',variable=self.v)self.r2 = Radiobutton(self,text='女性',value='F',variable=self.v)# 布局摆放self.r1.pack()self.r2.pack()# 触发按钮,提交信息Button(self,text='确定',command=self.confirm).pack()def confirm(self):messagebox.showinfo('测试','选择的性别:' + self.v.get())if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
Checkbutton(复选框)
复选按钮 Checkbutton 控件⽤于选择多个按钮的情况。Checkbutton 可以显示⽂本,也可以显示图像。
from tkinter import *
from tkinter import messagebox#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件Checkbutton'''self.codeHobby = IntVar()self.videoHobby = IntVar()# 变量的类型只能是整型,0(未选中)或者1(选中状态)print(self.codeHobby.get()) # 默认为0# variable可能的值为复选框,选中为1,未选中为0,代表两种状态self.c1 = Checkbutton(self,text='敲代码',variable=self.codeHobby,onvalue=1,offvalue=0)self.c2 = Checkbutton(self,text='看电影',variable=self.videoHobby,onvalue=1,offvalue=0)self.c1.pack()self.c2.pack()# 触发按钮,提交信息Button(self,text='确定',command=self.confirm).pack()def confirm(self):if self.codeHobby.get() == 1:messagebox.showinfo('第一个框','敲代码要熬夜')if self.videoHobby.get() == 1:messagebox.showinfo('第二个框','休息一下吧')if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
canvas画布
canvas(画布)是⼀个矩形区域,可以放置图形、图像、 组件等。
之前一直把tkinter比作是画板,canvsa则是放在画板上的画布。
from tkinter import *
from tkinter import messagebox
import random#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件canvas'''# 创建画布,默认显示在画板容器上self.canvas = Canvas(self,width=500,height=300,bg='green')self.canvas.pack()# 划线,画布的左上角的坐标点为0,0,画布的宽度为500,高度为300,两个点确定一条线# 一个点在画布边线像素为150的位置,第二个点在右边线像素为300的位置self.canvas.create_line(0,150,500,150,fill='yellow') # 横线self.canvas.create_line(250,0,250,300,fill='red') ## 画矩形 两个对角的点之间的矩形self.canvas.create_rectangle(50,50,100,100)self.canvas.create_rectangle(300,50,400,80)# 画圆形self.canvas.create_oval(50,50,100,100)self.canvas.create_oval(300,50,400,80)global photophoto = PhotoImage(file="images/shou.gif")# 250,170指的是图像中心点所处的位置self.canvas.create_image(150, 170, image=photo)Button(self, text="画 10 个矩形", command=self.draw).pack(side="left")def draw(self):for i in range(0, 10):# 随机确定矩形两个对角点的位置x1 = random.randrange(int(self.canvas["width"]) / 2)y1 = random.randrange(int(self.canvas["height"]) / 2)x2 = x1 + random.randrange(int(self.canvas["width"]) / 2)y2 = y1 + random.randrange(int(self.canvas["height"])/ 2)self.canvas.create_rectangle(x1, y1, x2, y2)if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('600x400+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
布局管理器
GUI 应用程序组件的排布,需要使⽤ tkinter 提供的布局管理器来帮助我们组织、管理组件的布局方式。组件创建好之后,如何进行摆放,tkinter 提供了三 种管理器:pack、grid、place。
gird
grid为表格布局,采⽤表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从⽽实现复杂的布局。
选项 | 说明 | 取值范围 |
---|---|---|
column | 单元格的列号 | 从0开始的正整数 |
columnspan | 跨列,跨越的列数 | 正整数 |
row | 单元格的行号 | 从0开始的正整数 |
rowspan | 跨行,跨越的行数 | 正整数 |
ipadx,ipady | 设置子组件之间的间隔,x或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
padx,pady | 与之并列的组件之间的间隔,x或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
sticky | 组件紧贴所在单元格的某一角,对应东南西北中,4个角 | ‘n’,‘s’,‘w’,‘e’,‘nw’,‘sw’,‘se’,‘ne’,‘center’(默认) |
from tkinter import *#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''通过grid网格布局实现登录界面'''# 把界面分成网格,用户名在左上角,输入框在它右侧self.lab01 = Label(self,text='用户名')self.lab01.grid(row=0,column=0)self.entry01 = Entry(self).grid(row=0,column=1)self.lab02 = Label(self,text='密码')self.lab02.grid(row=1,column=0)# 密码以*显示self.entry02 = Entry(self,show='*').grid(row=1,column=1)# 网格布局,登录在第一列,注册在第二列居中,可以通过sticky参数调整位置# 引号内方向的小写和直接用大写作用一样Button(self,text='登录').grid(row=2,column=0,sticky='ew')Button(self,text='注册').grid(row=2,column=1,sticky=E)# 登录框在第三行,横跨两列Button(self,text='登录框').grid(row=3,columnspan=2)if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('400x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
pack
pack 按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默 认在父组件中⾃顶向下垂直添加组件。pack 是代码量最少,最简单的⼀种,可以⽤于快速生成界面。
选项 | 说明 | 取值范围 |
---|---|---|
expend | 值为yes时,side无效,组件显示在父配件的中心;若fill=both,则填充父组件的剩余空间 | 自然数,‘yes’,‘no’(默认为0或no) |
fill | 填充x/y方向上的空间,side=top/bottom,填充x方向;side=left/right,填充y方向;当expend=yes,填充父组件的剩余空间 | ‘x’,‘y’,‘both’,‘none’(默认none) |
ipadx,ipady | 设置子组件之间的间隔,x或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
padx,pady | 与之并列的组件之间的间隔,x或y方向,默认单位为像素 | 非负浮点数,默认0.0 |
side | 定义停靠在父组件的哪一边 | ‘top’,‘bottom’,‘left’,‘right’(默认top) |
before | 将本组件于所选组件之前pack,类似于先创建本组件再创建选定组件 | 已经pack后的组件对象 |
after | 将本组件于所选组件之后pack,类似于先创建选定组件再创建本组件 | 已经pack后的组件对象 |
in_ | 将本组件作为所选组件对象的子组件,类似于指定本组件的master为选定组件 | 已经pack后的组件对象 |
anchor | 对齐方式,左对齐’w’,右对齐’e’,顶对齐’n’,底对齐’s’ | ‘n’,‘s’,‘w’,‘e’,‘nw’,‘sw’,‘se’,‘ne’,‘center’(默认) |
钢琴示例
from tkinter import *
root = Tk()
# 创建画板
root.geometry('700x200')
# Frame是一个矩形区域,来放置其他组件
# 把组件放到Frame(画纸)上,在把画纸放到画板(root)上
# 创建两张画纸
f1 = Frame(root)
f1.pack()
f2 = Frame(root)
f2.pack()
btnText = ('流行风','中国风','重金属','轻音乐','日本风')
# 把创建的组件分别放到两张画纸上
for txt in btnText:Button(f1,text=txt).pack(side='left',padx=10)
for i in range(1,20):Button(f2,width=5,height=10,bg='black' if i%2==0 else 'white').pack(side='left')
root.mainloop()
from tkinter import *
#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''通过pack布局实现登录界面'''# 填充的是整个画板,fill=X 横向扩展填充,pack默认居中Button(root,text='Red',bg='red',fg='white').pack(anchor='w',fill=X)Button(root,text='Green',bg='green',fg='black').pack(anchor='w',fill=X)Button(root,text='Blue',bg='blue',fg='white').pack(anchor='w',fill=Y,expand='yes')if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('400x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop() # 消息循环
place
place 布局管理器可以通过坐标精确控制组件的位置,适用于⼀些布局更加灵活的场景。用于定位,必须要传入坐标点x/y才能显示。
选项 | 说明 | 取值范围 |
---|---|---|
x,y | 组件左上角的绝对坐标(相对于窗口) | 非负整数。x和y用于设置偏移量(像素),如果同时设置relx/rely和x/y,则place优先计算relx/rely,再实现x和y的偏移量) |
relx,rely | 组件左上角的坐标,(相对于父容器) | relx是相对父组件的位置,0是最左边,0.5是正中间,1是最右边;rely是相对父组件的位置,0是最上边,0.5是正中间,1是最下边 |
width,height | 组件的宽度和高度 | 非负整数 |
relwidth,relheight | 组件的宽度和高度(相对于父容器) | 与relx/rely取值类似,是相对于父组件的尺寸 |
anchor | 对齐方式,左对齐’w’,右对齐’e’,顶对齐’n’,底对齐’s’ | ‘n’,‘s’,‘w’,‘e’,‘nw’,‘sw’,‘se’,‘ne’,‘center’(默认) |
from tkinter import *
root = Tk()
# 创建一个500*300的画板,设置标题和背景颜色
root.geometry('500x300')
root.title('布局管理器place')
root['bg'] = 'white'
# 在画板上创建一张画纸
f1 = Frame(root,width=200,height=200,bg='green')
f1.place(x=30,y=30) # 画纸的左上角放在30,30的位置,x/y必传
# 在画板横向最中间,纵向最上边的位置放置组件
Button(root,text='设置relx/rely').place(relx=0.5,rely=0)
# 利用x/y设置组件位置
Button(root,text='设置x/y').place(x=100,y=200)
# relx/rely和x/y同时存在,先布局relx/rely,在计算的结果上再计算x/y
Button(root,text='两个参数都设置').place(relx=0.5,rely=0,x=100,y=200)
# relwidth/relheight组件大小是相对于父容器root的比例,此时组件125*75大致为500*300的1/5
Button(root,text='相对父容器尺寸的比例').place(relx=0.5,rely=0.5,x=0,y=20,relwidth=0.2,relheight=0.2)# 把组件放置画纸上
Button(f1,text='在画纸1').place(relx=0.4,rely=0)
Button(f1,text='在画纸2').place(relx=0.4,rely=0.2)root.mainloop()
例题 扑克牌的摆放
"""扑克牌游戏的界面设计"""from tkinter import *
class Application(Frame):def __init__(self, master=None):super().__init__(master) # super()代表的是父类的定义,而不是父类对象self.master = masterself.pack()self.createWidget()def createWidget(self):"""通过 place 布局管理器实现扑克牌位置控制"""# 一张扑克牌的放置# self.photo =PhotoImage(file="images/puke/puke1.gif")# self.puke1 = Label(self.master,image=self.photo)# self.puke1.place(x=10,y=50)# 批量放置多张扑克牌# 十张扑克牌self.photos = [PhotoImage(file="images/puke/puke" + str(i + 1) + ".gif") for i in range(10)]# 十张扑克牌的标签self.pukes = [Label(self.master, image=self.photos[i]) for i in range(10)]# 十张扑克牌摆放的位置for i in range(10):self.pukes[i].place(x=10 + i * 40, y=50)# 为所有的 Label 增加事件处理self.pukes[0].bind_class("Label", "<Button-1>", self.chupai)# 单击鼠标左键进行的操作,如果扑克牌的高度为50,单击后变为30def chupai(self, event):print(event.widget.winfo_geometry())print(event.widget.winfo_y())if event.widget.winfo_y() == 50:event.widget.place(y=30)else:event.widget.place(y=50)if __name__ == '__main__':root = Tk()root.geometry("600x270+200+300")app = Application(master=root)root.mainloop()
python图形界面化编程GUI(二)常用的组件(Text、Radiobutton、Checkbutton、Canvas)和布局管理器(gird、pack、place)相关推荐
- python图形界面化编程GUI(一)窗口管理和常用的组件(Label、Button、Entry)
GUI GUI(Graphics User Interface)图形用户界面编程.我们可以通过 python 提供的丰富的组件,快速的实现使用图形的界面和用户交互. GUI 编程类似于"搭积 ...
- python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)
常用组件汇总 Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线.矩 ...
- python图形界面化编程GUI(五)坦克大战(一)
坦克大战(一) 需要先安装pygame库,通过pygame来实现游戏的设计,可以通过官方网站提供的文档进行学习. 需求分析 了解项目开发需要的内容,设计需要的类,如坦克类(敌方.我方).子弹类(可以移 ...
- python GUI图形界面化编程——Tkinter
一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读 GUI图形界面化编程 一.前言 一.GUI图形界面化编程 二.常用的GUI库 三.GUI 编程的核心步骤和第一个 GUI 程序 设置窗口的 ...
- Python图形界面库(GUI)各类库的优缺点简介
图形界面库的优缺点: 欢迎可以关注好男人的微信公众号:菜鸟资源分享,完全免费的资源分享平台,互相学习,共同进步 1.Tkinter 简单介绍: 是绑定了 Python 的 Tk GUI 工具集 ,就是 ...
- 关于GUI图形界面化交互模式
Programmierung der grafischen Benutzeroberfläche GUI图形界面化编程 常用的GUI库 1.Tkinter 2.wxPython 3.PyQT tkin ...
- Tkinter模块GUI界面化编程实战(六)——超级游戏盒子(含超详解及完整源码、完整程序免费下载链接)
[上期回顾:Tkinter模块GUI界面化编程实战(五)--大鱼吃小鱼游戏] 这篇博客介绍了如何用Python Tkinter模块编写一个界面化的超级游戏盒子,在博客下面有完整的源码,源码中有详细的注 ...
- 【Java AWT 图形界面编程】LayoutManager 布局管理器 ④ ( GridLayout 网格布局 | GridBagLayout 网格包布局 )
文章目录 一.GridLayout 网格布局 二.GridLayout 构造函数 三.GridLayout 网格布局代码示例 四.GridBagLayout 网格包布局 一.GridLayout 网格 ...
- Android精讲--界面编程2(布局管理器)
为什么需要布局管理器 为了更好地管理Android应用的用户界面里的各种组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常来说,推荐使 ...
最新文章
- puppet、Ansible、SaltStack 自动化运维工具简单对比
- SVN删除服务器端项目文件
- 两个排序数组合并第k或前k个最小值问题
- python:dataframe保存成csv文件和读取
- 揭秘!阿里数据中心大幅降低成本的核心技术:混部技术
- hadoop学习之:Map、Reduce详解
- Java—Iterator接口介绍及使用
- 本地邮件系统的安装及配置
- [原创]HierarchyView的实现原理和Android设备无法使用HierarchyView的解决方法
- 【转】并查集算法和路径压缩
- python隐藏窗口_python中隐藏Console窗口
- UBUNTU 编译安装GEOS
- java后台地址(省,市,区)、姓名、手机号算法智能识别
- 实用又方便电脑快捷键
- 4-20ma和0-5v模拟量无线传输点对点无线采集控制解决方案io开关量信号无线远程控制解决方案
- 数仓维度建模系列-数仓规范篇
- 绝地求生 服务器无响应,绝地求生大逃杀点击游戏无反应进不去问题解决方法一览...
- 日常记录:java JMX获取MBean从而获取目标应用的pid
- noip2013 总结
- ExpandableListView实现可展开的ListView
热门文章
- Java反射(超详细!)
- 荣耀手机无法升级鸿蒙,荣耀手机不能升级鸿蒙了?博主给出升级名单
- 斗鱼坎坷上市路,未来的对手不仅仅只有虎牙
- mysql中性别_在数据库中存储性别(性别)
- java serialport api_android_serialport_api代码分析
- 第五人格共研服服务器正在维护,《第五人格》11月13日共研服更新了什么 共研服更新内容汇总...
- vue实战-mockjs模拟数据
- js控制台输出佛祖保佑图形图案实例代码
- java模拟cpu返回_【学习笔记】模拟Java程序CPU100堆栈追踪
- soundtouch之变调、变速、节拍