1、 窗口 Tk()
# -*- encoding=utf-8 -*-
import tkinter
if __name__ == '__main__':
w = tkinter.Tk() # 窗口
w.title('南风丶轻语') # 标题
w.geometry('500x500+30+30') # 大小以及位置
w.mainloop()
pass
运行结果
2、 标签 Label()
# -*- encoding=utf-8 -*-
import tkinter
from tkinter import *
def string_var():
if show_str.get() == 'aaa':
show_str.set('bbb') # 改变StringVar的值
else:
show_str.set('aaa')
#label.cget('text')返回text的值:标签
#label.cget('bg')返回背景颜色:yellow
#label.config(text='新值')重新设置text,同设置StringVar
if __name__ == '__main__':
pass
w = tkinter.Tk() # 窗口
w.title('测试标签') # 标题
w.geometry('500x500+30+30') # 大小以及位置
show_str = StringVar(w) # python37需要指定master,而Python27不需要
show_str.set('aaa')
label = Label(
master=w, # 父容器
text='标签', # 文本
bg='yellow', # 背景颜色
fg='red', # 文本颜色
bd=3, # 边框的大小
relief='flat', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 FLAT。
height=1, # 高度
width=5, # 宽度
padx=1, # 内间距,字体与边框的X距离
pady=1, # 内间距,字体与边框的Y距离
state='normal', # 设置状态 NORMAL、ACTIVE、 DISABLED 默认 NORMAL
cursor='circle', # 鼠标移动时样式 arrow, circle, cross, plus
textvariable=show_str, # 通过StringVar对象设置text,注释该行则前面的text才有用
)
label.pack()
Button(command=string_var, text='通过StringVar改变').pack()
w.mainloop()
运行结果
3、 按钮 Button()
# -*- encoding=utf-8 -*-
import tkinter
from tkinter import *
def button_event():
print('按钮事件')
if __name__ == '__main__':
pass
w = tkinter.Tk() # 窗口
w.title('测试按钮') # 标题
w.geometry('500x500+30+30') # 大小以及位置
button = Button(
master=w, # 父容器
text='点击', # 文本
bg='yellow', # 默认颜色
activebackground='red', # 点击时的背景颜色
fg='pink', # 默认文字颜色
activeforeground='blue', # 点击时的文字颜色
bd=3, # 边框的大小
relief='ridge', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 FLAT。
command=button_event, # 点击后执行的按钮事件
height=1, # 按钮的高度
width=5, # 按钮的宽度
highlightcolor='green',
padx=1, # 内间距,字体与边框的X距离
pady=1, # 内间距,字体与边框的Y距离
state='normal' # 设置状态 NORMAL、ACTIVE、 DISABLED 默认 NORMAL
)
button.pack()
w.mainloop()
运行结果
4、 输入框 Entry()
# -*- encoding=utf-8 -*-
import tkinter
from tkinter import *
def add_end():
entry.insert('end', 'aaa') # 插入字符串,end为插入到末尾
def add_insert():
entry.insert('insert', 'ddd') # 插入字符串,insert为插入到光标位置
def add_first():
entry.insert(0, 'bbb') # 插入字符串,0为插入到最前
def add_index_4():
entry.insert(4, '444') # 插入字符串,4为插入的下标
def get_message():
print(entry.get())
# entry.delete(0,tkinter.END)清空Entry
# entry.delete(5)清空Entry下标5的数据
#entry.config(state='disabled')设置不可点击
#entry['state]='disabled'
if __name__ == '__main__':
pass
w = tkinter.Tk() # 窗口
w.title('测试按钮') # 标题
w.geometry('500x500+30+30') # 大小以及位置
entry = Entry(
master=w, # 父容器
bg='yellow', # 默认颜色
fg='pink', # 默认文字颜色
bd=3, # 边框的大小
relief='ridge', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 flat。
width=20, # 宽度
state='normal', # 设置状态 normal、 disabled 默认 normal
show='', # 显示样式,例如密码可以设置为*
)
entry.pack()
Button(command=add_first, text='增加到最前').pack()
Button(command=add_end, text='增加到末尾').pack()
Button(command=add_insert, text='增加到光标位置').pack()
Button(command=add_index_4, text='增加位置为4').pack()
Button(command=get_message, text='获取信息').pack()
w.mainloop()
运行结果
5、 文本框Text()
# -*- encoding=utf-8 -*-
import tkinter
from tkinter import *
def add_end():
text.insert(END, 'aaa') # 插入字符串,END为插入到末尾
def add_insert():
text.insert(INSERT, 'ddd') # 插入字符串,INSERT为插入到光标位置
def get_message():
print(text.get(1.0, END))
def add_button():
text.window_create(INSERT, window=button)
def delete_button():
text.delete(button)
if __name__ == '__main__':
pass
w = tkinter.Tk() # 窗口
w.title('测试Text') # 标题
w.geometry('500x500+30+30') # 大小以及位置
frame = Frame() # 框架控件
s = Scrollbar(frame) # 滚动条
s.pack(side=RIGHT, fill=Y)
text = Text(
master=frame, # 父容器
bg='pink', # 默认颜色
fg='black', # 默认文字颜色
bd=2, # 边框的大小
relief='groove', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 flat。
width=20, # 宽度,根据字符,不是像素,表示可以容纳20个字符
height=10, # 高度
state='normal', # 设置状态 normal、 disabled 默认 normal
yscrollcommand=s.set # 滚动条绑定
)
text.pack()
s.config(command=text.yview)
frame.pack()
button = Button(text='测试插入组件')
Button(command=add_end, text='增加到末尾').pack()
Button(command=add_insert, text='增加到光标位置').pack()
Button(command=get_message, text='获取信息').pack()
Button(command=add_button, text='插入按钮').pack()
Button(command=delete_button, text='删除按钮').pack()
w.mainloop()
运行结果
6、列表框控制元件ListBox()
# -*- encoding=utf-8 -*-
import tkinter
from tkinter import *
def get_select():
select = listbox.curselection() # 获取选择的下标,返回元组
print(select)
for index in select:
print(listbox.get(index)) # 获取下标的值
if __name__ == '__main__':
pass
w = tkinter.Tk() # 窗口
w.title('测试标签') # 标题
w.geometry('500x500+30+30') # 大小以及位置
show = ['aa', 'bb', 'cc', 'dd']
frame = Frame()
frame.pack()
s = Scrollbar(frame)
s.pack(side=RIGHT, fill=Y)
listbox = Listbox(
master=frame, # 父容器
bg='yellow', # 背景颜色
fg='red', # 文本颜色
bd=3, # 边框的大小
relief='flat', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 FLAT。
height=3, # 高度
width=5, # 宽度
state='normal', # 设置状态 NORMAL、ACTIVE、 DISABLED 默认 NORMAL
cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus
selectmode=EXTENDED, # 选择模式
# SINGLE(單選)、BROWSE(也是單選,但拖動滑鼠或通過方向鍵可以直接改變選項)、
# MULTIPLE(多選)和 EXTENDED(也是多選,但需要同時按住 Shift 鍵或 Ctrl 鍵或拖拽滑鼠實現),
# 預設是 BROWSE
yscrollcommand=s.set,
)
s.config(command=listbox.yview)
for i in show:
listbox.insert(END, i) # 插入选择项
listbox.pack()
Button(command=get_select, text='查看选择').pack()
w.mainloop()
运行结果
7、复选框Checkbutton()
# -*- encoding=utf-8 -*-
import tkinter
from tkinter import *
def get_select():
if choose.get() == 1:
print('选中')
else:
print('未选中')
def see_select():
if choose.get() == 1 and choose1.get() == 1:
print('选中了两个')
else:
print('未都选中')
if __name__ == '__main__':
pass
w = tkinter.Tk() # 窗口
w.title('测试') # 标题
w.geometry('500x500+30+30') # 大小以及位置
choose = IntVar(w)
checkbutton = Checkbutton(
master=w, # 父容器
text='选择1', # 文本
bg='yellow', # 背景颜色
fg='red', # 文本颜色
bd=3, # 边框的大小
relief='flat', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 FLAT。
height=1, # 高度
width=5, # 宽度
state='normal', # 设置状态 NORMAL、ACTIVE、 DISABLED 默认 NORMAL
cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus
onvalue=1,
offvalue=0,
variable=choose,
)
checkbutton.pack()
choose1 = IntVar(w)
checkbutton1 = Checkbutton(
master=w, # 父容器
text='选择1', # 文本
bg='yellow', # 背景颜色
fg='red', # 文本颜色
bd=3, # 边框的大小
relief='flat', # 边框的3D样式 flat、sunken、raised、groove、ridge。默认为 FLAT。
height=1, # 高度
width=5, # 宽度
state='normal', # 设置状态 NORMAL、ACTIVE、 DISABLED 默认 NORMAL
cursor='arrow', # 鼠标移动时样式 arrow, circle, cross, plus
onvalue=1,
offvalue=0,
variable=choose1,
)
checkbutton1.pack()
Button(command=get_select, text='测试是否选中').pack()
Button(command=see_select, text='查看选择').pack()
w.mainloop()
运行结果
8、框架控件Frame()
用于放置其他控件的容器
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('200x100+30+30') #大小以及位置
frame = Frame() #定义容器
Button(
master=frame, #父容器为frame
text='容器1上的按钮', #文本
).pack()
frame2= Frame() #定义容器
Button(
master=frame2, #父容器为frame2
text='容器2上的按钮', #文本
).grid(row=0, column=0)
Label(frame2, text='容器2上的Lable', bg='yellow', fg='pink').grid(row=0, column=1)
frame.pack()
frame2.pack()
w.mainloop()
运行结果
9、pack()布局
(1)默认居中,从上而下
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('200x100+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').pack() #默认居中,从上而下
Button(w, text='按钮2', bg='yellow').pack()
Button(w, text='按钮3', bg='blue').pack()
w.mainloop()
运行结果
(2)填充X轴或Y轴
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('200x100+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').pack(
fill=X, #填充横坐标
)
Button(w, text='按钮2', bg='yellow').pack()
Button(w, text='按钮3', bg='blue').pack()
w.mainloop()
运行结果
(3)内外间距,注意与fill同用时不容易看出效果
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('200x200+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').pack(
padx=10, #横坐标外间距
pady=10, #纵坐标外间距
ipadx=10, #横坐标内间距
ipady=10, #纵坐标内间距
)
Button(w, text='按钮2', bg='yellow').pack()
Button(w, text='按钮3', bg='blue').pack()
w.mainloop()
运行结果
(4)上下左右Side放置
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('200x200+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').pack(
side=RIGHT, #右对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
Button(w, text='按钮2', bg='yellow').pack(
side=LEFT, #左对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
Button(w, text='按钮3', bg='blue').pack(
side=TOP, #上对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
Button(w, text='按钮4', bg='pink').pack(
side=BOTTOM, #下对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
w.mainloop()
运行结果
(5)左对齐Side放置
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('300x100+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').pack(
side=LEFT, #右对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
Button(w, text='按钮2', bg='yellow').pack(
side=LEFT, #左对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
Button(w, text='按钮3', bg='blue').pack(
side=LEFT, #上对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
Button(w, text='按钮4', bg='pink').pack(
side=LEFT, #下对齐
padx=5, #横坐标外间距
pady=5, #纵坐标外间距
ipadx=5, #横坐标内间距
ipady=5, #纵坐标内间距
)
w.mainloop()
运行结果
10、grid()布局
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('300x300+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').grid(row=0, column=0) #按照几行几列自动布局
Button(w, text='按钮2', bg='yellow').grid(row=0, column=1)
Button(w, text='按钮3', bg='blue').grid(row=0, column=2)
Button(w, text='按钮4', bg='pink').grid(row=1, column=0)
Button(w, text='按钮5', bg='Gold').grid(row=2, column=1)
Button(w, text='按钮6', bg='green').grid(row=3, column=2)
w.mainloop()
运行结果
11、Place()布局
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('300x300+30+30') #大小以及位置
Button(w, text='按钮1', bg='red').place(x=10, y=10) #按照给定坐标进行布局
Button(w, text='按钮1', bg='yellow').place(x=50, y=50) #按照给定坐标进行布局
Button(w, text='按钮1', bg='pink').place(x=80, y=0) #按照给定坐标进行布局
w.mainloop()
运行结果
12、其他函数
(1)窗口居中
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
screenwidth =w.winfo_screenwidth()
screenheight=w.winfo_screenheight()
w_width= 300 #假定显示宽为300
w_height = 300 #假定显示宽高300
x = int((screenwidth - w_width) / 2)
y= int((screenheight - w_height) / 2)
w.geometry('{}x{}+{}+{}'.format(w_width, w_height, x, y)) #大小以及位置
w.mainloop()
运行结果(无)
(2)取消显示已经放置的控件
#-*- encoding=utf-8 -*-
importtkinterfrom tkinter import *
defunpack():
bt1.pack_forget()defungrid():
bt2.grid_forget()defunplace():
bt3.place_forget()if __name__ == '__main__':passw= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('300x300+0+0') #大小以及位置
f1 =Frame()
f2=Frame()
f3= Frame(width=100, height=100, bg='blue')
bt1= Button(f1, text='按钮1', bg='red', command=unpack)
bt1.pack()
bt2= Button(f2, text='按钮2', bg='yellow', command=ungrid)
bt2.grid(row=0, column=0)
bt3= Button(f3, text='按钮3', bg='pink', command=unplace)
bt3.place(x=10, y=10)
f1.pack()
f2.pack()
f3.pack()
w.mainloop()
运行结果
(3)提示信息messagebox
importtkinterfrom tkinter import *
from tkinter import messagebox #导入*失败,必须导入messagebox
defshow_msg():
messagebox.showinfo('提示', '提示信息')
messagebox.showwarning('提示', '警告信息')
messagebox.showerror('提示', '错误信息')if __name__ == '__main__':
w= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('300x300+30+30') #大小以及位置
Button(w, text='提示', bg='red', command=show_msg).pack() #默认居中,从上而下
w.mainloop()
(4)取消最大化
importtkinterif __name__ == '__main__':
w= tkinter.Tk() #窗口
w.title('测试') #标题
w.geometry('300x300+30+30') #大小以及位置
w.resizable(0, 0) #最大化无效
w.mainloop()
(5)增删改查小案例
https://github.com/rainbow-tan/rainbow/tree/master/tkinter%E5%A2%9E%E5%88%A0%E6%94%B9%E6%9F%A5