python的GUI初步学习(三)

python的GUI初步学习(三)

补充Entry知识,如果将输入的文本用*显示,即密文形式,用show,代码如下:

entry =Entry(win,show='*').pack() 

绑定变量用e =Variable()

from tkinter import *
win =Tk()
def a():
    e.set("点击成功!")
win.geometry('500x300')
#绑定变量
e =Variable()
entry =Entry(win,textvariable=e)
#e就代表那个文本框
e.set('置入的字符')
Button(win,text='确定',command=a).pack(side=BOTTOM)
entry.pack()
mainloop()

Text控件

from tkinter import *
win =Tk()
win.geometry('500x300')
win.title('窗口')
text =Text(win,width=30,height=10,bg='blue',fg='red')
str ="""天生我材必有用,\n千金散尽还复来。"""
text.insert(INSERT,str)
text.pack()
mainloop()

上面在text中输入的汉字是有限的,那么,如何,如何无限制,也就是加上滚动条
创建滚动条用scroll =Scrollbar(),那么,具体代码如下:

#滚动条
from tkinter import *
win =Tk()
win.title('带滚动条的Text')
win.geometry("400x400")
#创建滚动条
scroll =Scrollbar()
text =Text(win,width=30,height=10)
scroll.pack(side=RIGHT,fill=Y)
text.pack(side=LEFT,fill=Y)
#将Text和scroll关联起来
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
text.pack()
str1 ='''弈秋,通国之善弈者也。使弈秋诲二人弈,其一人专心致志,惟弈秋之为听;一人虽听之,一心以为有鸿鹄将至,思援弓缴而射之。虽与之俱学,弗若之矣。为是其智弗若与?曰:非然也。'''
text.insert(INSERT,str1)
mainloop()

其中的两行要重点记住。。。。。

scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)

Checkbutton多选框控件

勾选则在text中打印出函数中的代码,取消勾选,则清除text 中的字符串

from tkinter import *
win =Tk()
win.title('复选框')
win.geometry("400x400+200+100")
def updata():
    message =''
    if hobby.get()==True:
        message+='天颖\n'
    text.delete(0.0, END)
    text.insert(INSERT,message)
#选择绑定时的动作
hobby =BooleanVar()
check =Checkbutton(win,text='Python',variable=hobby,command=updata)
text =Text(win,width=30,height=10)
text.pack()
check.pack()
mainloop()

Radiobutton单选框

from  tkinter import *
win =Tk()
win.title('单选框')
win.geometry('500x400+100+100')
def click():
    print(r.get())
r =IntVar() #绑定变量
radio =Radiobutton(win,text='单选框',value=1,variable=r,command=click)
radio1 =Radiobutton(win,text='单选框',value=2,variable=r,command=click)
radio.pack()
radio1.pack()
win.mainloop()

Listbox

#列表框1   对列表的增删改删
from tkinter import  *
win =Tk()
win.geometry('500x300+200+50')
listbox =Listbox(win,selectmode=BROWSE)
for item in ['语文','数学','英语','物理','化学','生物']:
    listbox.insert(END,item) #END的意思是在每个元素的后面添加下一个元素
listbox.pack()
listbox.insert(ACTIVE,'地理') #在开头插入元素
#可以将一个列表当成一个元素来添加
listbox.insert(END,['历史','政治'])
# 删除:参数1为开始的索引,参数2为结束的索引,参数2的元素也会删除,如果
# 不指定参数2,只删除第一个索引处的内容
# listbox.delete(0,1)
#选中(包括参数2处的元素):参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只选中第一个索引处的内容
listbox.select_set(0,3)
#取消选中:参数1为开始的索引,参数2为结束的索引,如果不指定参数2,只取消第一个索引处的内容
listbox.select_clear(0,1)
#获取列表中的元素个数
print(listbox.size())
#取出对应索引位置的元素
print(listbox.get(0,1))
#返回选中元素索引位置
print(listbox.curselection())
#判断该元素是否被选中
print(listbox.select_includes(1))
win.mainloop()

