Tkinter介绍

Tkinter是一个python模块,是一个调用Tcl/Tk的接口,它是一个跨平台的脚本图形界面接口。Tkinter不是唯一的python图形编程接口,但是是其中比较流行的一个。最大的特点是跨平台,缺点是***能不太好,执行速度慢。


【Example 1】

>>> import Tkinter
>>> top = Tkinter.Tk()
>>> label = Tkinter.Label(top,text='Hello World')
>>> label.pack()
>>> Tkinter.mainloop()

打印结果:

wKiom1OM-9vgYTfCAAAeZmDL80g696.jpg


【Example 2】

1.

>>> from Tkinter import *
>>> root = Tk()
>>> e1 = Entry()
>>> e1.pack(padx=10,pady=10,fill=X)

>>> b1 = Button(text = 'take a press')
>>> b1.place(x=10,y=80)

打印结果:

wKioL1ONxRuwdZGCAAAeTNh1Gqg019.jpg


2.在Text中创建按钮

# -*- coding: cp936 -*-
# 使用tag的内置属***来插入文本
from Tkinter import *
root = Tk()
t = Text(root)
# 创建一个TAG,其前景色为蓝色
for i in range(10):
    t.insert(1.0,'0123456789 ')

def printtext():
    print 'take a press'

bt = Button(t,text='button',command = printtext)
t.window_create('2.0',window=bt)
#bt.place(x=10,y=80)
t.pack()
root.mainloop()

打印结果:

wKiom1OR6xWjxpjyAAED2xywstw548.jpg


3.绑定tag与事件

from Tkinter import *
root = Tk()
t = Text(root)
for i in range(10):
    t.insert(1.0,'0123456789 ')

def entertag(event):
    print 'Event event'

t.tag_config('a',foreground = 'blue',underline = 1)
t.tag_bind('a','<Enter>',entertag)
t.insert(2.0,'Enter event','a')
t.pack()
root.mainloop()

打印结果:

wKioL1OR8Bvz_b05AAESphgcoMo785.jpg


4.在窗口中放置一些小控件

from Tkinter import *
root = Tk()
root.title("my test")

def button1():
    listbox.insert(END,"button1 pressed")

def button3():
    text_contents = text.get()
    listbox.insert(END,text_contents)
    text.delete(0,END)


button1 = Button(root,text='button1',command=button1)
button2 = Button(root,text='button2')
button3 = Button(root,text='button3',command=button3)
text = Entry(root)
scrollbar = Scrollbar(root,orient=VERTICAL)
listbox = Listbox(root,yscrollcommand=scrollbar.set)
scrollbar.configure(command=listbox.yview)

button1.pack(side=LEFT)
button2.pack(side=LEFT)
button3.pack(side=RIGHT)
listbox.pack()
scrollbar.pack()
root.mainloop()

打印结果:

http://www.360doc.com/content/12/0922/02/3234041_237501221.shtml

wKiom1OTzdPzjjPtAADFwe9n5bA890.jpg


【Example 3】

from Tkinter import *
#resize函数是用来改变文字大小的,当进度条改变时调用
def resize(ev=None):
    label.config(font = 'Helvetica -%d bold' % scale.get())
#config函数就是通过设置组件的参数来改变组件的,这里改变的是font字体大小
top = Tk()  #主窗口
top.geometry('600x400')  #设置了主窗口的初始大小600x400
label = Label(top,text='very good!',fg='blue',font='Helvetica -12 bold')  #设置标签字体的初始大小
label.pack(fill=Y,expand=1)
#scale创建进度条,设置
scale = Scale(top,from_=10,to=40,orient=HORIZONTAL,command=resize)
scale.set(12)  #设置起始位置
scale.pack(fill=X,expand=1)
quit = Button(top,text='QUIT',command=top.quit,activeforeground='white',
                activebackground='red')

quit.pack()
mainloop()

打印结果:

wKioL1OM_E-y3AJoAAB4sMinFvI977.jpg


【Example 4】下面,使用类来对子控件的创建进行封装

from Tkinter import *

