Python之GUI的最終選擇(Tkinter)

轉自 https://www.cnblogs.com/Trojan00/p/9567342.html

首先,Tkinter是Python默認的GUI庫,想IDLE就是用Tkinter設計出來的,因此直接導入Tkinter模塊就可以啦

 import tkinter

(1)Tkinter初體驗:

import tkinter as tk

# 創建一個主窗口,用於容納整個GUI程序
root = tk.Tk()
# 設置主窗口對象的標題欄
root.title("NEW")
# 添加一個Label組件,Label組件是GUI程序中最常用的組件之一
# Label組件可以顯示文本、圖標或者圖片
# 在這裏我們讓他們顯示指定文本
theLabel = tk.Label(root, text="就是體驗一下")
# 然後調用Label組建的pack()方法,用於自動調節組件自身的尺寸
theLabel.pack()
# 注意,這時候窗口還是不會顯示的...
# 除非執行下面的這條代碼!!!!!
root.mainloop()

 

顯示結果:

升級上面程序:通常如果要寫一個比較大的程序,那麼應該先把代碼給封裝起來。在面向對象的編程語言中,就是封裝成類

import tkinter as tk

class App:
    def __init__(self, root):
        # 創建一個框架,然後在裏面添加一個Button按鈕組件
        # 框架一般使用於在複雜的佈局中起到將組建分組的作用
        frame = tk.Frame(root)
        frame.pack()
        # 創建一個按鈕組件,fg是foreground的縮寫,就是設置前景色的意思
        self.hi_there = tk.Button(frame, text="打招呼", fg="blue", command=self.say_hi)
        self.hi_there.pack(side=tk.LEFT)

    def say_hi(self):
        print("互聯網的廣大朋友們大家好,我是初音未來!")

# 創建一個toplevel的根窗口,並把他作爲擦參數實例化APP對象
root = tk.Tk()
app = App(root)
# 開始主事件循環
root.mainloop()

 

顯示結果:

 

然後點擊打招呼後會在控制檯會輸出  "互聯網的廣大朋友們大家好,我是初音未來! " 這句話

注意:可以通過修改pack()方法的side參數,side參數可以設置LEFT,RIGHT,TOP和TOTTOM四個方位,默認設置是side=tkinter.TOP.

     例如如上程序就修改了frame.pack(side=tk.LEFT)。

     還有一件事!!!如果你不想按鈕挨着"牆角",可以通過設置pack()方法的padx和pady參數自定義按鈕的偏移位置

     最後,就像你所看到的,按鈕既然可以設置前景色,那麼就一定可以設置背景色,bg參數就是啦,他是background的縮寫

    

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()

 

顯示結果:

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章