这里将会涉及绑定事件 bind 绑定
那么需要了解下事件的关联
bind(sequence,func,add)——
bind_class(className,sequence,func,add)
bind_all(sequence,func,add)

事件参数:

sequence         所绑定的事件;
func        所绑定的事件处理函数;
add        可选参数,为空字符或‘+’;
className          所绑定的类;

鼠标键盘事件
<Button-1>            鼠标左键按下,2表示中键,3表示右键;
<ButtonPress-1>        同上;
<ButtonRelease-1>    鼠标左键释放;
<B1-Motion>           按住鼠标左键移动;
<Double-Button-1>     双击左键;
<Enter>               鼠标指针进入某一组件区域;
<Leave>               鼠标指针离开某一组件区域;
<MouseWheel>         滚动滚轮;
<KeyPress-A>         按下A键,A可用其他键替代;
<Alt-KeyPress-A>      同时按下alt和A;alt可用ctrl和shift替代;
<Double-KeyPress-A>    快速按两下A;
<Lock-KeyPress-A>     大写状态下按A;
窗口事件
Activate             当组件由不可用转为可用时触发;
Configure            当组件大小改变时触发;
Deactivate          当组件由可用转变为不可用时触发;
Destroy              当组件被销毁时触发;
Expose              当组件从被遮挡状态中暴露出来时触发;
Unmap              当组件由显示状态变为隐藏状态时触发;
Map                  当组件由隐藏状态变为显示状态时触发;
FocusIn              当组件获得焦点时触发;
FocusOut            当组件失去焦点时触发;
Property             当窗体的属性被删除或改变时触发;
Visibility           当组件变为可视状态时触发;
响应事件

event对象(def function(event)):
char        按键字符,仅对键盘事件有效;
keycode         按键名,仅对键盘事件有效;
keysym         按键编码,仅对键盘事件有效;
num       鼠标按键,仅对鼠标事件有效;
type      所触发的事件类型;
widget      引起事件的组件;
width,heigh       组件改变后的大小,仅Configure有效;
x,y         鼠标当前位置,相对于窗口;
x_root,y_root       鼠标当前位置,相对于整个屏幕

#列表框2  与函数事件的绑定
from  tkinter import *
win =Tk()
win.title('列表框2')
win.geometry('500x300+200+50')
lis =StringVar()
lb =Listbox(win,selectmode=SINGLE,listvariable=lis)
for i in range(10,20):
    lb.insert(END,i)
lb.pack()
print(lis.get())#打印出列表中的元素
# lis.set(("a","b","c"))  #重置元素列表
#绑定事件
def Event(event):
    #通过lb.curselection()索引出位置,在得到该位置的元素,然乎打印出来
    print(lb.get(lb.curselection()))
lb.bind("<Double-Button-1>",Event)  #双击事件,也就是点击两下鼠标,打印相应的元素
mainloop()
#列表框3  滚动条
from tkinter import *
win =Tk()
win.title('列表框3')
win.geometry('500x300+200+50')
# EXTENDED:可以使listbox支持shift和Ctrl
lis =Listbox(win,selectmode=EXTENDED)
for i in range(30):
    lis.insert(END,i)
lis.pack()
#增加滚动条
scroll =Scrollbar(win)
scroll.pack(side=RIGHT,fill=Y)
#列表跟滚动条的关联
lis.config(yscrollcommand=scroll.set)
lis.pack(side=LEFT,fill=BOTH)
scroll["command"] = lis.yview #鼠标可以拖动滚动条
win.mainloop()
#列表框4  点击能够选多个元素
from tkinter import *
win =Tk()
win.title('列表框4')
win.geometry('500x300+200+50')
# MULTIPLE支持多选
lis =Listbox(win,selectmode=MULTIPLE)
for i in range(10):
    lis.insert(END,i)
