首先,Tkinter是Python默認的GUI庫,想IDLE就是用Tkinter設計出來的,所以直接導入Tkinter模塊就能夠啦python
1 import tkinter
(1)Tkinter初體驗:編程
1 import tkinter as tk 2 3 # 建立一個主窗口,用於容納整個GUI程序 4 root = tk.Tk() 5 # 設置主窗口對象的標題欄 6 root.title("NEW") 7 # 添加一個Label組件,Label組件是GUI程序中最經常使用的組件之一 8 # Label組件能夠顯示文本、圖標或者圖片 9 # 在這裏咱們讓他們顯示指定文本 10 theLabel = tk.Label(root, text="就是體驗一下") 11 # 而後調用Label組建的pack()方法,用於自動調節組件自身的尺寸 12 theLabel.pack() 13 # 注意,這時候窗口仍是不會顯示的... 14 # 除非執行下面的這條代碼!!!!! 15 root.mainloop()
顯示結果:app
升級上面程序:一般若是要寫一個比較大的程序,那麼應該先把代碼給封裝起來。在面向對象的編程語言中,就是封裝成類框架
1 import tkinter as tk 2 3 class App: 4 def __init__(self, root): 5 # 建立一個框架,而後在裏面添加一個Button按鈕組件 6 # 框架通常使用於在複雜的佈局中起到將組建分組的做用 7 frame = tk.Frame(root) 8 frame.pack() 9 # 建立一個按鈕組件,fg是foreground的縮寫,就是設置前景色的意思 10 self.hi_there = tk.Button(frame, text="打招呼", fg="blue", command=self.say_hi) 11 self.hi_there.pack(side=tk.LEFT) 12 13 def say_hi(self): 14 print("互聯網的廣大朋友們你們好,我是初音將來!") 15 16 # 建立一個toplevel的根窗口,並把他做爲擦參數實例化APP對象 17 root = tk.Tk() 18 app = App(root) 19 # 開始主事件循環 20 root.mainloop()
顯示結果:編程語言
而後點擊打招呼後會在控制檯會輸出 "互聯網的廣大朋友們你們好,我是初音將來! " 這句話ide
注意:能夠經過修改pack()方法的side參數,side參數能夠設置LEFT,RIGHT,TOP和TOTTOM四個方位,默認設置是side=tkinter.TOP.函數
例如如上程序就修改了frame.pack(side=tk.LEFT)。oop
還有一件事!!!若是你不想按鈕挨着"牆角",能夠經過設置pack()方法的padx和pady參數自定義按鈕的偏移位置佈局
最後,就像你所看到的,按鈕既然能夠設置前景色,那麼就必定能夠設置背景色,bg參數就是啦,他是background的縮寫post
1 elf.hi_there = tk.Button(frame, text="打招呼", bg="red", fg="blue", command=self.say_hi) #此時按鈕的背景色就成了紅色
(2)Label組件(用於在界面上輸出描述的標籤,例如提示用戶...):
1 from tkinter import * 2 3 root = Tk() 4 # 建立一個文本Label對象,justify函數其實就是讓下圖中的兩行文字左對齊啦 5 textLabel = Label(root, text="您所下載的影片含有未成年人限制內容,\n請滿18歲後再點擊觀看!", justify=LEFT, padx=10) 6 textLabel.pack(side=LEFT) 7 # 建立一個圖像Label對象,注意這裏只支持gif格式的圖片 8 photo = PhotoImage(file="D:/python/images/02.gif") 9 imgLabel = Label(root, image=photo) 10 imgLabel.pack(side=RIGHT) 11 12 mainloop()
顯示結果:
嗯,學完了上面的一個Labe示例後,咱們想一下,咱們有時候是否是須要將圖片和文字分開,例如將圖片做爲背景,文字顯示在圖片的上面,只須要設置compound選項便可:
1 from tkinter import * 2 3 root = Tk() 4 photo = PhotoImage(file="D:/python/images/nature.gif") 5 theLabel = Label(root, text="學Python\n到FishC", justify=LEFT, image=photo, compound=CENTER, font=("幼圓", 20), fg="white") 6 theLabel.pack() 7 8 mainloop()
顯示結果:
(3)Button組件(就是實現一個按鈕而已):
1 from tkinter import * 2 3 def callback(): 4 var.set("吹吧你,我纔不信嘞!") 5 6 root = Tk() 7 frame1 = Frame(root) 8 frame2 = Frame(root) 9 # 建立一個文本Label對象 10 var = StringVar() 11 var.set("您所下載的影片含有未成年人限制內容,\n請滿18歲後再點擊觀看!") 12 textLabel = Label(frame1, textvariable=var, justify=LEFT) 13 textLabel.pack(side=LEFT) 14 # 建立一個圖形Label對象 15 # 用PhotoImage實例化一個圖片對象(支持gif格式文件哦) 16 photo = PhotoImage(file="D:/python/images/02.gif") 17 imgLabel = Label(frame1, image=photo) 18 imgLabel.pack(side=RIGHT) 19 # 加一個按鈕 20 theButton = Button(frame2, text="已滿18週歲", command=callback) 21 theButton.pack() 22 frame1.pack(padx=10, pady=10) 23 frame2.pack(padx=10, pady=10) 24 25 mainloop()
顯示結果:
當你點擊已滿18週歲按鈕後就會出現:
(4)CheckButton組件(多選):
1 from tkinter import * 2 3 root = Tk() 4 GIRLS = ["西施", "王昭君", "貂蟬", "楊玉環"] 5 v = [] 6 for girl in GIRLS: 7 v.append(IntVar()) 8 b = Checkbutton(root, text=girl, variable=v[-1]) 9 b.pack(anchor=W) 10 11 mainloop()
顯示結果:
注意:爲了輸出更加美觀,在這裏經過設置pack()方法的anchor選項就能夠實現。anchor選項是用於置頂顯示位置,能夠設置爲N,NE,E,SE,S,SW,W,NW,CENTER九個不一樣的值。
相信地理學的不錯的朋友一會兒就反應過來了,他們正是東西南北的縮寫。
(5)Radiobutton(單選):
1 from tkinter import * 2 3 root = Tk() 4 v = IntVar() 5 Radiobutton(root, text="One", variable=v, value=1).pack(anchor=W) 6 Radiobutton(root, text="Two", variable=v, value=2).pack(anchor=W) 7 Radiobutton(root, text="Three", variable=v, value=3).pack(anchor=W) 8 9 mainloop()
顯示結果:
那麼此時問題就來了,若是你添加的選項比較多的話那麼你就得重複寫Radiobutton函數,那將會是一件麻煩的事情,因此呢,循環處理將會是一個不錯的方法!
1 from tkinter import * 2 3 root = Tk() 4 LANGS = [("Python", 1), ("Per1", 2), ("Ruby", 3), ("Lua", 4)] 5 v = IntVar() 6 v.set(1) 7 for lang, num in LANGS: 8 b = Radiobutton(root, text=lang, variable=v, value=num) 9 b.pack(anchor=W) 10 11 mainloop()
顯示結果:
注意:若是你不喜歡前面這個小圈圈,還能夠改爲按鈕的形式:
1 b = Radiobutton(root, text=lang, variable=v, value=num, indicatoron=False) 2 b.pack(fill=X)
隨之就變成了:
(6)LabelFrame組件(自我認爲就是個Frame的美化):
1 from tkinter import * 2 3 root = Tk() 4 group = LabelFrame(root, text="最好的腳本語言是?", padx=5, pady=5) 5 group.pack(padx=10, pady=10) 6 LANGS = [("Python", 1), ("Per1", 2), ("Ruby", 3), ("Lua", 4)] 7 v = IntVar() 8 v.set(1) 9 for lang, num in LANGS: 10 b = Radiobutton(group, text=lang, variable=v, value=num) 11 b.pack(anchor=W) 12 13 mainloop()
顯示結果:
(7)Entry組件(就是平時所說的輸入框):
1 from tkinter import * 2 3 root = Tk() 4 e = Entry(root) 5 e.pack(padx=20, pady=20) 6 e.delete(0, END) 7 e.insert(0, "默認字體...") 8 9 mainloop()
顯示結果:
獲取輸入框裏邊的內容,可使用Entry組件的get()方法。固然也能夠將一個Tkinter的變量(一般是StringVar)掛鉤到textvariable選項,而後經過變量的get()方法獲取!!
下面就是一個簡單的示例:
1 from tkinter import * 2 3 root = Tk() 4 # Thinker總共提供了三種佈局組件的方法:pack(),grid()和place() 5 # grid()方法容許你用表格的形式來管理組件的位置 6 # row選項表明行,column選項表明列 7 # 例如row=1,column=2表示第二行第三列(0表示第一行) 8 Label(root, text="做品:").grid(row=0) 9 Label(root, text="做者:").grid(row=1) 10 e1 = Entry(root) 11 e2 = Entry(root) 12 e1.grid(row=0, column=1, padx=10, pady=5) 13 e2.grid(row=1, column=1, padx=10, pady=5) 14 15 def show(): 16 print("做品:<< % s>>" % e1.get()) 17 print("做者:<< % s>>" % e2.get()) 18 e1.delete(0, END) 19 e2.delete(0, END) 20 21 # 若是表格大於組件,那麼可使用sticky選項來設置組件的位置 22 # 一樣你須要使用N,E,S,W以及他們的組合NE,SE,SW,NW來表示方位 23 Button(root, text="獲取信息", width=10, command=show).grid(row=3, column=0, sticky=W, padx=10, pady=5) 24 Button(root, text="退出", width=10, command=root.quit()).grid(row=3, column=1, sticky=E, padx=10, pady=5) 25 26 mainloop()
顯示結果(輸入做品合做者後點擊獲取信息後,便可在控制檯上看到紅箭頭所以內容,而後窗口你的輸入清空):
還有一種狀況那就是咱們在輸密碼時候咱們須要保密,因此呢咱們用*代替你的密碼輸入便可,代碼以下:
1 from tkinter import * 2 3 root = Tk() 4 # Thinker總共提供了三種佈局組件的方法:pack(),grid()和place() 5 # grid()方法容許你用表格的形式來管理組件的位置 6 # row選項表明行,column選項表明列 7 # 例如row=1,column=2表示第二行第三列(0表示第一行) 8 Label(root, text="User:").grid(row=0) 9 Label(root, text="Password:").grid(row=1) 10 e1 = Entry(root) 11 e2 = Entry(root, show="*") 12 e1.grid(row=0, column=1, padx=10, pady=5) 13 e2.grid(row=1, column=1, padx=10, pady=5) 14 15 def show(): 16 print("User:<< % s>>" % e1.get()) 17 print("Password:<< % s>>" % e2.get()) 18 e1.delete(0, END) 19 e2.delete(0, END) 20 21 # 若是表格大於組件,那麼可使用sticky選項來設置組件的位置 22 # 一樣你須要使用N,E,S,W以及他們的組合NE,SE,SW,NW來表示方位 23 Button(root, text="芝麻開門", width=10, command=show).grid(row=3, column=0, sticky=W, padx=10, pady=5) 24 Button(root, text="退出", width=10, command=root.quit()).grid(row=3, column=1, sticky=E, padx=10, pady=5) 25 26 mainloop()
顯示結果:
另外,Entry組件還支持驗證輸入內容的合法性。例如輸入框要求輸入的是數字,用戶輸入了字母就屬於非法輸入。實現該功能,須要經過設置validate,validatecommand和invalidcommand三個選項。
首先啓用驗證的"開關"是validate選項,該選項能夠設置的值以下表所示:
其次是爲validatecommand選項指定一個驗證函數,該函數只能返回True或False表示驗證結果。通常狀況下驗證函數值須要知道輸入框的內容便可,能夠經過Entry組建的get()方法得到改字符串。
1 from tkinter import * 2 3 root = Tk() 4 5 def test(): 6 if e1.get() == "小甲魚": 7 print("正確") 8 return True 9 else: 10 print("錯誤!") 11 e1.delete(0, END) 12 return False 13 14 v = StringVar() 15 e1 = Entry(root, textvariable=v, validate="focusout", validatecommand=test) 16 e2 = Entry(root) 17 e1.pack(padx=10, pady=10) 18 e2.pack(padx=10, pady=10) 19 20 mainloop()
顯示結構:
(8)Listbox組件:
這個讀者能夠和單選和多選那個作個比較,此組件適用於提供的選項很是多的狀況
1 from tkinter import * 2 3 root = Tk() 4 # 建立一個空列表 5 theLB = Listbox(root, setgrid=True) 6 theLB.pack() 7 # 往列表裏添加數據 8 for item in ["籃球", "足球", "乒乓球", "羽毛球"]: 9 theLB.insert(END, item) 10 theButton = Button(root, text="刪除", command=lambda x=theLB: x.delete(ACTIVE)) 11 theButton.pack() 12 13 mainloop()
顯示結果:
選擇選項後點擊刪除就能夠刪除該項啦!!!!!
(9)Scrollbar組件:
首先讓咱們看一個代碼:
1 root = Tk() 2 # 建立一個空列表 3 theLB = Listbox(root, setgrid=True) 4 theLB.pack() 5 # 往列表裏添加數據 6 for item in range(11): 7 theLB.insert(END, item) 8 9 mainloop()
顯示結果:
你會發現10沒了,只有當你滾動鼠標滾軸時纔會出現,可是通常來講不給你提示你是不會想到滾動鼠標滾軸的哦,因此Scrollbar就誕生了
1 from tkinter import * 2 3 root = Tk() 4 sb = Scrollbar(root) 5 sb.pack(side=RIGHT, fill=Y) 6 lb = Listbox(root, yscrollcommand=sb.set) 7 for i in range(1000): 8 lb.insert(END, str(i)) 9 lb.pack(side=LEFT, fill=BOTH) 10 sb.config(command=lb.yview) 11 12 mainloop()
顯示結果:
(10)Scale組件:
這個和Scrollbar相似,可是這個組件主要是經過滑塊來表示某個範圍內的一個數字的
1 from tkinter import * 2 3 root = Tk() 4 Scale(root, from_=0, to=42).pack() 5 Scale(root, from_=0, to=200, orient=HORIZONTAL).pack() 6 7 mainloop() 8 9 from tkinter import * 10 11 root = Tk() 12 s1 = Scale(root, from_=0, to=42) 13 s1.pack() 14 s2 = Scale(root, from_=0, to=200, orient=HORIZONTAL) 15 s2.pack() 16 17 def show(): 18 print(s1.get(), s2.get()) 19 20 Button(root, text="獲取位置", command=show).pack() 21 22 mainloop()
顯示結果:
滑動它有控制檯耶會有相應的輸出
另外一個示例:
1 from tkinter import * 2 3 root = Tk() 4 Scale(root, from_=0, to=42).pack() 5 Scale(root, from_=0, to=200, orient=HORIZONTAL).pack() 6 7 mainloop() 8 9 from tkinter import * 10 11 root = Tk() 12 Scale(root, from_=0, to=42, tickinterval=5, length=200, resolution=5, orient=VERTICAL).pack() 13 Scale(root, from_=0, to=200, tickinterval=10, length=600, orient=HORIZONTAL).pack() 14 15 mainloop()
顯示結果: