我真的不想学英语,所以就来填坑了
在做人工智能导论作业时初步接触tkinker,但当时大多的操作是照猫画虎,写个便签,记录一下,顺便系统地学习学习。
窗口主体框架
每一个 tkinter 应用的主体框架都可以包含下面这部分. 定义window窗口 和window的一些属性, 然后书写窗口内容, 最后执行window.mainloop
让窗口活起来.
首先import library,import tkinter as tk
。
window = tk.Tk()
window.title('my window')
window.geometry('200x100')
# 这里是窗口的内容
window.mainloop()
标签
l = tk.Label(window,
text='OMG! this is TK!', # 标签的文字
bg='green', # 背景颜色
font=('Arial', 12), # 字体和字体大小
width=15, height=2 # 标签长宽
)
l.pack() # 固定窗口位置
同时,利用如下方式也可以实现窗口的文字变换
var = tk.StringVar() # 这时文字变量储存器
l = tk.Label(window,
textvariable=var, # 使用 textvariable 替换 text, 因为这个可以变化
bg='green', font=('Arial', 12), width=15, height=2)
l.pack()
# 也可以这样
l = tk.Label(window, bg='yellow', width=20, text='empty')
def print_selection():
l.config(text='you have selected ' + var.get()) # 每次调用该功能标签中的文字都会改变
按钮
b = tk.Button(window,
text='hit me', # 显示在按钮上的文字
width=15, height=2,
command=hit_me) # 点击按钮式执行的命令,按钮被点击即执行hit_me功能
b.pack() # 按钮位置
def hit_me():
# function
输入框
e = tk.Entry(window,show='*') # 用户输入任何内容都显示为*
e.pack()
# 利用e.get()可以获取当前输入框中的文字
var = e.get()
显示框
t = tk.Text(window,height=2)
t.pack()
# 利用t.insert()可以实现对显示框中的内容进行改变
t.insert('insert',var) # 将var对应的内容插入当前光标的位置
t.insert('end',var) # 将var对应的内容插入显示框尾部
Listbox
用处不大
var2 = tk.StringVar()
var2.set((11,22,33,44)) #为变量设置值
#创建Listbox
lb = tk.Listbox(window, listvariable=var2) #将var2的值赋给Listbox
#创建一个list并将值循环添加到Listbox控件中
list_items = [1,2,3,4]
for item in list_items:
lb.insert('end', item) #从最后一个位置开始加入值
lb.insert(1, 'first') #在第一个位置加入'first'字符
lb.insert(2, 'second') #在第二个位置加入'second'字符
lb.delete(2) #删除第二个位置的字符
lb.pack()
# 可以利用如下语句获取当前选中的文本
value = lb.get(lb.curselection()) # 获取当前选中的文本
选择按钮
def print_selection():
l.config(text='you have selected ' + var.get())
r1 = tk.Radiobutton(window, text='Option A',
variable=var, value='A',
command=print_selection)
r1.pack()
r2 = tk.Radiobutton(window, text='Option B',
variable=var, value='B',
command=print_selection)
r2.pack()
r3 = tk.Radiobutton(window, text='Option C',
variable=var, value='C',
command=print_selection)
r3.pack()
# 其中variable=var, value='A'的意思就是,当我们鼠标选中了其中一个选项,把value的值A放到变量var中,然后赋值给variable,再执行var.get()即可获得选定选项的value。
Scale
我的最爱!
# Sacle的初始化
s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,
length=200, showvalue=0, tickinterval=2, resolution=0.01, command=function)
# 参数不必多介绍,老痛苦回忆了
s.pack()
在这里要强调一下scale中的command,他有一个非常牛逼的点,他会自动传入一个参数,所以哉定义其对应的function时要注意加上该参数。
这里传入的参数是什么呢?不是别的,正是当前scale对应的取值,所以要获得scale上的值,我们可以用下面的方法
s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,
length=200, showvalue=0, tickinterval=2, resolution=0.01, command=function)
s.pack()
def function(vv):
v=vv
print(v)
# 这样便可以随滑块的滑动改变v的取值了
勾选项
var1 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0,
command=print_selection)
c1.pack()
# 参数onvalue和前面讲的部件radiobutton中的value相似, 当我们选中了这个checkbutton,onvalue的值1就会放入到var1中, 然后var1将其赋值给参数variable,offvalue用法相似,但是offvalue是在没有选中这个checkbutton时,offvalue的值1放入var1.
def print_selection():
if (var1.get() == 1) & (var2.get() == 0): #如果选中第一个选项,未选中第二个选项
l.config(text='I love only Python ')
elif (var1.get() == 0) & (var2.get() == 1): #如果选中第二个选项,未选中第一个选项
l.config(text='I love only C++')
elif (var1.get() == 0) & (var2.get() == 0): #如果两个选项都未选中
l.config(text='I do not love either')
else:
l.config(text='I love both') #如果两个选项都选中
# 可以通过if-else语句实现不同的组合功能
Canvas
画棋盘
插入图片
image_file = tk.PhotoImage(file='ins.gif') # 创造一个变量存放ins.gif这张图片,注意图片要存放在根目录
image = canvas.create_image(10, 10, anchor='nw', image=image_file) # 参数10,10就是图片放入画布的坐标, 而这里的anchor=nw则是把图片的左上角作为锚定点,在加上刚刚给的坐标位置,即可将图片位置确定。
画几何图案
x0, y0, x1, y1= 50, 50, 80, 80
# 画直线,从x0,y0到x1,y1
line = canvas.create_line(x0, y0, x1, y1)
#创建一个圆,填充色为`red`红色
oval = canvas.create_oval(x0, y0, x1, y1, fill='red')
#创建一个扇形,start=0和extent=180其实就是从0度到180度
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180)
#创建一个矩形,同样也可以用fill参数进行填充,在这里不做演示
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)
移动图形
canvas.move(rect, 0, 2)
# 参数(rect,0,2)就是移动rect这个变量,即我们看到的矩形,后面的0和2,也就是横坐标移动0个单位,纵坐标移动2个单位
Menubar
建菜单栏,我这辈子应该是用不上这个功能
menubar = tk.Menu(window) # 建立菜单栏对象(菜单栏指存放菜单的那个框框)
filemenu = tk.Menu(menubar, tearoff=0) # 定义一个空菜单单元
menubar.add_cascade(label='File', menu=filemenu) # 将上面定义的空菜单命名为`File`,放在菜单栏中
filemenu.add_command(label='New', command=do_job) # 在`File`中加入`New`的小菜单,即我们平时看到的下拉菜单,每一个小菜单对应命令操作。如果点击这些单元, 就会触发`do_job`的功能
filemenu.add_separator()##这里就是一条分割线
filemenu.add_command(label='Exit', command=window.quit) # quit功能
# 建立二级菜单
submenu = tk.Menu(filemenu) # 和上面定义菜单一样,不过此处是在`File`上创建一个空的菜单
filemenu.add_cascade(label='Import', menu=submenu, underline=0) # 给放入的菜单`submenu`命名为`Import`
submenu.add_command(label="Submenu1", command=do_job)##这里和上面也一样,在`Import`中加入一个小菜单命令`Submenu1`
不同的放置方式
pack
tk.Label(window, text='1').pack(side='top')#上
tk.Label(window, text='1').pack(side='bottom')#下
tk.Label(window, text='1').pack(side='left')#左
tk.Label(window, text='1').pack(side='right')#右
grid
tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)
# 以表格格式放置,padx就是单元格左右间距,pady就是单元格上下间距,放在表格的(i,j)位置
place
tk.Label(window, text=1).place(x=20, y=10, anchor='nw')
# 利用精确坐标定位,anchor为锚点
😞呢
©著作权归作者所有