lis.pack()
win.mainloop()

Scale控件

from tkinter import *
win =Tk()
win.title('Scale控件')
win.geometry('500x300+200+50')
'''
供用户通过拖拽指示器来改变变量的值,可以水平,也可以竖直
'''
# tkinter.HORIZONTAL水平
# tkinter.VERTICAL 竖直(默认)
# length:水平时表示宽度,竖直时表示高度
# tickintervar :选择值将会为该值得倍数
sca =Scale(win,from_=0,to=100,orient=HORIZONTAL,tickinterval=10,length=200)
sca.set(50)#设置初始显示的值
print(sca.get()) #取值
sca.pack()
def Printnum():
    print(sca.get())
Button(win,text='打印当前值',command=Printnum).pack()
mainloop()

Spinbox控件

from tkinter import *
win =Tk()
win.title("yudanqu")
win.geometry("400x400+200+50")
'''
数值范围控件
'''
#绑定变量
v =StringVar()
# increment:步长,默认为1
# values要输入一个元组 最好不要和from和to同时使用,而且步长也没用
# command 只要值改变就会执行updata方法
def Ge():
    print(v.get())
spin =Spinbox(win,from_=0,to=100,increment=5,textvariable=v,command=Ge)
spin.pack()
v.set(20)
print(v.get())
win.mainloop()

Menu顶层菜单

from tkinter import *
win =Tk()
win.title("yudanqu")
win.geometry("400x400+200+50")
menubar =Menu(win)  #菜单条
win.config(menu=menubar)

def func():
    print("************")
menu1 =Menu(menubar,tearoff=False) #菜单选项
#给菜单选项添加内容
for i in range(10):
    if i==9:
        #添加分割线
        menu1.add_separator()
        menu1.add_command(label=i,command=win.quit)
    else:
        menu1.add_command(label=i,command=func)
menubar.add_cascade(label='数字',menu=menu1)

win.mainloop()

Combobox下拉控件

from tkinter import*
from tkinter import ttk
win =Tk()
win.title('组合框')
win.geometry('500x300+200+50')
def Thing(event):
    print('成功选择')
    # print(con.get())
    # print(v.get())
v =StringVar()
con =ttk.Combobox(win,textvariable=v,value=['黑龙江','哈尔滨','上海'])
con.current(0)
con.pack()
con.bind("<<ComboboxSelected>>",Thing)  #注意函数不能加括号
win.mainloop()

Frame控件

'''
框架控件:在桌面上显示一个矩形区域,多作为一个容器控件
'''
from tkinter import *
win =Tk()
win.title('Frame控件')
win.geometry('500x300+200+50')
frame =Frame(win)
frame_1 =Frame(frame)
Button(frame_1,text='按钮',bg='blue').pack(side=TOP)
Button(frame_1,text='按钮',bg='blue').pack(side=TOP)
Button(frame_1,text='按钮',bg='blue').pack(side=TOP)
frame_1.pack(side=LEFT)
frame_2 =Frame(frame)
Button(frame_2,text='按钮',bg='red').pack(side=TOP)
Button(frame_2,text='按钮',bg='red').pack(side=TOP)
Button(frame_2,text='按钮',bg='red').pack(side=TOP)
frame_2.pack(side=LEFT)
frame.pack()
win.mainloop()

表格数据

from tkinter import *
from tkinter import ttk
win =Tk()
win.title("表格")
win.geometry("600x300+200+50")
#表格
tree =ttk.Treeview(win)
tree.pack()
#定义列
tree['columns'] =('姓名','性别','身高','体重')
# 设置每一列的宽度
tree.column('姓名',width=100)
tree.column('性别',width=100)
tree.column('身高',width=100)
tree.column('体重',width=100)
tree.heading('姓名',text="姓名-name")
tree.heading('性别',text="性别-sex")
tree.heading('身高',text="身高/cm-height")
tree.heading('体重',text="体重/kg-weight")
#插入数据
tree.insert('',0,text='line1',values=('天颖','男',180,61))
tree.insert('',0,text='line2',values=('旋风','男',174,66))
tree.insert('',0,text='line3',values=('菲儿','女',168,45))
win.mainloop()

树状数据

from tkinter import *
from tkinter import ttk
win =Tk()
win.title("树状数据")
win.geometry("600x300+200+50")
tree =ttk.Treeview(win)
tree.pack()
#添加一级树枝
tree1 =tree.insert('',0,'中国',text='China',values=('C')) #其中的数字是排列的顺序
tree2 =tree.insert('',2,'美国',text='USA',values=('USA'))
tree3 =tree.insert('',1,'英国',text='UK',values=('UK'))
#添加二级树枝
tree_1 =tree.insert(tree1,0,text='河北')
tree_2 =tree.insert(tree1,1,text='北京')
tree_3 =tree.insert(tree1,2,text='澳门')
#添加三级树枝
tree__1 =tree.insert(tree_1,0,text='石家庄')
tree__2 =tree.insert(tree_1,1,text='张家口')
tree__3 =tree.insert(tree_1,2,text='保定')
win.mainloop()

显示结果为在这里插入图片描述

绝对布局

from tkinter import *
win =Tk()
win.title("绝对布局")
win.geometry("600x300+200+50")
#定义三个标签
lable1 =Label(win,text='小A',bg='red')
lable2 =Label(win,text='小B',bg='blue')
lable3 =Label(win,text='小C',bg='yellow')
# 绝对布局,窗口的变化对位置没有影响
lable1.place(x=0,y=0)
lable2.place(x=0,y=40)
lable3.place(x=40,y=40)
win.mainloop()

显示结果在这里插入图片描述

相对布局

from tkinter import *
win =Tk()
win.title("相对布局")
win.geometry("600x300+200+50")
#定义三个标签
lable1 =Label(win,text='小A',bg='red')
lable2 =Label(win,text='小B',bg='blue')
lable3 =Label(win,text='小C',bg='yellow')
#相对布局,窗口的变化对位置有影响
lable1.pack(fill=Y,side=LEFT)
lable2.pack(fill=X)
lable3.pack()
win.mainloop()

表格布局

from tkinter import *
win =Tk()
win.title("表格布局")
win.geometry("600x300+200+50")
#定义三个标签
lable1 =Label(win,text='小A',bg='red')
lable2 =Label(win,text='小B',bg='blue')
lable3 =Label(win,text='小C',bg='yellow')
lable4 =Label(win,text='小D',bg='green')
#开始表格布局
lable1.grid(row=0,column=0)
lable2.grid(row=0,column=1)
lable3.grid(row=1,column=0)
lable4.grid(row=1,column=1)
win.mainloop()

鼠标点击事件

双击按钮上的不同位置,打印出在按钮上的点击位置

扫描二维码关注公众号,回复: 11190822 查看本文章
from tkinter import *
win =Tk()
win.title("鼠标点击事件")
win.geometry("600x300+200+50")
def func(event):
    print(event.x,event.y)
button =Button(win,text='按钮')
# bind 给控件绑定数据(参数一是绑定的事件,参数二是触发事件的函数)
# <Button-1>  鼠标左键
# <Button-2>  鼠标滚轮
# <Button-1>  鼠标右键
# <Double-Button-1>  鼠标双击左键
# <Triple-Button-1>  鼠标三击左键
button.bind("<Double-Button-1>",func)
button.pack()
mainloop()

鼠标移动事件

点住字托动,不放手,会随着位置的改变,一直打印位置

from tkinter import *
win =Tk()
win.title("鼠标移动事件")
win.geometry("600x300+200+50")
def func(event):
    print(event.x,event.y)
lable =Label(win,text="鼠标移动事件")
lable.pack()
# <B1-Motion>  左键移动
# <B2-Motion>  中键移动
# <B3-Motion>  右键移动
lable.bind("<B1-Motion>",func)
mainloop()

鼠标释放事件

点住字托动,放一次手,打印一次位置
释放的意思就是,松开手打印位置

from tkinter import *
win =Tk()
win.title("鼠标释放事件")
win.geometry("600x300+200+50")

lable =Label(win,text="lable")
lable.pack()
def func(event):
    print(event.x,event.y)
# <ButtonRelease-1> 释放鼠标左键
# <ButtonRelease-2> 释放鼠标中键
# <ButtonRelease-3> 释放鼠标右键
lable.bind("<ButtonRelease-1>",func)
mainloop()

鼠标的进入 和 离开事件

移入一次指定区域,打印一次位置,移出该区域再移入,打印一次位置
与Enter相反
将两个合并在一起,就会出现移入打印一次位置,移出打印一次位置

from tkinter import *
win =Tk()
win.title("鼠标进入离开事件")
win.geometry("600x300+200+50")
lable =Label(win,text='进入该区域,会打印位置呦',bg='green')
lable.pack()
def func(event):
    print(event.x,event.y)
# <Enter>  当鼠标进入控件时触发事件
# <Leave>  当鼠标离开控件时触发事件
lable.bind("<Enter>",func)
lable.bind("<Leave>",func)
mainloop()

响应所有按键的事件

from tkinter import *
win =Tk()
win.title("响应所有按键的事件")
win.geometry("600x300+200+50")
lable =Label(win,text='中华',bg='green')
#需要设置焦点
lable.focus_set()
lable.pack()
# <Key>  响应所有的按键(要有焦点)
def func(event):
    print("event.char=", event.char)  #打印按下的是哪个键,按a打印a
    print("event.keycode=", event.keycode) #打印按下间的keycode值
lable.bind("<Key>",func)
mainloop()

响应特殊按键事件

from tkinter import *
win =Tk()
win.title("响应特殊按键的事件")
win.geometry("600x300+200+50")
lable =Label(win,text='特殊键',bg='blue')
#需要设置焦点
lable.focus_set()
lable.pack()
def func(event):
    print("event.char=", event.char)  #打印按下的是哪个键,按a打印a
    print("event.keycode=", event.keycode) #打印按下间的keycode值
# <Shift_L>  只响应左侧的shift键
# <Shift_R>
# <F5>
# <Return>  也就是回车键
# <BackSpace>  返回,也就是退格键
lable.bind("<Shift_L>",func)
mainloop()

指定按键事件

from tkinter import *
win =Tk()
win.title("指定按键的事件")
win.geometry("600x300+200+50")
lable =Label(win,text='指定键',bg='blue')
#需要设置焦点
lable.focus_set()
lable.pack()
def func(event):
    print("event.char=", event.char)  #打印按下的是哪个键,按a打印a
    print("event.keycode=", event.keycode) #打印按下间的keycode值
win.bind("a",func)#前面写的是win,则只需要写a就可
mainloop()

组合按键事件

from tkinter import *
win =Tk()
win.title("组合按键的事件")
win.geometry("600x300+200+50")
lable =Label(win,text='指定键',bg='blue')
#需要设置焦点
lable.focus_set()
lable.pack()
# <Key>  响应所有的按键(要有焦点)
def func(event):
    print("event.char=", event.char)  #打印按下的是哪个键,按a打印a
    print("event.keycode=", event.keycode) #打印按下间的keycode值
# <Control-Alt-a>
# <Shift-Up>
# 只是control+alt不行
win.bind("<Control-Alt-a>",func)
mainloop()

初步的了解了一下各个控件是什么意思,大概知道每个具体能实现什么功能,在以后的每篇文章中,大致以实现某个有具体功能的GUI为目的。

原创文章 31 获赞 3 访问量 2016

猜你喜欢

转载自blog.csdn.net/qq_43779011/article/details/90742031