Python 提供了多個圖形開發界面的庫,幾個經常使用 Python GUI 庫以下:html
Tkinter: Tkinter 模塊(Tk 接口)是 Python 的標準 Tk GUI 工具包的接口 .Tk 和 Tkinter 能夠在大多數的 Unix 平臺下使用,一樣能夠應用在 Windows 和 Macintosh 系統裏。Tk8.0 的後續版本能夠實現本地窗口風格,並良好地運行在絕大多數平臺中。python
wxPython:wxPython 是一款開源軟件,是 Python 語言的一套優秀的 GUI 圖形庫,容許 Python 程序員很方便的建立完整的、功能健全的 GUI 用戶界面。程序員
Jython:Jython 程序能夠和 Java 無縫集成。除了一些標準模塊,Jython 使用 Java 的模塊。Jython 幾乎擁有標準的Python 中不依賴於 C 語言的所有模塊。好比,Jython 的用戶界面將使用 Swing,AWT或者 SWT。Jython 能夠被動態或靜態地編譯成 Java 字節碼。編程
Tkinter 是 Python 的標準 GUI 庫。Python 使用 Tkinter 能夠快速的建立 GUI 應用程序。canvas
Tkinter 是使用 python 進行窗口視窗設計的模塊。Tkinter模塊("Tk 接口")是Python的標準Tk GUI工具包的接口。做爲 python 特定的GUI界面,是一個圖像的窗口,tkinter是python 自帶的,能夠編輯的GUI界面,咱們能夠用GUI 實現不少直觀的功能,好比想開發一個計算器,若是隻是一個程序輸入,輸出窗口的話,是沒用用戶體驗的。全部開發一個圖像化的小窗口,就是必要的。app
對於稍有GUI編程經驗的人來講,Python的Tkinter界面庫是很是簡單的。python的GUI庫很是多,選擇Tkinter,一是最爲簡單,二是自帶庫,不需下載安裝,隨時使用,三則是從需求出發,Python做爲一種腳本語言,一種膠水語言,通常不會用它來開發複雜的桌面應用,它並不具有這方面的優點,使用Python,能夠把它做爲一個靈活的工具,而不是做爲主要開發語言,那麼在工做中,須要製做一個小工具,確定是須要有界面的,不只本身用,也能分享別人使用,在這種需求下,Tkinter是足夠勝任的!框架
因爲 Tkinter 是內置到 python 的安裝包中、只要安裝好 Python 以後就能 import Tkinter 庫、並且 IDLE 也是用 Tkinter 編寫而成、對於簡單的圖形界面 Tkinter 仍是能應付自如。編輯器
注意:Python3.x 版本使用的庫名爲 tkinter,即首寫字母 T 爲小寫。ide
import tkinter
Tkinter的提供各類控件,如按鈕,標籤和文本框,一個GUI應用程序中使用。這些控件一般被稱爲控件或者部件。函數
目前有15種Tkinter的部件。咱們提出這些部件以及一個簡短的介紹,在下面的表:
控件 | 描述 |
---|---|
Button | 按鈕控件;在程序中顯示按鈕。 |
Canvas | 畫布控件;顯示圖形元素如線條或文本 |
Checkbutton | 多選框控件;用於在程序中提供多項選擇框 |
Entry | 輸入控件;用於顯示簡單的文本內容 |
Frame | 框架控件;在屏幕上顯示一個矩形區域,多用來做爲容器 |
Label | 標籤控件;能夠顯示文本和位圖 |
Listbox | 列表框控件;在Listbox窗口小部件是用來顯示一個字符串列表給用戶 |
Menubutton | 菜單按鈕控件,因爲顯示菜單項。 |
Menu | 菜單控件;顯示菜單欄,下拉菜單和彈出菜單 |
Message | 消息控件;用來顯示多行文本,與label比較相似 |
Radiobutton | 單選按鈕控件;顯示一個單選的按鈕狀態 |
Scale | 範圍控件;顯示一個數值刻度,爲輸出限定範圍的數字區間 |
Scrollbar | 滾動條控件,當內容超過可視化區域時使用,如列表框。. |
Text | 文本控件;用於顯示多行文本 |
Toplevel | 容器控件;用來提供一個單獨的對話框,和Frame比較相似 |
Spinbox | 輸入控件;與Entry相似,可是能夠指定輸入範圍值 |
PanedWindow | PanedWindow是一個窗口布局管理的插件,能夠包含一個或者多個子控件。 |
LabelFrame | labelframe 是一個簡單的容器控件。經常使用與複雜的窗口布局。 |
tkMessageBox | 用於顯示你應用程序的消息框。 |
標準屬性也就是全部控件的共同屬性,如大小,字體和顏色等等。
屬性 | 描述 |
Dimension | 控件大小; |
Color | 控件顏色; |
Font | 控件字體; |
Anchor | 錨點; |
Relief | 控件樣式; |
Bitmap | 位圖; |
Cursor | 光標; |
Tkinter控件有特定的幾何狀態管理方法,管理整個控件區域組織,如下是Tkinter公開的幾何管理類:包、網格、位置
幾何方法 | 描述 |
pack() | 包裝; |
grid() | 網格; |
place() | 位置; |
咱們要學習使用上面提到的這些控件首先要建立一個主窗口,就像做畫同樣,先要架好架子和畫板,而後才能在上面放畫紙和各類繪畫元素,建立好主窗口才能在上面放置各類控件元素。而建立過程是很簡單的,以下:
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,主窗口循環顯示 window.mainloop() # 注意,loop由於是循環的意思,window.mainloop就會讓window不斷的刷新,若是沒有mainloop,就是一個靜態的window,傳入進去的值就不會有循環,
# mainloop就至關於一個很大的while循環,有個while,每點擊一次就會更新一次,因此咱們必需要有循環 # 全部的窗口文件都必須有相似的mainloop函數,mainloop是窗口文件的關鍵的關鍵。
測試結果:
Label:標籤控件;能夠顯示文本和位圖
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上設定標籤 l = tk.Label(window,text = "你好,this is a window",bg = "green", font=('Arial', 12),width = 30, height = 2) # 傳入主體window,內容text,背景bg,字體font,width爲長,height爲高,這裏的長和高是字符的長和高,好比height=2,就是標籤有2個字符這麼高 # 第5步,放置標籤 l.pack() # Label內容content區域放置位置,自動調節尺寸 # 放置lable的方法有:1)l.pack(); 2)l.place(); # 第6步,主窗口循環顯示 window.mainloop() # 注意,loop由於是循環的意思,window.mainloop就會讓window不斷的刷新,若是沒有mainloop,就是一個靜態的window,傳入進去的值就不會有循環,
# mainloop就至關於一個很大的while循環,有個while,每點擊一次就會更新一次,因此咱們必需要有循環 # 全部的窗口文件都必須有相似的mainloop函數,mainloop是窗口文件的關鍵的關鍵。
測試結果:
簡單說明:
Button(按鈕)部件是一個標準的Tkinter窗口部件,用來實現各類按鈕。按鈕可以包含文本或圖象,而且你可以將按鈕與一個Python函數或方法相關聯。當這個按鈕被按下時,Tkinter自動調用相關聯的函數或方法。
按鈕僅能顯示一種字體,可是這個文本能夠跨行。另外,這個文本中的一個字母能夠有下劃線,例如標明一個快捷鍵。默認狀況,Tab鍵用於將焦點移動到一個按鈕部件。
何時用按鈕部件:
簡言之,按鈕部件用來讓用戶說「立刻給我執行這個任務」,一般咱們用顯示在按鈕上的文本或圖象來提示。按鈕一般用在工具條中或應用程序窗口中,而且用來接收或忽略輸入在對話框中的數據。關於按鈕和輸入的數據的配合,能夠參看Checkbutton和Radiobutton部件。
如何建立:
普通的按鈕很容易被建立,僅僅指定按鈕的內容(文本、位圖、圖象)和一個當按鈕被按下時的回調函數便可:
b = tk.Button(window, text="hit me", command=hit_me)
沒有回調函數的按鈕是沒有用的,當你按下這個按鈕時它什麼也不作。你可能在開發一個應用程序的時候想實現這種按鈕,好比爲了避免干擾你的beta版的測試者:
b = tk.Button(window, text="Help", command=DISABLED)
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上設定標籤 var = tk.StringVar() # 將label標籤的內容設置爲字符類型,用var來接收hit_me函數的傳出內容用以顯示在標籤上 l = tk.Label(window,textvariable = var,text = "你好,this is a window",bg = "green", font=('Arial', 12),width = 30, height = 2) # 傳入主體window,內容text,背景bg,字體font,width爲長,height爲高,這裏的長和高是字符的長和高,好比height=2,就是標籤有2個字符這麼高 l.pack() # 放置標籤 # 定義一個函數功能(內容本身自由編寫),供點擊Button按鍵時調用,調用命令參數command=函數名 on_hit = False def hit_me(): global on_hit if on_hit == False: on_hit = True var.set("you hit me") else: on_hit = False var.set('') # 第5步,在窗口界面設置放置Button按鍵,調用命令參數command=函數名 b = tk.Button(window,text = "hit me",font =("Arial",12),width = 10, height = 1,command = hit_me) b.pack() # 第6步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
Entry是tkinter類中提供的的一個單行文本輸入域,用來輸入顯示一行文本,收集鍵盤輸入(相似 HTML 中的 text)。
何時用:
須要用戶輸入用戶信息時,好比咱們平時使用軟件、登陸網頁時,用戶交互界面讓咱們登陸帳戶信息等時候能夠用到。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('300x200') # 這裏的乘是小x # 第4步,在圖形界面上設定輸入框控件entry並放置控件 e1 = tk.Entry(window,show = '*') # 顯示成密文形式 e2 = tk.Entry(window,show = None) # 顯示成明文形式 e1.pack() e2.pack() # 第5步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
Text是tkinter類中提供的的一個多行文本區域,顯示多行文本,可用來收集(或顯示)用戶輸入的文字(相似 HTML 中的 textarea),格式化文本顯示,容許你用不一樣的樣式和屬性來顯示和編輯文本,同時支持內嵌圖象和窗口。
何時用:
在須要顯示編輯用戶、產品多行信息時,好比顯示用戶詳細描述文字,產品簡介等等,支持隨時編輯。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上設定輸入框控件entry框並放置 e = tk.Entry(window,show = None,width =20) #設置成明文形式 e.pack() # 第5步,定義三個觸發事件時的函數insert_point、insert_end和insert_xy # 注意:由於Python的執行順序是從上往下,因此函數必定要放在按鈕的上面 def insert_point(): # 在鼠標光標所在處插入輸入內容 var= e.get() t.insert('insert',var) def insert_end(): # 在文本框內容最後接着插入輸入內容 var = e.get() t.insert('end',var) def insert_xy(): # 在文本框內容第x行y列插入輸入內容 var = e.get() t.insert(2.2,var) #在第2行第2列插入(列是從0開始計算下標的) # 第6步,建立並放置三個按鈕分別觸發三種狀況 b1 = tk.Button(window,text = "insert point",font = ('Arial',10),width = 10,command = insert_point) b1.pack() b2 = tk.Button(window,text = "insert end",font = ('Arial',10),width = 10,command = insert_end) b2.pack() b3 = tk.Button(window,text = "insert xy",font = ('Arial',10),width = 10,command = insert_xy) b3.pack() # 第7步,建立並放置一個多行文本框text用以顯示 t= tk.Text(window,height = 3) t.pack() # 第8步,主窗口循環顯示 window.mainloop()
測試結果:
1)插入光標所在位置(insert point)
2)插入末尾處(insert end)
3)插入指定座標位置(insert xy)
簡單說明:
Text是tkinter類中提供的的列表框部件,顯示供選方案的一個列表。listbox可以被配置來獲得radiobutton或checklist的行爲。
何時用:
在有一個不少內容選項組成的列表提供用戶選擇時會用到。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上建立一個標籤label用以顯示並放置 var1 = tk.StringVar() # 建立變量,用var1用來接收鼠標點擊具體選項的內容 l = tk.Label(window,textvariable = var1,width = 20,height = 2,bg = 'green') l.pack() # 第6步,建立一個方法用於按鈕的點擊事件 def print_section(): value = lb.get(lb.curselection()) # 獲取當前選中的文本 var1.set(value) # 第5步,建立一個按鈕並放置,點擊按鈕調用print_selection函數 b = tk.Button(window,text = "print section",width =15,height = 2,command = print_section) b.pack() # 第7步,建立Listbox併爲其添加內容 var2 = tk.StringVar() var2.set((1,2,3,4)) # 爲變量var2設置值 # 建立Listbox,並將var2的值賦給Listbox lb = tk.Listbox(window,listvariable = var2,width = 20) # 建立一個list並將值循環添加到Listbox控件中 list_item = [11,22,33,44] for i in list_item: lb.insert('end', i) # 從最後一個位置開始加入值 lb.insert(1, 'first') # 在第一個位置加入'first'字符 lb.insert(2, 'second') # 在第二個位置加入'second'字符 lb.delete(2) # 刪除第二個位置的字符 lb.pack() # 第8步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
Radiobutton:表明一個變量,它能夠有多個值中的一個。點擊它將爲這個變量設置值,而且清除與這同一變量相關的其它radiobutton。
何時用:
在有一個不少內容選項組成的選項列表提供用戶選擇時會用到,用戶一次只能選擇其中一個,不能多選。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上建立一個標籤label用以顯示並放置 var = tk.StringVar() # 定義一個var用來將radiobutton的值和Label的值聯繫在一塊兒 l = tk.Label(window,text = 'empty',width = 20,height = 2,bg = 'green') l.pack() # 第6步,定義選項觸發函數功能 def print_section(): l.config(text = 'you have selected '+var.get()) # 第5步,建立三個radiobutton選項,其中variable=var, value='A'的意思就是, # 當咱們鼠標選中了其中一個選項,把value的值A放到變量var中,而後賦值給variable r1 = tk.Radiobutton(window,text = 'Option A', variable = var, value = 'A',command = print_section) r1.pack() r2 = tk.Radiobutton(window,text = 'Option B', variable = var, value = 'B',command = print_section) r2.pack() r3 = tk.Radiobutton(window,text = 'Option C', variable = var, value = 'C',command = print_section) r3.pack() # 第7步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
Scale: 尺度(拉動條),容許你經過滑塊來設置一數字值。
何時用:
在須要用戶給出評價等級,或者給出一個評價分數,或者拉動滑動條提供一個具體的數值等等。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上建立一個標籤label用以顯示並放置 var = tk.StringVar() # 定義一個var用來將radiobutton的值和Label的值聯繫在一塊兒 l = tk.Label(window,text = 'empty',width = 20,height = 2,bg = 'yellow', fg='blue') l.pack() # 第6步,定義一個觸發函數功能 def print_selection(v): l.config(text='you have selected ' + v) # 第5步,建立一個尺度滑條,長度200字符,從0開始10結束,以2爲刻度,精度爲0.01,觸發調用print_selection函數 s = tk.Scale(window,label = 'try me',from_=0 ,to=10,orient=tk.HORIZONTAL, length=200, showvalue=0,tickinterval=2, resolution=0.01, command=print_selection) s.pack() # 第7步,主窗口循環顯示 window.mainloop()
測試結果:
1)當showvalue爲0時不顯示拉動時候的具體刻度
2)當showvalue爲1時顯示刻度
簡單說明:
Checkbutton:表明一個變量,它有兩個不一樣的值。點擊這個按鈕將會在這兩個值間切換,選擇和取消選擇。
何時用:
在有一個不少內容選項組成的選項列表提供用戶選擇時會用到,用戶一次能夠選擇多個。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x200') # 這裏的乘是小x # 第4步,在圖形界面上建立一個標籤label用以顯示並放置 l = tk.Label(window,text = 'empty',width = 20,height = 2,bg = 'yellow', fg='blue') l.pack() # 第6步,定義觸發函數功能 def print_selection(): if (var1.get() == 1) & (var2.get() == 0): # 若是選中第一個選項,未選中第二個選項 l.config(text='I love only Python ') elif (var1.get() == 0) & (var2.get() == 1): # 若是選中第二個選項,未選中第一個選項 l.config(text='I love only C++') elif (var1.get() == 0) & (var2.get() == 0): # 若是兩個選項都未選中 l.config(text='I do not love either') else: l.config(text='I love both') # 若是兩個選項都選中 # 第5步,定義兩個Checkbutton選項並放置 var1 = tk.IntVar() # 定義var1和var2整型變量用來存放選擇行爲返回值 var2 = tk.IntVar() c1 = tk.Checkbutton(window,text = "Python",variable = var1,onvalue = 1,offvalue = 0,command = print_selection) c1.pack() c2 = tk.Checkbutton(window,text = "C++",variable = var2,onvalue = 1,offvalue = 0,command = print_selection) c2.pack() # 第7步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
Canvas:畫布,提供繪圖功能(直線、橢圓、多邊形、矩形) 能夠包含圖形或位圖,用來繪製圖表和圖,建立圖形編輯器,實現定製窗口部件。
何時用:
在好比像用戶交互界面等,須要提供設計的圖標、圖形、logo等信息是能夠用到畫布。
# -*- coding: utf-8 -*- import tkinter as tk # 使用Tkinter前須要先導入 # 第1步,實例化object,創建窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x300') # 這裏的乘是小x # 第4步,在圖形界面上建立 500 * 200 大小的畫布並放置各類元素 canvas = tk.Canvas(window, bg='green', height=200, width=500) # 說明圖片位置,並導入圖片到畫布上 image_file = tk.PhotoImage(file='pic.gif') # 圖片位置(相對路徑,與.py文件同一文件夾下,也能夠用絕對路徑,須要給定圖片具體絕對路徑) image = canvas.create_image(250, 0, anchor='n',image=image_file) # 圖片錨定點(n圖片頂端的中間點位置)放在畫布(250,0)座標處 # 定義多邊形參數,而後在畫布上畫出指定圖形 x0, y0, x1, y1 = 100, 100, 150, 150 line = canvas.create_line(x0-50, y0-50, x1-50, y1-50) # 畫直線 oval = canvas.create_oval(x0+120, y0+50, x1+120, y1+50, fill='yellow') # 畫圓 用黃色填充 arc = canvas.create_arc(x0, y0+50, x1, y1+50, start=0, extent=180) # 畫扇形 從0度打開收到180度結束 rect = canvas.create_rectangle(330, 30, 330+20, 30+20) # 畫矩形正方形 canvas.pack() # 第6步,觸發函數,用來必定指定圖形 def moveit(): canvas.move(rect, 2, 2) # 移動正方形rect(也能夠改爲其餘圖形名字用以移動一塊兒圖形、元素),按每次(x=2, y=2)步長進行移動 # 第5步,定義一個按鈕用來移動指定圖形的在畫布上的位置 b = tk.Button(window, text='move item',command=moveit).pack() # 第7步,主窗口循環顯示 window.mainloop()
圖片錨定點位置參數圖:
測試結果:
簡單說明:
Menu:菜單條,用來實現下拉和彈出式菜單,點下菜單後彈出的一個選項列表,用戶能夠從中選擇
何時用:
在好比像軟件或網頁交互界面等,須要提供菜單選項功能提供用戶選擇菜單選項功能時用到。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x200') # 這裏的乘是小x # 第4步,在圖形界面上建立一個標籤用以顯示內容並放置 l = tk.Label(window, text=' ', bg='green') l.pack() # 第10步,定義一個函數功能,用來表明菜單選項的功能,這裏爲了操做簡單,定義的功能比較簡單 counter = 0 def do_job(): global counter l.config(text='do '+ str(counter)) counter += 1 # 第5步,建立一個菜單欄,這裏咱們能夠把他理解成一個容器,在窗口的上方 menubar = tk.Menu(window) # 第6步,建立一個File菜單項(默認不下拉,下拉內容包括New,Open,Save,Exit功能項) filemenu = tk.Menu(menubar,tearoff = 0) # 將上面定義的空菜單命名爲File,放在菜單欄中,就是裝入那個容器中 menubar.add_cascade(label='File', menu=filemenu) # 在File中加入New、Open、Save等小菜單,即咱們平時看到的下拉菜單,每個小菜單對應命令操做。 filemenu.add_command(label='New', command=do_job) filemenu.add_command(label='Open', command=do_job) filemenu.add_command(label='Save', command=do_job) filemenu.add_separator() # 添加一條分隔線 filemenu.add_command(label='Exit', command=window.quit) # 用tkinter裏面自帶的quit()函數 # 第7步,建立一個Edit菜單項(默認不下拉,下拉內容包括Cut,Copy,Paste功能項) editmenu = tk.Menu(menubar, tearoff=0) # 將上面定義的空菜單命名爲 Edit,放在菜單欄中,就是裝入那個容器中 menubar.add_cascade(label='Edit', menu=editmenu) # 一樣的在 Edit 中加入Cut、Copy、Paste等小命令功能單元,若是點擊這些單元, 就會觸發do_job的功能 editmenu.add_command(label='Cut', command=do_job) editmenu.add_command(label='Copy', command=do_job) editmenu.add_command(label='Paste', command=do_job) # 第8步,建立第二級菜單,即菜單項裏面的菜單 submenu = tk.Menu(filemenu) # 和上面定義菜單同樣,不過此處實在File上建立一個空的菜單 filemenu.add_cascade(label='Import', menu=submenu, underline=0) # 給放入的菜單submenu命名爲Import # 第9步,建立第三級菜單命令,即菜單項裏面的菜單項裏面的菜單命令 submenu.add_command(label='Submenu_1', command=do_job) # 這裏和上面建立原理也同樣,在Import菜單項中加入一個小菜單命令Submenu_1 # 第11步,建立菜單欄完成後,配置讓菜單欄menubar顯示出來 window.config(menu=menubar) # 第12步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
Frame:框架,用來承載放置其餘GUI元素,就是一個容器,是一個在 Windows 上分離小區域的部件, 它能將 Windows 分紅不一樣的區,而後存放不一樣的其餘部件. 同時一個 Frame 上也能再分紅兩個 Frame, Frame 能夠認爲是一種容器.
何時用:
在好比像軟件或網頁交互界面等,有不一樣的界面邏輯層級和功能區域劃分時能夠用到,讓交互界面邏輯更加清晰。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x200') # 這裏的乘是小x # 第4步,在圖形界面上建立一個標籤用以顯示內容並放置 tk.Label(window, text='on the window', bg='red', font=('Arial', 16)).pack() # 和前面部件分開建立和放置不一樣,其實能夠建立和放置一步完成 # 第5步,建立一個主frame,長在主window窗口上 frame = tk.Frame(window) frame.pack() # 第6步,建立第二層框架frame,長在主框架frame上面 frame_l = tk.Frame(frame) # 第二層frame,左frame,長在主frame上 frame_r = tk.Frame(frame) # 第二層frame,右frame,長在主frame上 frame_l.pack(side='left') frame_r.pack(side='right') # 第7步,建立三組標籤,爲第二層frame上面的內容,分爲左區域和右區域,用不一樣顏色標識 tk.Label(frame_l, text='on the frame_l1', bg='green').pack() tk.Label(frame_l, text='on the frame_l2', bg='green').pack() tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack() # 第8步,主窗口循環顯示 window.mainloop()
測試結果:
簡單說明:
messageBox:消息框,用於顯示你應用程序的消息框。(Python2中爲tkMessagebox),其實這裏的messageBox就是咱們平時看到的彈窗。 咱們首先須要定義一個觸發功能,來觸發這個彈窗,這裏咱們就放上之前學過的button按鈕,經過觸發功能,調用messagebox吧,點擊button按鈕就會彈出提示對話框。
何時用:
在好比像軟件或網頁交互界面等,有不一樣的界面邏輯層級和功能區域劃分時能夠用到,讓交互界面邏輯更加清晰。
# -*- coding: utf-8 -*- import Tkinter as tk import tkMessageBox # 第1步,實例化object,創建窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('300x100') # 這裏的乘是小x # 第5步,定義觸發函數功能 def hit_me(): # tkMessageBox.showinfo(title='Hi', message='你好!') # 提示信息對話窗 # tkMessageBox.showwarning(title='Hi', message='有警告!') # 提出警告對話窗 # tkMessageBox.showerror(title='Hi', message='出錯了!') # 提出錯誤對話窗 # print(tkMessageBox.askquestion(title='Hi', message='你好!')) # 詢問選擇對話窗return 'yes', 'no' # print(tkMessageBox.askyesno(title='Hi', message='你好!')) # return 'True', 'False' print(tkMessageBox.askokcancel(title='Hi', message='你好!')) # return 'True', 'False' # 第4步,在圖形界面上建立一個標籤用以顯示內容並放置 tk.Button(window, text='hit me', bg='green', font=('Arial', 14), command=hit_me).pack() # 第6步,主窗口循環顯示 window.mainloop()
測試結果:
1)Pack:The Pack Geometry Manager
咱們經常使用的pack(), 他會按照上下左右的方式排列。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x200') # 這裏的乘是小x # 第4步,pack 放置方法 tk.Label(window, text=1, fg='red').pack(side='top') # 上 tk.Label(window, text=1, fg='red').pack(side='bottom') # 下 tk.Label(window, text=1, fg='red').pack(side='left') # 左 tk.Label(window, text=1, fg='red').pack(side='right') # 右 # 第5步,主窗口循環顯示 window.mainloop()
測試結果:
2)Grid:The Grid Geometry Manager
grid 是方格, 因此全部的內容會被放在這些規律的方格中。
grid 就是用表格的形式定位的。其中參數 row 爲行,colum 爲列,padx 就是單元格左右間距,pady 就是單元格上下間距,ipadx是單元格內部元素與單元格的左右間距,ipady是單元格內部元素與單元格的上下間距。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x200') # 這裏的乘是小x # 第4步,grid 放置方法 for i in range(3): for j in range(3): tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10) # 第5步,主窗口循環顯示 window.mainloop()
測試結果:
3)Place:The Place Geometry Manager
place()就是給精確的座標來定位。
# -*- coding: utf-8 -*- import Tkinter as tk #使用Tkinter前須要導入 # 第1步,實例化object,創建窗口對象window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('my window') # 第3步,設定窗口的大小(長 * 寬) window.geometry('500x200') # 這裏的乘是小x # 第4步,place 放置方法(精準的放置到指定座標點的位置上) tk.Label(window, text='Pl', font=('Arial', 20), ).place(x=50, y=100, anchor='nw') # 此處給的(50, 100),就是將這個部件放在座標爲(x=50, y=100)的這個位置, 後面的參數 anchor='nw',就是前面所講的錨定點是西北角。 # 第5步,主窗口循環顯示 window.mainloop()
測試結果:
編寫一個用戶登陸界面,用戶能夠登陸帳戶信息,若是帳戶已經存在,能夠直接登陸,登陸名或者登陸密碼輸入錯誤會提示,若是帳戶不存在,提示用戶註冊,點擊註冊進去註冊頁面,輸入註冊信息,肯定後即可以返回登陸界面進行登陸。
# -*- coding: utf-8 -*- import Tkinter as tk import pickle import tkMessageBox # 第1步:創建並設置窗口window window = tk.Tk() window.title("Welcome to sapphire python") window.geometry('500x250') # 第2步:用戶信息 tk.Label(window,text = "User name:",font = ('Arial',14)).place(x=50,y=100) tk.Label(window,text = "Password:",font = ('Arial',14)).place(x=50,y=200) # 第3步:用戶登錄輸入框Entry # 用戶名 var_user_name = tk.StringVar() var_user_name.set("example@python.com") entry_usr_name = tk.Entry(window,textvariable = var_user_name,font = ('Arial',14)).place(x=200,y=100) # 用戶密碼 var_password = tk.StringVar() entry_password = tk.Entry(window,textvariable = var_password,show = "*",font = ('Arial',14)).place(x=200,y=200) # 第5步:定義用戶登錄功能 def user_login(): # 這兩行代碼就是獲取用戶輸入的usr_name和usr_pwd usr_name = var_user_name.get() usr_pwd = var_password.get() # 這裏設置異常捕獲,當咱們第一次訪問用戶信息文件時是不存在的,因此這裏設置異常捕獲。 # 中間的兩行就是咱們的匹配,即程序將輸入的信息和文件中的信息匹配。 try: with open('usrs_info.pickle', 'rb') as usr_file: usrs_info = pickle.load(usr_file) except IOError: # 這裏就是咱們在沒有讀取到`usr_file`的時候,程序會建立一個`usr_file`這個文件,並將管理員 # 的用戶和密碼寫入,即用戶名爲`admin`密碼爲`admin`。 with open('usrs_info.pickle', 'wb') as usr_file: usrs_info = {'admin': 'admin'} pickle.dump(usrs_info, usr_file) usr_file.close() # 必須先關閉,不然pickle.load()會出現EOFError: Ran out of input # 若是用戶名和密碼與文件中的匹配成功,則會登陸成功,並跳出彈窗how are you? 加上你的用戶名。 if usr_name in usrs_info: if usr_pwd == usrs_info[usr_name]: tkMessageBox.showinfo(title='Welcome', message='How are you? ' + usr_name) # 若是用戶名匹配成功,而密碼輸入錯誤,則會彈出'Error, your password is wrong, try again.' else: tkMessageBox.showerror(message='Error, your password is wrong, try again.') else: # 若是發現用戶名不存在 is_sign_up = tkMessageBox.askyesno('Welcome! ', 'You have not sign up yet. Sign up now?') # 提示需不須要註冊新用戶 if is_sign_up: user_sign_up() # 第6步:定義用戶註冊功能 def user_sign_up(): def sign_to_sapphire_python(): # 如下三行就是獲取咱們註冊時所輸入的信息 np = new_pwd.get() npf = new_pwd_confirm.get() nn = new_name.get() # 這裏是打開咱們記錄數據的文件,將註冊信息讀出 with open('usrs_info.pickle', 'rb') as usr_file: exist_usr_info = pickle.load(usr_file) # 這裏就是判斷,若是兩次密碼輸入不一致,則提示Error, Password and confirm password must be the same! if np != npf: tkMessageBox.showerror('Error', 'Password and confirm password must be the same!') # 若是用戶名已經在咱們的數據文件中,則提示Error, The user has already signed up! elif nn in exist_usr_info: tkMessageBox.showerror('Error', 'The user has already signed up!') # 最後若是輸入無以上錯誤,則將註冊輸入的信息記錄到文件當中,並提示註冊成功Welcome!,You have successfully signed up!,而後銷燬窗口。 else: exist_usr_info[nn] = np with open('usrs_info.pickle', 'wb') as usr_file: pickle.dump(exist_usr_info, usr_file) tkMessageBox.showinfo('Welcome', 'You have successfully signed up!') # 而後銷燬窗口。 window_sign_up.destroy() # 定義長在窗口上的窗口 window_sign_up = tk.Toplevel(window) window_sign_up.geometry('300x200') window_sign_up.title('Sign up window') new_name = tk.StringVar() # 將輸入的註冊名賦值給變量 new_name.set('example@python.com') # 將最初顯示定爲'example@python.com' tk.Label(window_sign_up, text='User name: ').place(x=10, y=10) # 將`User name:`放置在座標(10,10)。 entry_new_name = tk.Entry(window_sign_up, textvariable=new_name) # 建立一個註冊名的`entry`,變量爲`new_name` entry_new_name.place(x=130, y=10) # `entry`放置在座標(150,10). new_pwd = tk.StringVar() tk.Label(window_sign_up, text='Password: ').place(x=10, y=50) entry_usr_pwd = tk.Entry(window_sign_up, textvariable=new_pwd, show='*') entry_usr_pwd.place(x=130, y=50) new_pwd_confirm = tk.StringVar() tk.Label(window_sign_up, text='Confirm password: ').place(x=10, y=90) entry_usr_pwd_confirm = tk.Entry(window_sign_up, textvariable=new_pwd_confirm, show='*') entry_usr_pwd_confirm.place(x=130, y=90) # 下面的 sign_to_Hongwei_Website btn_comfirm_sign_up = tk.Button(window_sign_up, text='Sign up', command=sign_to_sapphire_python) btn_comfirm_sign_up.place(x=180, y=120) # 第4步:login and sign up 按鈕 btn_login = tk.Button(window,text = "Login",width = 8,command = user_login).place(x=150,y=300) btn_sign_up = tk.Button(window,text = "sign up",width = 8,command = user_sign_up).place(x=250,y=300) # 第7步:主窗口循環顯示 window.mainloop()
測試結果: