https://docs.python.org/3/library/tkinter.html#tkinter-modules
http://effbot.org/tkinterbook/
小例子演示:
#!/usr/bin/python # -*- coding: UTF-8 -*- from tkinter import * #导入 Tkinter 模块 root =Tk() #实例 label = Label(root, text='Hello world') label.pack() # 将小部件放置到主窗口中 root.mainloop() # 进入消息循环
用类创建
#!/usr/bin/python # -*- coding: UTF-8 -*- from tkinter import * class App: def __init__(self, master): frame = Frame(master) frame.pack() self.button = Button(frame, text='Exit Class', fg='blue', command=frame.quit) self.button.pack() self.hiButton = Button(frame, text='Say Hi', command=self.say_hi) self.hiButton.pack() def say_hi(self): print ("Hi Sundy , Thanks!") root = Tk() app = App(root) root.mainloop() #root.destroy()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * class App: def __init__(self,master): frame=Frame(master) frame.pack() self.buttom=Button(frame,text="Exit Class",fg="blue",command=frame.quit) self.buttom.pack() self.hiButton=Button(frame,text="Say hi",command=self.say_hi) self.hiButton.pack() def say_hi(self): print("Hi,Tom, good job!") if __name__=="__main__": root=Tk() app=App(root) root.mainloop() #root.destroy()
"D:Program Files (x86)python36python.exe" F:/python从入门到放弃/tkinter/10.30/helloclass.py Hi,Tom, good job! Hi,Tom, good job! Hi,Tom, good job!
如何设计GUI类库》》》tkinter设计结构
如果在开发的时候忘记配置样式,可以通过配置文件来配置
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root=Tk() label=Label(root,text="hello world!") label.config(cursor="gumby") label.config(width=80,height=10,fg='yellow',bg="dark green") label.config(font=("times","28","bold")) label.pack() root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * import setting root=Tk() label=Label(root,text="hello world!") setting.config(label) # label.config(cursor="gumby") # label.config(width=80,height=10,fg='yellow',bg="dark green") # label.config(font=("times","28","bold")) label.pack() root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' def config(obj): obj.config(cursor="gumby") obj.config(width=80, height=10, fg='yellow', bg="dark green") obj.config(font=("times", "28", "bold"))
Widget Styling 可以配置的组件样式
http://effbot.org/tkinterbook/tkinter-widget-styling.htm
样式演示
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/10/30 6 ''' 7 from tkinter import * 8 button = Button(text='SundyButton',padx=10,pady=10) 9 button.config(cursor='gumby') 10 button.config(bd=8,relief=FLAT) 11 button.config(bg='green',fg='yellow') 12 button.config(font=('Helvetica',10,'bold italic')) 13 button.pack() 14 button.mainloop()
relief This option controls how to draw the 3D border. It can be set to one of SUNKEN, RAISED, GROOVE, RIDGE, and FLAT.
事件 和 事件绑定
http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
绑定的三种方式:
1、通过command = 回调函数 连接事件 (按钮级)
2、 通过bind 绑定事件 (按钮级)
3、 通过协议protocol 去监听窗体改变来绑定事件 (系统级)
import tkMessageBox root= Tk() ''' def button1Click(): print('button clicked') button = Button(text='hello', command=button1Click) button.pack() root.mainloop() ''' def callback(event): frame.focus_set() print('clicked at:', event.x, event.y) def key(event): print("pressed", repr(event.char)) frame = Frame(root,width=100,height=100) frame.bind('<Button-1>',callback) frame.bind('<Key>',key) frame.pack() root.protocol('WM_DELETE_WINDOW',) root.mainloop()
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/10/30 6 ''' 7 # import tkMessageBox 8 from tkinter import * 9 root= Tk() 10 11 def button1Click(): 12 print('button clicked') 13 14 button = Button(text='hello', command=button1Click) 15 button.pack() 16 root.mainloop()
效果:
command绑定事件的限制性 : 标签没有command属性,没有办法绑定事件
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' # import tkMessageBox from tkinter import * root= Tk() def callback(event): print("Button-1 在frame上面 单击鼠标左键,打印出来") frame = Frame(root,width=100,height=100) frame.bind('<Button-1>',callback) frame.pack() root.mainloop()
1 #!/usr/bin/env python3 2 #-*- coding:utf-8 -*- 3 ''' 4 Administrator 5 2018/10/30 6 ''' 7 from tkinter import * 8 import tkinter.messagebox 9 10 root= Tk() 11 def callback(event): 12 frame.focus_set()#系统函数,每次点击前得到一个焦点 13 print('clicked at:', event.x, event.y)#鼠标点击时的x,y轴坐标是多少 14 print("距离左边的长度:%s ,距离上面的长度:%s"%(event.x_root,event.y_root)) 15 def key(event): 16 print("pressed", repr(event.char))#repr 函数 表示将字符用ASCII码打印出来 也可以用str char输入键盘输入的是什么字符 17 def closeWindow(): 18 if tkinter.messagebox.askokcancel("提示","是否要退出?"): 19 root.destroy() 20 21 22 23 frame = Frame(root,width=100,height=100) 24 frame.bind('<Button-1>',callback) 25 frame.config(bg="dark green") 26 frame.bind('<Key>',key) 27 frame.pack() 28 29 root.protocol('WM_DELETE_WINDOW',closeWindow)#通过协议监控 WM_DELETE_WINDOW Windows manages 删除 窗口发生时,调用函数 closeWindow 30 root.mainloop()
在窗体上新建一个窗体
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root = Tk() root.title('root window') top = Toplevel(bg='red') top.title('top level') root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root = Tk() root.title('root window') # top = Toplevel(bg='red') # top.title('top level') top = Toplevel() top.title("About this application...") def about_message(): return "this is a tkinter demo application" msg = Message(top, text=about_message()) msg.pack() button = Button(top, text="Dismiss", command=top.destroy) button.pack() root.mainloop()
from tkinter import * import tkinter.messagebox root = Tk() def callback(): if tkinter.messagebox.showerror('Sundy','HI Sundy'): print ('Clciked Yes') else: print ('Clicked No') button = Button(root, text='Button1', command=callback) button.pack() root.mainloop()
菜单
from tkinter import * def callback(): print ("called the menu") root = Tk() menu = Menu(root) root.config(menu=menu) filemenu = Menu(menu) menu.add_cascade(label='File',menu=filemenu) filemenu.add_command(label='New',command=callback) filemenu.add_command(label='Open..',command=callback) filemenu.add_separator() filemenu.add_command(label='Exit',command=callback) helpmenu = Menu(menu) menu.add_cascade(label='Help',menu=helpmenu) helpmenu.add_command(label='About..',command=callback) root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * def callback(): print ("called the menu") root = Tk() menu = Menu(root) root.config(menu=menu)#设置一下root 里面菜单 就是上一行实例化的菜单 filemenu = Menu(menu)#添加一个菜单 绑定在menu上面 menu.add_cascade(label='File',menu=filemenu)#添加一个子菜单,绑定在filemunu上面 并且设置一个名字 filemenu.add_command(label='New',command=callback)#在菜单上,添加一个命令 filemenu.add_command(label='Open..',command=callback) filemenu.add_separator()#添加一个分割线 filemenu.add_command(label='Exit',command=callback) helpmenu = Menu(menu) menu.add_cascade(label='Help',menu=helpmenu) helpmenu.add_command(label='About..',command=callback) root.mainloop()
工具条
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root = Tk() def callback(): print ("clicked tool bar button ") toolbar = Frame(root)#由于tkinter没有工具条的类,我们用Frame来代替工具条的布局 b = Button(toolbar,text='new',width=6,command=callback) b.pack(side=LEFT,padx=2,pady=2) c = Button(toolbar,text='open',width=6,command=callback) c.pack(side=LEFT,padx=2,pady=2) toolbar.pack(side=TOP,fill=X)#放在最上面 root.mainloop()
消息框
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * import tkinter.messagebox root = Tk() def callback(): if tkinter.messagebox.showerror('Sundy','HI Sundy'): print ('Clciked Yes') else: print ('Clicked No') button = Button(root, text='Button1', command=callback) button.pack() root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * import tkinter.messagebox root = Tk() def callback(): if tkinter.messagebox.askyesno('Sundy','HI Sundy'): print ('Clciked Yes') else: print ('Clicked No') button = Button(root, text='Button1', command=callback) button.pack() root.mainloop()
画布
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * master = Tk() w = Canvas(master, width=200, height=100,bg="yellow") w.pack() w.create_line(0, 0, 200, 100) w.create_line(0, 100, 200, 0, fill="red", dash=(4, 4)) w.create_rectangle(50, 25, 150, 75, fill="blue") mainloop()
输入框
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * master=Tk() e = Entry(master) e.pack() e.delete(0, END) e.insert(0, "a default value") print(e.get()) master.mainloop()
布局
from Tkinter import * root = Tk() Label(root,text='First').grid(row=0) Label(root,text='Second').grid(row=1) e1 = Entry(root) e2 = Entry(root) e1.grid(row=0,column=1) e2.grid(row=1,column=1) Button(root,text='OK').grid(row=2) root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root = Tk() Label(root,text='First').grid(row=0) Label(root,text='Second').grid(row=1) e1 = Entry(root) e2 = Entry(root) # # e1.grid(row=0,column=1) # e2.grid(row=1,column=1) # # Button(root,text='OK').grid(row=2) root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root = Tk() Label(root,text='First').grid(row=0) Label(root,text='Second').grid(row=1) e1 = Entry(root) e2 = Entry(root) e1.grid(row=0,column=1) e2.grid(row=1,column=1) # Button(root,text='OK').grid(row=2) root.mainloop()
#!/usr/bin/env python3 #-*- coding:utf-8 -*- ''' Administrator 2018/10/30 ''' from tkinter import * root = Tk() Label(root,text='First').grid(row=0) Label(root,text='Second').grid(row=1) e1 = Entry(root) e2 = Entry(root) e1.grid(row=0,column=1) e2.grid(row=1,column=1) Button(root,text='OK',width=10).grid(row=2,column=1) root.mainloop()
状态栏
from tkinter import * root = Tk() status =Label(root,text='Ln20',bd=1,relief=SUNKEN,anchor=W) status.pack(side=BOTTOM, fill=X) root.mainloop()
小项目,编写一个记事本
__author__ = 'Sundy' # -*- encoding: utf8 -*- from tkinter import * from tkinter.messagebox import * from tkinter.filedialog import * import os filename = '' def author(): showinfo('作者信息','本软件由麦子学院Sundy完成') def about(): showinfo('版权信息.Copyright','本软件版权归属为麦子学院') def openfile(): global filename filename = askopenfilename(defaultextension = '.txt') if filename == '': filename = None else: root.title('FileName:'+os.path.basename(filename)) textPad.delete(1.0,END) f = open(filename,'r') textPad.insert(1.0,f.read()) f.close() def new(): global filename root.title('未命名文件') filename = None textPad.delete(1.0,END) def save(): global filename try: f = open(filename,'w') msg = textPad.get(1.0,END) f.write(msg) f.close() except: saveas() def saveas(): f = asksaveasfilename(initialfile= '未命名.txt', defaultextension='.txt') global filename filename = f fh = open(f,'w') msg = textPad.get(1.0,END) fh.write(msg) fh.close() root.title('FileName:'+os.path.basename(f)) def cut(): textPad.event_generate('<<Cut>>') def copy(): textPad.event_generate('<<Copy>>') def paste(): textPad.event_generate('<<Paste>>') def redo(): textPad.event_generate('<<Redo>>') def undo(): textPad.event_generate('<<Undo>>') def selectAll(): textPad.tag_add('sel','1.0',END) def search(): topsearch = Toplevel(root) topsearch.geometry('300x30+200+250') label1 = Label(topsearch,text='Find') label1.grid(row=0, column=0,padx=5) entry1 = Entry(topsearch,width=20) entry1.grid(row=0, column=1,padx=5) button1 = Button(topsearch,text='查找') button1.grid(row=0, column=2) root = Tk() root.title('Sundy Node') root.geometry("800x500+100+100") #Create Menu menubar = Menu(root) root.config(menu = menubar) filemenu = Menu(menubar) filemenu.add_command(label='新建', accelerator='Ctrl + N', command= new) filemenu.add_command(label='打开', accelerator='Ctrl + O',command = openfile) filemenu.add_command(label='保存', accelerator='Ctrl + S', command=save) filemenu.add_command(label='另存为', accelerator='Ctrl + Shift + S',command=saveas) menubar.add_cascade(label='文件',menu=filemenu) editmenu = Menu(menubar) editmenu.add_command(label='撤销', accelerator='Ctrl + Z', command=undo) editmenu.add_command(label='重做', accelerator='Ctrl + y', command=redo) editmenu.add_separator() editmenu.add_command(label = "剪切",accelerator = "Ctrl + X",command=cut) editmenu.add_command(label = "复制",accelerator = "Ctrl + C", command=copy) editmenu.add_command(label = "粘贴",accelerator = "Ctrl + V", command= paste) editmenu.add_separator() editmenu.add_command(label = "查找",accelerator = "Ctrl + F", command=search) editmenu.add_command(label = "全选",accelerator = "Ctrl + A", command= selectAll) menubar.add_cascade(label = "编辑",menu = editmenu) aboutmenu = Menu(menubar) aboutmenu.add_command(label = "作者", command=author) aboutmenu.add_command(label = "版权", command = about) menubar.add_cascade(label = "关于",menu=aboutmenu) #toolbar toolbar = Frame(root, height=25,bg='light sea green') shortButton = Button(toolbar, text='打开',command = openfile) shortButton.pack(side=LEFT, padx=5, pady=5) shortButton = Button(toolbar, text='保存', command = save) shortButton.pack(side=LEFT) toolbar.pack(expand=NO,fill=X) #Status Bar status = Label(root, text='Ln20',bd=1, relief=SUNKEN,anchor=W) status.pack(side=BOTTOM, fill=X) #linenumber&text lnlabel =Label(root, width=2, bg='antique white') lnlabel.pack(side=LEFT, fill=Y) textPad = Text(root, undo=True) textPad.pack(expand=YES, fill=BOTH) scroll = Scrollbar(textPad) textPad.config(yscrollcommand= scroll.set) scroll.config(command = textPad.yview) scroll.pack(side=RIGHT,fill=Y) root.mainloop()