Python tkinter 使用
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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * if __name__ == '__main__': pass w = 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 -*- import tkinter from tkinter import * def unpack(): bt1.pack_forget() def ungrid(): bt2.grid_forget() def unplace(): bt3.place_forget() if __name__ == '__main__': pass w = 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
import tkinter from tkinter import * from tkinter import messagebox # 导入*失败,必须导入messagebox def show_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)取消最大化
import tkinter if __name__ == '__main__': w = tkinter.Tk() # 窗口 w.title('测试') # 标题 w.geometry('300x300+30+30') # 大小以及位置 w.resizable(0, 0) # 最大化无效 w.mainloop()