import tkinter
from tkinter import ttk
#主窗口
win = tkinter.Tk()

#设置主窗体的标题
win.title("主窗体")

#设置主窗口大小(用x)和位置(以左上角为标准+)
#长:300
#宽300
#左边间距:100
#上边间距:50

win.geometry("300x300+100+50")

'''
注意:属性或者说参数都可以在控件类中查看
标签Label:
    第一个参数:控件所在的窗体
    text:标签文本
    bg:标签背景色
    fg:字体颜色
    width:标签宽度
    height:标签高度
    font:标签字体样式
    justify:文本对齐
'''

label = tkinter.Label(win,text="我是一个标签",bg="black",fg="white",width=15,height=1,font=("黑体",20),wraplength="200",justify="left",anchor="center")
#显示控件
label.pack()
'''
按钮Button
'''
#command:要执行的函数,可以是匿名函数
button = tkinter.Button(win,text="按钮",width=10,command=lambda :print("我是个按钮"))
button.pack()
'''
Entry文本框
'''

#给文本框赋值的变量
var = tkinter.Variable()
#文本框,textvariable:文本框内容,show:文本加密,密码框:show="*"
entry = tkinter.Entry(win,textvariable=var)
#给文本框设置文本
var.set("我是文本框")
#获取文本框中的文本,两种方法
print(var.get())
print(entry.get())
#点击按钮打印出文本框中的内容
button2 = tkinter.Button(win,text="打印文本内容",command=lambda :print(var.get()))

entry.pack()
button2.pack()
'''
文本域Text
'''
#height:文本行数,不带滚动条
text1 = tkinter.Text(win,height=2)
text1.pack()
#带滚动条的文本域

text2 = tkinter.Text(win,heigh=5)
#滚动条
scrollBar = tkinter.Scrollbar()
#在窗体左侧显示文本域内容,side:哪一侧显示,fill:移动填充方向
text2.pack(side=tkinter.LEFT,fill=tkinter.Y)
#在窗体右侧显示滚动条,fill:Y上下滚动,X左右滚动
scrollBar.pack(side=tkinter.RIGHT,fill=tkinter.Y)
#向文本域插入内容
str='''啊发放房贷发放巨大加法后发哈肌肤的哈佛【哦覅妇女今年烦烦烦的江南发哈爆发后不久啊大家看法你的解放军啊手动阀的地方静安寺兑换积分活动环节和佛教的护法和地方很近
啊发放房贷发放巨大加法后发哈肌肤的哈佛【哦覅妇女今年烦烦烦的江南发哈爆发后不久啊大家看法你的解放军啊手动阀的地方静安寺兑换积分活动环节和佛教的护法和地方很近
啊发放房贷发放巨地方很近
'''
text2.insert(tkinter.INSERT,str)
#将滚动条和文本域联系起来
#滚动条移动,文本跟着移动
scrollBar.config(command=text2.yview())
#文本移动,滚动条跟着移动
text2.config(yscrollcommand=scrollBar.set)
'''
复选框Checkbutton
    变量最好用BooleanVar(),get()获取为True或False,默认未选中
    变量用其他的,get()获取为0或1,并且默认是选中的
'''

#复选框变量,是否被选中,选中True,未选中False
checkVar = tkinter.BooleanVar()
check = tkinter.Checkbutton(win,text="复选框",variable=checkVar,command=lambda :print(checkVar.get()))
check.pack()
'''
单选框Radiobutton
    分组变量最好用IntVar(),get()方法获取的是属性value的值否则默认选中
'''
#添加一个分组变量,用于实现单选
radionVar = tkinter.IntVar()
#get()获取value的属性值
radioButton1 = tkinter.Radiobutton(win,text="单选框",variable=radionVar,value=1,command=lambda :print(radionVar.get()))
radioButton2 = tkinter.Radiobutton(win,text="单选框",variable=radionVar,value=2,command=lambda :print(radionVar.get()))
radioButton1.pack()
radioButton2.pack()
'''
列表框Listbox
'''

#添加变量
listVar = tkinter.StringVar()
#selectmode:可选模式,有很多
listBox = tkinter.Listbox(win,selectmode=tkinter.SINGLE,listvariable=listVar)
#添加元素,insert(index,*element):index可以使用常量,也可以使用下标,下标为0意味着倒叙插入,下标等于或超出元素下标按顺序插入
for i in ["1","2","3"]:
    listBox.insert(2,i)
listBox.pack(side=tkinter.LEFT,fill=tkinter.BOTH)
#选中下标元素,可以单个选中,也可以范围选中
# listBox.selection_set(0,1)
#修改列表框元素,可以是单个元素,也可以是多个元素
listVar.set(["我","和","你","我","和","你","我","和","你","我","和","你","我","和","你","我","和","你"])
#是否有元素选中
print(listBox.select_includes(1))
#获取选中元素的下标
print(listBox.curselection())
#获取变量中所有的元素
print(listVar.get())
#获取指定下标的元素,可以是单个也可以范围
print(listBox.get(0))
#事件:获取选中的内容,注意必须要有一个事件参数,不用传值
def shuangji(event):
    print(listBox.get(listBox.curselection()))
#绑定事件,双击事件<Double-Button-1>,事件有很多这只是其中一个
listBox.bind("<Double-Button-1>",shuangji)

