一.tkinter创建gui程序
from tkinter import *
root(根窗口名)=Tk()
root.mainloop()#窗口事件主循环
方法
tkinter.geometry(宽度x高度+左上角水平坐标+左上角垂直坐标)(是英文x不是乘号)
tkinter.title(“标题“)
tkinter提供变量类:IntVar,StringVar,DoubleVar,BooleanVar 可创建的变量类对象,能动态设置并获取控件的相应属性。
变量类的方法: x.set(值)x.get()
若 v=IntVar() 不能用v=xx 也不能用if v==xx
*函数中能获取主程序中以上变量类对象的信息,不用传入参数。
二.窗口控件
创建:x=控件名(父窗口,参数。。)
显示x.grid(…)或x.pack(…)
也可不命名,直接用 控件名(…).grid/pack(….)
1标签
a=Label(父窗口[,text=”..”,width=,height=])
动态显示文本label对象.config(None,text=”..”)
2按钮
a=Button(父窗口,text=,command=函数名)函数名不加括号参数表
例
from tkinter import *
count=0
root=Tk()
def f1():
global count
count=count+1
lab.config(None,text="你点击了"+str(count)+"次")
lab=Label(root,text="0")
lab.pack()
b1=Button(root,text="click",command=f1)
b1.pack()
root.mainloop()
3单行文本框
- a=Entry(父窗口,[width=,height=])
插入文本 a.insert(index,”…”) 会自动转为字符型 - a.get() 获取的是字符型
- a.delete(startindex[,endindex]) 删除从开始到不包括终止位置的字符。若无终止位置,只删除起始位置的一个字符
*END 代表末尾
4多行文本框
- a=Text(父窗口,[bg(背景色)=,fg(前景色)=,font(字体)=,height=,weight=]
- a.insert(index,”…”) index用 row.line表示,也可以用INSERT表示插入点的当前位置,或用END 如a.insert(0.0,”编辑文本“)
- a.get(startindex[,endindex])获取从开始到不包括终止位置的字符。若无终止位置,只获取起始位置的一个字符 。index用 row.line表示
- a.delete(startindex[,endindex]) 删除从开始到不包括终止位置的字符。若无终止位置,只删除起始位置的一个字符 。index用 row.line表示
- 用tags对自定义区域进行格式设置
a.tag_add(“标志名”,startindex[,endindex()(必须先写这个)
a.tag_config(“标志名”[,foreground=,background=])
例
from tkinter import *
def fu1():
if v1.get()==0:
t.tag_add("tt",0.0,END)
t.tag_config("tt",foreground="red")
if v1.get()==1:
t.tag_add("tt",0.0,END)
t.tag_config("tt",foreground="yellow")
if v1.get()==2:
t.tag_add("tt",0.0,END)
t.tag_config("tt",foreground="pink")
def fu2():
t.delete(0.0,END)
txt=""
if v2.get()==1:
txt+="斜体"
if v3.get()==1:
txt+="粗体"
if v2==0 and v3==0:
txt=""
t.insert(0.0,txt)
root=Tk()
root.columnconfigure(0,weight=1)
root.rowconfigure(0,weight=1)
f=Frame(root)
f.grid(row=0)
t=Text(f)
t.insert(0.0,"编辑文字")
t.grid(row=0,columnspan=5)
t.tag_add("tt",0.0,END)
bb=[[0,"red"],[1,"yellow"],[2,"pink"]]
v1=IntVar()
v2=IntVar()
v3=IntVar()
for i,j in bb:
Radiobutton(f,text=j,variable=v1,value=i,command=fu1) .grid(row=1,column=i)
Checkbutton(f,text="斜体",variable=v2,command=fu2).grid(row=1,column=3)
Checkbutton(f,text="粗体",variable=v3,command=fu2).grid(row=1,column=4)
root.mainloop()
5单选按钮
a=Radiobutton(父窗口名,text=,variable=组控参数名,value=按钮被选中时的值,command=函数名)
被选中后value的值会传给variable,一组单选按钮共用一个variable。
例
from tkinter import *
def cal():
print(rvar.get())
def fx():
if rvar.get()==0:
e3.delete(0,END)
lab1.config(None,text="-")
e3.insert(0,int(e1.get())-int(e2.get()))
elif rvar.get()==1:
lab1.config(None,text="+")
e3.delete(0,END)
e3.insert(0,int(e1.get())+int(e2.get()))
elif rvar.get()==2:
lab1.config(None,text="*")
e3.delete(0,END)
e3.insert(0,int(e1.get())*int(e2.get()))
elif rvar.get()==3:
lab1.config(None,text="/")
e3.delete(0,END)
e3.insert(0,int(e1.get())/int(e2.get()))
root=Tk()
f=Frame(root)
root.columnconfigure(0,weight=1)
root.rowconfigure(0,weight=1)
f.grid(row=0)
e1=Entry(f)
e1.grid(row=0)
lab1=Label(f,text="")
lab1.grid(row=0,column=1)
e2=Entry(f)
e2.grid(row=0,column=2)
lab2=Label(f,text="=")
lab2.grid(row=0,column=3)
e3=Entry(f)
e3.grid(row=0,column=4)
rvar=IntVar()
bb=[["-",0],["+",1],["*",2],["/",3]]
b=[] #一组单选按钮
cal()
for i,j in bb:
b.append(Radiobutton(f,text=i,variable=rvar,value=j,command=fx))
b[j].grid(row=1,column=j)
root.mainloop()
6复选按钮
a=Checkbutton(父窗口名,text=,variable=,onvalue=(默认为1),offvalue=( 默认为0),command=函数名) 每个复选按钮都有一个自己的variable
例子在4多行文本框里
7菜单
menubar=Menu(父窗口)#把菜单栏添加到父窗口中,menubar是一个菜单栏名
m1=Menu(菜单栏名)#创建一个下拉菜单,m1是一个下拉菜单名
m1.add_command(label="下拉菜单中单项文字文字",command=函数名)#向下拉菜单添加一个菜单项
m1.add_separator()#添加菜单分隔线。
#一个下拉菜单中创建多个菜单项时,可在两个add_command()之间加add_separator()添加菜单分隔线
menubar.add_cascade(label="菜单中单项文字",menu=下拉菜单名)#将下拉菜单添加到菜单栏中
父窗口.config(menu=菜单栏名)
例
def prin(n):
print(n)
def savecall():
print("save")
def opencall():
print("open")
from tkinter import *
root=Tk()
menubar=Menu(root)
filemenu=Menu(menubar)
filemenu.add_command(label="open",command=opencall)
filemenu.add_command(label="save",command=savecall)
filemenu.add_separator()
filemenu.add_command(label="exit",command=root.destroy)
menubar.add_cascade(label="File",menu=filemenu)
m2=Menu(menubar)
m2.add_command(label="about",command=aboutmenu)
menubar.add_cascade(label="help",menu=m2)
root.config(menu=menubar)
root.mainloop()
三 窗口布局
1.几何布局管理器
pack和grid不能混用
1 pack
控件对象.pack()
根据创造顺序从上而下添加到父控件中。
可选参数
- side:TOP(默认),BOTTOM,LEFT,RIGHT
- expand:窗口大小变化时控件是否随之变化,可选值“no”或0(不变),“yes”或1.(与fill一同用才能缩放)
fill:填充方式 “Y”或“X”或“BOTH”
例
from Tkinter import *
root = Tk()
Button(root,text=’A’).pack(side=LEFT,expand=YES,fill=Y)
Button(root,text=’B’).pack(side=TOP,expand=YES,fill=BOTH)
Button(root,text=’C’).pack(side=RIGHT,expand=YES,fill=NONE)
Button(root,text=’D’).pack(side=LEFT,expand=NO,fill=Y)
Button(root,text=’E’).pack(side=TOP,expand=YES,fill=BOTH)
Button(root,text=’F’).pack(side=BOTTOM,expand=YES)
Button(root,text=’G’).pack(anchor=SE)
root.mainloop()
2 grid
控件对象.grid()
可选参数:
- row,不写默认可添加的第一行
- column 不写默认第零列
- columnspan,rowspan占几列
若要自动缩放,把它与frame结合。
from Tkinter import *
root = Tk()
f1=Frame(root)
root.rowconfigure(0,weight=1) #root的第一行以一倍速缩放
root.columnconfigure(0,weight=1)#root的第零列以一倍速缩放
f1.grid(row=0)#框架添加到第一行,然后把控件都添加到框架里
grid无法让一整列/行空着,而在这个列/行后面的列/行有控件
若想这么做,要用rowspan/columnspan,不然后面的控件会移到离当前空着的那一行/列中
例
def prin(n):
print(n)
def savecall():
print("save")
def opencall():
print("open")
from tkinter import *
root=Tk()
menubar=Menu(root)
filemenu=Menu(menubar)
filemenu.add_command(label="open",command=opencall)
filemenu.add_command(label="save",command=savecall)
filemenu.add_separator()
filemenu.add_command(label="exit",command=root.destroy)
menubar.add_cascade(label="File",menu=filemenu)
root.config(menu=menubar)
f1=Frame(root,width=480)
root.rowconfigure(0,weight=1) #缩放
root.columnconfigure(0,weight=1)
f1.grid(row=0) #框架row=0,菜单不算row
txt=Text(f1,height=2)
txt.insert(0.0,"fresh")
txt.grid(row=0,column=0,columnspan=4) #文本框1,row=0
txt2=Text(f1,height=2)
txt2.grid(row=1,column=0,columnspan=4)#文本框2,row=1
txt.tag_add("a",0.0,END)
txt.tag_config("a",foreground="black",background="blue")
b1=Button(f1,text="no",command=lambda :prin("noooo"))
b2= Button(f1,text="y",command=lambda:prin("yyyy"))
b2.grid(row=2,column=0) #文本框2和3,row=2
b1.grid(row=2,column=2)
root.mainloop()
2Frame框架
容器,通过将部件置于其中来布局。一般pack都需要与frame搭配。grid与frame搭配也可以很方便得实现窗体的缩放
f=frame(父窗口)
可将控件置于其中如:Button(f,…) , Label(f,…)…
用grid布局,框架内部的row,column重新从0开始