# 将子控件打包在App类,并绑定到相同的成员方法
class App:
    def __init__(self,master):
        frame = Frame(master)
        frame.pack()

        self.button = Button(frame,text="QUIT",fg='red',
                             command=frame.quit)

        self.button.pack(side=LEFT)

        self.hi_there = Button(frame,text='hello',command=self.say_hi)
        self.hi_there.pack(side=LEFT)

    def say_hi(self):
        print "hi there,everyone!"

root = Tk()

app = App(root)

root.mainloop()

打印结果:

wKiom1OM_RXhI-XzAAAjAZuT3vM440.jpg


【Example 5】Tkinter-Control variables

http://blog.sina.com.cn/s/blog_ac9fdc0b0101n5iz.html

from Tkinter import *

def func(value):
    if value.get() == 'kikc':
        value.set('prada')
    else:
        value.set('kikc')

win = Frame(None,width=200,height=200)
win.pack_propagate(0)
win.pack()

value = StringVar()

widget = Button(win,textvariable=value,command=(lambda:func(value)))
widget.pack()
value.set('nba')

win.mainloop()


【Example 6】Tkinter-Text(1)

http://blog.sina.com.cn/s/blog_ac9fdc0b0101n5ue.html

from Tkinter import *

def show(self,message):
    outputwidget = self.client.outputWidget

    pattern = re.compile(r'^<.+>.*')
    if pattern.match(message):
        outputwidget.insert('end',message)
        outputwidget.see('end')

    else:
        #set the system message to be 'red'
        begin = outputwidget.index('insert')
        outputwidget.see('end')
        end = outputwidget.index('insert')

        outputwidget.tag_add('systemMessage',begin,end)
        outputwidget.tag_config('systemMessage',foreground='red')


【Example 7】Tkinter-Text(2)

from Tkinter import *

root = Tk()
t = Text(root)
for i in range(1,10):
    t.insert(1.0,'0123456789\n')

def inserttext():
    t.insert(INSERT,'jcodeer')

def currenttext():
    t.insert(CURRENT,'jcodeer')

def endtext():
    t.insert(END,'jcodeer')

def selfirsttext():
    t.insert(SEL_FIRST,'jcodeer')

def sellasttext():
    t.insert(SEL_LAST,'jcodeer')

Button(root,text='insert jcodeer at INSERT',command = inserttext).pack(fill = X)
Button(root,text='insert jcodeer at current',command = currenttext).pack(fill = X)
Button(root,text='insert jcodeer at END',command = endtext).pack(fill = X)
Button(root,text='insert jcodeer at SEL_FIRST',command = selfirsttext).pack(fill = X)
Button(root,text='insert jcodeer at SEL_LAST',command = sellasttext).pack(fill = X)

t.pack()
root.mainloop()

打印结果:

wKiom1OPJY2TEJwgAADniuldcHc300.jpg


【Example 7】Tkinter-Canvas(2)

http://blog.csdn.net/jcodeer/article/details/1811888

# -*- coding: cp936 -*-
# 使用find_xxx查找上一个或下一个item
from Tkinter import *
root = Tk()
# 创建一个Canvas,设置其背景色为白色
cv = Canvas(root,bg = 'white')
# 创建三个rectangle
rt1 = cv.create_rectangle(
    10,10,110,110,
    tags = ('r1','r2','r3'))
rt2 = cv.create_rectangle(
    20,20,80,80,
    tags = ('s1','s2','s3'))
rt3 = cv.create_rectangle(
    30,30,70,70,
    tags = ('y1','y2','y3'))
# 查找rt2的上一个item,并将其边框颜色设置为红色
cv.itemconfig(cv.find_above(rt2),outline = 'red')
# 查找rt2的下一个item,并将其边框颜色设置为绿色
cv.itemconfig(cv.find_below(rt2),outline = 'green')

cv.pack()
root.mainloop()

打印结果:

wKioL1OQYM_wFtGfAAAmOMSno1c779.jpg


【Example 8】

1.Tkinter-Menu添加下拉菜单

from Tkinter import *
root = Tk()
def hello():
    print 'hello menu'
menubar = Menu(root)

filemenu = Menu(menubar,tearoff = 0)
for item in ['Python','PHP','CPP','C','Java','JavaScript','VBScript']:
    filemenu.add_commad(label = item,command = hello)
#将menubar的menu属***指定为filemenu,即filemenu为menubar的下拉菜单
menubar.add_cascade(label = 'Language',menu = filemenu)
root['menu'] = menubar
root.mainloop()

打印结果:

wKiom1OSaYfjnVWyAADwp_pAMvI459.jpg


2.向下拉菜单中添加Checkbutton项

# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
#每次打印出各个变量的当前值
def printItem():
    print 'Python = ',vPython.get()
    print 'PHP = ',vPHP.get()
    print 'CPP = ',vCPP.get()
    print 'C = ',vC.get()
    print 'Java = ',vJava.get()
    print 'JavaScript = ',vJavaScript.get()
    print 'VBScript = ',vVBScript.get()
    
menubar = Menu(root)

vPython = StringVar()
vPHP     = StringVar()
vCPP     = StringVar()
vC         = StringVar()
vJava     = StringVar()
vJavaScript = StringVar()
vVBScript     = StringVar()

filemenu = Menu(menubar,tearoff = 0)
for k,v in {'Python':vPython,
               'PHP':vPHP,
               'CPP':vCPP,
               'C':vC,
               'Java':vJava,
               'JavaScript':vJavaScript,
               'VBScript':vVBScript}.items():
    #绑定变量与回调函数
    filemenu.add_checkbutton(label = k,command = printItem,variable = v)
#将menubar的menu属***指定为filemenu,即filemenu为menubar的下拉菜单
menubar.add_cascade(label = 'Language',menu = filemenu)
root['menu'] = menubar
root.mainloop()
#程序运行,使用了Checkbutton,并通过printItem将每个Checkbutton在当前值打印出来。

打印结果:

wKioL1OScrSQ2MSwAAERMdaemak468.jpg


【Example 9】Tkinter-公司网站做成menu

# -*- coding: utf-8 -*-
from Tkinter import *
#from Tkinter.messagebox import *
#from tkinter.filedialog import *
from tkMessageBox import *
from tkFileDialog import *
from tkColorChooser import *
import webbrowser as web

def get_tk():
    '''获取一个Tk对象'''
    return Tk()

def set_tk_title(tk,title):
    if title is not None and title != '':
        tk.title(title)
    else:
        tk.title('Hongten v1.0')

def set_tk_geometry(tk,size):
    if size is not None and size != '':
        tk.geometry(size)
    else:
        tk.geometry('670x600')

def get_menu(tk):
    return Menu(tk)  

def url1():
        web.open_new_tab('http://')

def url2():
        web.open_new_tab('http://')

def url3():
        web.open_new_tab('http://')

def url4():
        web.open_new_tab('http://')

def url5():
        web.open_new_tab('http://')

def url6():
        web.open_new_tab('http://')

def url7():
        web.open_new_tab('http://')

def url8():
        web.open_new_tab('http://')

def url9():
        web.open_new_tab('')

def url10():
        web.open_new_tab('')

def url11():
        web.open_new_tab('https://')

def url12():
        web.open_new_tab('http://')

def url13():
        web.open_new_tab('https://')

def url14():
        web.open_new_tab('http://')

def url15():
        web.open_new_tab('http://')
        
        
def popup(event):
    menubar.post(event.x_root,event.y_root)

def test():
    ask = askokcancel('askokcancel messagebox','你确定要这样做吗?')
    if ask:
        # to do something
        print('你选择的是:确定')
    else:
        # to do something
        print('你选择的是:取消')

def test2():
    ask = askquestion('Are you sure?', '你很喜欢那个女孩吗?')
    if 'yes' == ask:
        #to do something
        print('是的,我很喜欢')
    elif 'no' == ask:
        #to do something
        print('不是这样的,我不喜欢她')

def test3():
    '''打开文件'''
    #('All files', '*')
    openfilename = askopenfilename(filetypes=[('xml', '*.xml')])
    try:
        with open(openfilename, 'r') as fp:
            for line in fp:
                print(line)
            fp.close()
    except:
        print('Could not open File:%s'%openfilename)

def test4():
    '''颜色面板选择器'''
    color = askcolor(title='颜色面板')
    print color

def menu_url(menubar):
    '''定义菜单File'''
    filemenu=Menu(menubar,tearoff=1)
    filemenu.add_command(label='会员网',command=url1)
    filemenu.add_command(label='现金网',command=url2)
    filemenu.add_command(label='ams',command=url3)
    filemenu.add_command(label='lotto',command=url5)
    filemenu.add_command(label='bbs',command=url14)
    filemenu.add_command(label='公司邮箱',command=url4)
    filemenu.add_command(label='智世代',command=url6)
    menubar.add_cascade(label='Z-time',menu=filemenu)
    filemenu.insert_separator(6)

def menu_bak(menubar):
    bak_menu=Menu(menubar,tearoff=1)
    bak_menu.add_command(label='ex防御点',command=url7)
    bak_menu.add_command(label='tms防御点',command=url8)
    bak_menu.add_command(label='ams防御点',command=url15)
    menubar.add_cascade(label='防御点',menu=bak_menu)

def menu_domain(menubar):
    domain_menu=Menu(menubar,tearoff=1)
    domain_menu.add_command(label='godaddy',command=url9)
    domain_menu.add_command(label='dnspod',command=url11)
    domain_menu.add_command(label='hostingspeed',command=url12)
    domain_menu.add_command(label='新网',command=url10)
    domain_menu.add_command(label='邮箱管理',command=url13)
    menubar.add_cascade(label='域名管理',menu=domain_menu)
    domain_menu.insert_separator(5)

def init_menu_bar(menubar):
    menu_url(menubar)
    menu_bak(menubar)
    menu_domain(menubar)
        
root = get_tk()
set_tk_geometry(root, '')
set_tk_title(root, 'Z-time运维小工具')
menubar = get_menu(root)
root.bind('<Button-3>',popup)
init_menu_bar(menubar)
root['menu'] = menubar
root.mainloop()

打印结果:

wKioL1OTrNji_QbeAABcfrKQh-g794.jpg


【Example 10】Tkinter-公司网站做成menu(2)

# -*- coding: utf-8 -*-
from Tkinter import *
#from Tkinter.messagebox import *
#from tkinter.filedialog import *
from tkMessageBox import *
from tkFileDialog import *
from tkColorChooser import *
import webbrowser as web
import tkMessageBox

def get_tk():
    '''获取一个Tk对象'''
    return Tk()

def set_tk_title(tk,title):
    if title is not None and title != '':
        tk.title(title)
    else:
        tk.title('Hongten v1.0')

def set_tk_geometry(tk,size):
    if size is not None and size != '':
        tk.geometry(size)
    else:
        tk.geometry('670x600')

def get_menu(tk):
    return Menu(tk)

class TextViewer(Toplevel):
    """A simple text viewer dialog for IDLE

    """
    def __init__(self, parent, title, text, modal=True):
        """Show the given text in a scrollable window with a 'close' button

        """
        Toplevel.__init__(self, parent)
        self.configure(borderwidth=5)
        self.geometry("=%dx%d+%d+%d" % (625, 500,
                                        parent.winfo_rootx() + 10,
                                        parent.winfo_rooty() + 10))
        #elguavas - config placeholders til config stuff completed
        self.bg = '#ffffff'
        self.fg = '#000000'

        self.CreateWidgets()
        self.title(title)
        self.parent = parent
        self.textView.insert(0.0, text)
 
        if modal:
            self.transient(parent)
            self.grab_set()
            self.wait_window()

    def CreateWidgets(self):
        frameText = Frame(self, relief=SUNKEN, height=700)
        frameButtons = Frame(self)
        self.buttonOk = Button(frameButtons, text='Close',
                               command=self.Ok, takefocus=FALSE)
        self.scrollbarView = Scrollbar(frameText, orient=VERTICAL,
                                       takefocus=FALSE, highlightthickness=0)
        self.textView = Text(frameText, wrap=WORD, highlightthickness=0,
                             fg=self.fg, bg=self.bg)
        self.scrollbarView.config(command=self.textView.yview)
        self.textView.config(yscrollcommand=self.scrollbarView.set)
        self.buttonOk.pack()
        self.scrollbarView.pack(side=RIGHT,fill=Y)
        self.textView.pack(side=LEFT,expand=TRUE,fill=BOTH)
        frameButtons.pack(side=BOTTOM,fill=X)
        frameText.pack(side=TOP,expand=TRUE,fill=BOTH)

    def Ok(self, event=None):
        self.destroy()

def view_text(parent, title, text, modal=True):
    return TextViewer(parent, title, text, modal)

def other():
    filename = './jack.txt'
    text = file(filename, u'r').read()
    btn1 = Button(get_tk(), text='Z-time所有域名',
                command=lambda:view_text(root, 'view_text', text))
    btn1.pack()

def showinfo():
    tkMessageBox.showinfo(root,u'作者 zxcbvbbbbb \n\nversion 1.0 \n\nThank you ')
    
    

def url1():
        web.open_new_tab('http://')

def url2():
        web.open_new_tab('http://')

def url3():
        web.open_new_tab('http://')

def url4():
        web.open_new_tab('http://')

def url5():
        web.open_new_tab('http://')

def url6():
        web.open_new_tab('http://')

def url7():
        web.open_new_tab('http://')

def url8():
        web.open_new_tab('http://')

def url9():
        web.open_new_tab('http://')

def url10():
        web.open_new_tab('http://')

def url11():
        web.open_new_tab('https://')

def url12():
        web.open_new_tab('http://')

def url13():
        web.open_new_tab('https://')

def url14():
        web.open_new_tab('http://')

def url15():
        web.open_new_tab('http://')
        
        
def popup(event):
    menubar.post(event.x_root,event.y_root)

def test():
    ask = askokcancel('请继续上班','你确定要这样做吗?')
    if ask:
        # to do something
        print('你选择的是:确定')
    else:
        # to do something
        print('你选择的是:取消')

def test2():
    ask = askquestion('Are you sure?', '你很喜欢那个女孩吗?')
    if 'yes' == ask:
        #to do something
        print('是的,我很喜欢')
    elif 'no' == ask:
        #to do something
        print('不是这样的,我不喜欢她')

def test3():
    '''打开文件'''
    #('All files', '*')
    openfilename = askopenfilename(filetypes=[('xml', '*.xml')])
    try:
        with open(openfilename, 'r') as fp:
            for line in fp:
                print(line)
            fp.close()
    except:
        print('Could not open File:%s'%openfilename)

def test4():
    '''颜色面板选择器'''
    color = askcolor(title='颜色面板')
    print color

def menu_url(menubar):
    '''定义菜单File'''
    filemenu=Menu(menubar,tearoff=1)
    filemenu.add_command(label='会员网',command=url1)
    filemenu.add_command(label='现金网',command=url2)
    filemenu.add_command(label='ams',command=url3)
    filemenu.add_command(label='lotto',command=url5)
    filemenu.add_command(label='bbs',command=url14)
    filemenu.add_command(label='公司邮箱',command=url4)
    filemenu.add_command(label='公司',command=url6)
    menubar.add_cascade(label='time',menu=filemenu)
    filemenu.insert_separator(6)

def menu_bak(menubar):
    bak_menu=Menu(menubar,tearoff=1)
    bak_menu.add_command(label='ex防御点',command=url7)
    bak_menu.add_command(label='tms防御点',command=url8)
    bak_menu.add_command(label='ams防御点',command=url15)
    menubar.add_cascade(label='防御点',menu=bak_menu)

def menu_domain(menubar):
    domain_menu=Menu(menubar,tearoff=1)
    domain_menu.add_command(label='godaddy',command=url9)
    domain_menu.add_command(label='dnspod',command=url11)
    domain_menu.add_command(label='hostingspeed',command=url12)
    domain_menu.add_command(label='新网',command=url10)
    domain_menu.add_command(label='邮箱管理',command=url13)
    menubar.add_cascade(label='域名管理',menu=domain_menu)
    domain_menu.insert_separator(5)

def menu_other(menubar):
    other_menu=Menu(menubar,tearoff=1)
    other_menu.add_command(label='在用的域名',command=other)
    other_menu.add_command(label='下班',command=test)
    other_menu.add_command(label='关于工具',command=showinfo)
    menubar.add_cascade(label='其他',menu=other_menu)

def init_menu_bar(menubar):
    menu_url(menubar)
    menu_bak(menubar)
    menu_domain(menubar)
    menu_other(menubar)
        
root = get_tk()

#close = Button(root,text='Close',command = root.destroy)
#close.pack(side=BOTTOM)

#filename = 'D:\jack.txt'
#text = file(filename, u'r').read()
#btn1 = Button(root, text='域名使用情况',
#                command=lambda:view_text(root, 'view_text', text))
#btn1.pack()
    
set_tk_geometry(root, '')
set_tk_title(root, 'Z-time运维小工具')
menubar = get_menu(root)
root.bind('<Button-3>',popup)
init_menu_bar(menubar)
root['menu'] = menubar
root.mainloop()

打印结果:

wKiom1OVpcfjtoycAAES-oORdEE709.jpg


【Example 10】Tkinter-optionmenu

# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
v = StringVar(root)
v.set('Python')
om = OptionMenu(root,v,'Python','PHP','CPP','C','Java','JavaScript','VBScript')
om.pack()
root.mainloop()

打印结果:

wKiom1OW8JCif5L0AABxXZzr_5Y069.jpg


【Example 10】Tkinter-Listbox与Scrollbar绑定

# -*- coding: cp936 -*-
from Tkinter import *
root = Tk()
lb = Listbox(root)
s1 = Scrollbar(root)
s1.pack(side = RIGHT,fill = Y)
lb['yscrollcommand']=s1.set
for i in range(100):
    lb.insert(END,str(i))

lb.pack(side=LEFT)
s1['command'] = lb.yview

root.mainloop()

或者

from Tkinter import *
root = Tk()
#sl = Scrollbar(root)
#lb = Listbox(root)
scrollbar = Scrollbar(root,orient=VERTICAL)
listbox = Listbox(root,yscrollcommand=scrollbar.set)
for i in range(100):
    listbox.insert(END,i)


scrollbar.configure(command=listbox.yview)
listbox.pack(side = LEFT)
scrollbar.pack(side = RIGHT,fill=Y)
root.mainloop()

打印结果:

wKioL1OXGQviB5k6AABB_LGtE0Q441.jpg


【Example 10】Tkinter-安置窗口小部件

from Tkinter import *
root = Tk()
root.title("my test")
 
def button1():
    listbox.insert(END,"button1 pressed")
 
def button3():
    text_contents = text.get()
    listbox.insert(END,text_contents)
    text.delete(0,END)
 

textframe = Frame(root)
listframe = Frame(root)

button1 = Button(textframe,text='button1',command=button1)
button2 = Button(textframe,text='button2')
button3 = Button(textframe,text='button3',command=button3)
text = Entry(textframe)
scrollbar = Scrollbar(listframe,orient=VERTICAL)
listbox = Listbox(listframe,yscrollcommand=scrollbar.set)
scrollbar.configure(command=listbox.yview)

text.pack(side=LEFT,fill=BOTH,expand=1)
button1.pack(side=LEFT,expand=0)
button2.pack(side=LEFT)
button3.pack(side=LEFT)
listbox.pack(side=LEFT,fill=BOTH,expand=1)
scrollbar.pack(side=RIGHT,fill=Y)
textframe.pack(fill=X)
listframe.pack(fill=BOTH,expand=1)
root.mainloop()

打印结果:

wKiom1OYSSzyjQ2dAABagD-EnFI812.jpg