#列表框添加滚动条
listScroll = tkinter.Scrollbar(win)
listScroll.pack(side=tkinter.RIGHT,fill=tkinter.Y)
listBox.configure(yscrollcommand=listScroll.set)
listScroll["command"] = listBox.yview

'''
拖拽控制变量的大小Scale,比如音量
from_:变量起始大小
to:变量最大值
orient=tkinter.HORIZONTAL:水平
orient=tkinter.VERTICAL:竖直
tickinterval:变量间隔显示值
width:拖动条宽度
'''

scale = tkinter.Scale(win,from_=0,to=100,orient=tkinter.HORIZONTAL,tickinterval=50,width=8)
scale.pack()
'''
菜单Menu
'''

#菜单条
menuBar = tkinter.Menu(win)
#顶层菜单,也就是配置该菜单为菜单条
win.config(menu=menuBar)
#菜单栏,tearoff:格式化菜单栏,没它第一个菜单项会有一条虚线
menu1 = tkinter.Menu(menuBar,tearoff=False)

def closeFun():
    win.quit()
for i in ["c","c++","java","python","php","nodejs","c#","js","退出"]:
    if i == "退出":
        #添加分割线
        menu1.add_separator()
        menu1.add_command(label=i,command=closeFun)
    else:
        #添加菜单
        menu1.add_command(label=i)

#添加菜单项
menuBar.add_cascade(label="语言",menu=menu1)


'''
右键菜单Menu
    就是在窗体或者容器点击鼠标右键显示菜单
'''

#菜单条
menuBar2 = tkinter.Menu(win)
win.config(menu=menuBar2)
#菜单
menu2 = tkinter.Menu(menuBar2,tearoff=False)
for i in ["c","c++","java","python","php","nodejs","c#","js","退出"]:
    if i == "退出":
        #添加分割线
        menu2.add_separator()
        menu2.add_command(label=i,command=closeFun)
    else:
        #添加菜单
        menu2.add_command(label=i)

menuBar2.add_cascade(label="语言",menu=menu2)

#添加窗体右键事件的绑定
def youjian(event):
    #菜单条在窗体中的坐标
    menuBar2.post(event.x_root,event.y_root)
win.bind("<Button-3>",youjian)


'''
下拉框Combobox
'''

#也可以设置变量
comboxVar = tkinter.StringVar()
combox = ttk.Combobox(win,textvariable=comboxVar)
combox.pack()
#通过元组来添加下拉框的元素
combox["values"] = ("上海","北京","广州","河南","安阳")
#设置下拉框中的元素为默认值
combox.current(0)
#设置下拉框的默认值
combox.set("省份")
#获取当前下拉框选中的值
print(combox.get())
print(comboxVar.get())
#绑定事件
def comboxFun(event):
    print(combox.get())
combox.bind("<<ComboboxSelected>>",comboxFun)


'''
容器控件Frame,可以放多个控件
'''

#底层容器
lastFrame = tkinter.Frame(win)
#子容器1
frame_l = tkinter.Frame(lastFrame)
#子容器2
frame_r = tkinter.Frame(lastFrame)
tkinter.Label(frame_l,bg="pink",text="左上").pack(side=tkinter.TOP,)
label2 = tkinter.Label(frame_r,bg="red",text="右上").pack(side=tkinter.TOP)
label3 = tkinter.Label(frame_l,bg="yellow",text="左下").pack(side=tkinter.TOP)
label4 = tkinter.Label(frame_r,bg="blue",text="右下").pack(side=tkinter.TOP)
lastFrame.pack()
frame_l.pack(side=tkinter.LEFT)
frame_r.pack(side=tkinter.RIGHT)


'''
两种数据结构:
    表格数据
    树状数据
'''
#表格

tree = ttk.Treeview(win)
tree.pack()
#定义列
tree["columns"]=("姓名","年龄","身高","体重")
#设置列
tree.column("姓名",width=10)
tree.column("年龄",width=10)
tree.column("身高",width=10)
tree.column("体重",width=10)
#设置表头文本
tree.heading("姓名",text="姓名")
tree.heading("年龄",text="年龄")
tree.heading("身高",text="身高")
tree.heading("体重",text="体重")
#添加数据
#参数1:父节点,表格不需要
#参数2:哪一行,下标从0开始
#参数text:设置第一列文本
#参数values:表格数据
tree.insert("",0,text="01",values=("张三","15","178cm","74公斤"))
tree.insert("",1,text="02",values=("李四","15","178cm","74公斤"))

#树状

tree2 = ttk.Treeview(win)
tree2.pack()
#父节点(根节点)
#参数1:parent父节点
#参数2:同一级排序,从0开始
#参数text:同上,显示文本数据,主要用这个
#参数values:用不上
tree2_1 = tree2.insert("",0,text="中国",values=())
tree2_2 = tree2.insert("",1,text="美国",values=())
tree2_3 = tree2.insert("",2,text="英国",values=())
#子节点
tree2_1_1 = tree2.insert(tree2_1,0,text="河南",values=())
tree2_1_2 = tree2.insert(tree2_3,0,text="英格兰",values=())
tree2_1_3 = tree2.insert(tree2_2,0,text="阿拉斯加",values=())





















win.mainloop()
10-06 17:47