Python基礎(chǔ)學(xué)習(xí)筆記(十三)圖形化界面Tkinter

本節(jié)知識大綱:


圖片.png

Python里的圖形化界面(GUI)模塊主要有Tkinter(python自帶)、PyQt笛臣、wxPython偶摔,我們這節(jié)主要講解Tkinter組件:

一、Tkinter介紹

tkinter模塊只要用戶安裝好Python環(huán)境就可以直接使用条摸;

1. 第一個tkinter程序
import tkinter as tk  # 給tkinter重命名為tk
root = tk.Tk()  # 新建一個窗體
root.mainloop()  # 展示窗體
2. 設(shè)置屬性并添加控件

設(shè)置窗體標(biāo)題、指定窗體大小铸屉、添加按鈕钉蒲、輸入框、標(biāo)簽并布局

import tkinter as tk  
root = tk.Tk()
# 為窗體設(shè)置一個標(biāo)題
root.title("第一個tkinter窗體")
# 指定窗體的大小彻坛,這里的乘號是小寫字母x
root.geometry("400x300")
# 添加一個標(biāo)簽
Label01 = Label(root,text = "第一個label標(biāo)簽")
# 將標(biāo)簽布局到窗體上
Label01.pack() 
# 添加一個按鈕,可以在創(chuàng)建按鈕的同時在句尾調(diào)用pack語句進(jìn)行布局
Button01 = Button(root,text = "確定").pack()
# 添加一個單行文本框
Entry01 = Entry(root).pack()
# 展示窗體
root.mainloop()

二顷啼、控件的屬性

1. tkinter常用的控件屬性

(1)定義控件的名稱使用參數(shù)text,傳入的字符串值即為控件的名稱昌屉;
(2)定義控件高度使用參數(shù)hight钙蒙,寬度使用參數(shù)width,傳入的值為整形數(shù)值间驮;
(3)定義控件在空間中的位置躬厌,使用參數(shù)anchor,傳入的字符參數(shù)為e竞帽、s扛施、w、n以地圖的東南西北來定義為右下左上屹篓,也可以同時設(shè)置左下sw疙渣、左上nw、右下se堆巧、右上ne妄荔;
(4)定義控件的背景色,使用參數(shù)bg恳邀,前景色使用參數(shù)fg懦冰,傳入字符值可以直接是對應(yīng)顏色的英文名稱;
(5)設(shè)置布局在pack()函數(shù)里谣沸,使用參數(shù)side刷钢,傳入的值為常量tk.LEFT或者tk.RIGHT,表示從左到右或者從右到左布局
(6)創(chuàng)建圖片控件時乳附,圖片控件的文件源使用參數(shù)file内地,傳入的字符值為為文件路徑,在控件中使用圖片則使用參數(shù)image赋除,傳入的值為圖片控件變量阱缓;
(7)設(shè)置整個窗體的尺寸,使用參數(shù)geometry举农,傳入的值為字符值荆针,注意乘號用小寫字母x代替;如果要設(shè)置長400寬300的窗體則使用語句geometry = "400x300"
(8)設(shè)置控件與邊界的距離在pack函數(shù)里使用參數(shù)padx,設(shè)置左右距離航背,使用pady設(shè)置上下距離

2. 案例演示:畫出一個簡單的窗體布局
import tkinter as tk

# 新建一個窗體名稱:root
root = tk.Tk()
# 為窗體添加一個標(biāo)題
root.title("第二個Python窗體")

# 新建標(biāo)簽
photo = tk.PhotoImage(file = "/Users/yushengtan/Desktop/image.png")
Label01 = tk.Label(root,text = "第一個Label標(biāo)簽",anchor = "se").pack(side = tk.LEFT)
imageLable01 = tk.Label(root,image = photo).pack(side = tk.LEFT)
Label02 = tk.Label(root,text = "第二個Label標(biāo)簽",bg = "blue",fg = "white",font = ("華文宋體",20)).pack()
Label03 = tk.Label(root,text = "第三個Label標(biāo)簽",).pack()
Label04 = tk.Label(root,text = "第四個Label標(biāo)簽").pack()
Label05 = tk.Label(root,text = "第五個Label標(biāo)簽").pack()
Button01 = tk.Button(root,text = "確定").pack()

# 顯示
root.mainloop()

效果演示:


圖片.png
3. 案例演示:畫出能計(jì)算加法的計(jì)算器界面
# 導(dǎo)包的時候使用*喉悴,創(chuàng)建控件的時候不用寫類名了
from tkinter import *

# 創(chuàng)建一個窗體,名稱為root
root = Tk()
# 為窗體添加標(biāo)題
root.title("求兩數(shù)之和")
root.geometry("700x80")
photo = PhotoImage(file = "/Users/yushengtan/Desktop/calc.png")
# 定義控件
PhotoLabel = Label(root,image = photo).pack(side = LEFT,padx = 10,pady = 5)
# 第一個數(shù)字文本框
Entry01 = Entry(root,bg = "pink",width = 10,font = ("華文黑體",20)).pack(side = LEFT,padx = 5,pady = 5)
# 加號
Label_plus = Label(root,text = "+",font = ("華文黑體",20)).pack(side = LEFT,padx = 5,pady = 5)
# 第二個數(shù)字文本框
Entry02 = Entry(root,bg = "pink",width = 10,font = ("華文黑體",20)).pack(side = LEFT,padx = 5,pady = 5)
# 等于號
Label_equal = Label(root,text = "=",font = ("華文黑體",20)).pack(side = LEFT,padx = 5,pady = 5)
# 第三個數(shù)字文本框
Entry03 = Entry(root,bg = "green",width = 10,font = ("華文黑體",20)).pack(side = LEFT,padx = 5,pady = 5)
Button01 = Button(root,text = "計(jì)算",width = 10,height = 2,font = ("華文黑體",15)).pack(side = LEFT,padx = 10,pady = 5)

# 運(yùn)行
root.mainloop()

界面效果:


圖片.png

三玖媚、基本布局

1. place絕對布局

pack布局是按順序布局箕肃,而place布局可以直接定義絕對位置,只需要給place()函數(shù)里傳入兩個參數(shù)x和y今魔,其值為整型數(shù)值表示相對于窗體左上角的坐標(biāo)位置勺像;用法如place(x=10,y=20)

案例演示:

繪制一個簡易的登錄界面

from tkinter import *

root = Tk()
root.title("用戶登錄")
root.geometry("400x180")

Label_username = Label(root,text = "登錄名:",font = ("華為黑體",16)).place(x = 50,y = 20)
Entry_username = Entry(root,font = ("華文黑體",16),width = 20).place(x = 120,y = 20)
Label_password = Label(root,text = "密   碼:",font = ("華為黑體",16)).place(x = 50,y = 60)
Entry_password = Entry(root,font = ("華文黑體",16),width = 20).place(x = 120,y = 60)
Button_login = Button(root,text = "登錄",font = ("華文黑體",16),width = 8).place(x = 70,y = 120)
Button_cancer = Button(root,text = "取消",font = ("華文黑體",16),width = 8).place(x = 210,y = 120)

root.mainloop()
運(yùn)行效果:
圖片.png
2. grid表格布局

grid是一種網(wǎng)格布局,grid(row = 1,column = 2)错森,n行n列分別表示表格的行數(shù)和列數(shù)吟宦,從0開始計(jì)數(shù);可以使用參數(shù)sticky控制控件靠近單元格的位置问词,字符值可以給出n督函、s、w激挪、e設(shè)置上辰狡、下、左垄分、右宛篇,我們還是以登錄窗體為例:

# grid窗體布局
from tkinter import *

root = Tk()
root.title("用戶登錄")
root.geometry("450x160")

# 表格圖片
photo = PhotoImage(file = "/Users/yushengtan/Desktop/login.png")
img_label = Label(root,image = photo).grid(row = 0,column = 0,rowspan = 2)
# 第一行 第二列
Label_username = Label(root,text = "用戶名:",font = ("華文黑體",16)).grid(row = 0,column = 1)
# 第一行 第三列
Entry_username = Entry(root,font = ("華文黑體",16)).grid(row =0,column = 2)
# 第二行 第二列
Label_password = Label(root,text = "密  碼:",font = ("華文黑體",16)).grid(row = 1,column = 1)
# 第二行 第三列
Entry_password = Entry(root,font = ("華文黑體",16)).grid(row =1,column = 2)
# 第四行 第二列
Button_login = Button(root,text = "登錄",width = 8,font = ("華文黑體",16)).grid(row = 3,column = 2,sticky = "e")
# 第四行 第三列
Button_cancer = Button(root,text = "取消",width = 8,font = ("華文黑體",16)).grid(row =3,column = 2,sticky = "w")

root.mainloop()
輸出效果:
圖片.png

注意:紅色輔助線幫助理解表格布局

四、使用類封裝GUI

這里我們使用類來封裝GUI程序薄湿,以至于我們后面需要調(diào)用的時候直接實(shí)例化一個對象就可以產(chǎn)生一個窗口叫倍,類與對象的知識我們后面會深入講解,現(xiàn)在我們只需怎么使用即可豺瘤;
我們把前面的登錄窗口通過類來進(jìn)行封裝

from tkinter import *

class login_GUI(object):
    def __init__(self):
        """
        窗體的構(gòu)造函數(shù)吆倦,用來做界面的初始化,GUI代碼放在此函數(shù)中
        """
        self.frame = Tk()
        self.frame.title("登錄窗體")
        self.frame.geometry("400x160")

        self.photo = PhotoImage(file="/Users/yushengtan/Desktop/login.png")
        imgLabel = Label(self.frame, image=self.photo).grid(row=0, column=0, rowspan=2)
        # 第一行 第一列
        Label_username = Label(self.frame, text="用戶名:", font=("微軟雅黑", 14)).grid(row=0, column=1)
        # 第一行 第二列
        Entry_username = Entry(self.frame, font=("華文黑體", 16)).grid(row=0, column=2)
        # 第二行 第二列
        Label_password = Label(self.frame, text="密  碼:", font=("華文黑體", 16)).grid(row=1, column=1)
        # 第二行 第三列
        Entry_password = Entry(self.frame, font=("華文黑體", 16)).grid(row=1, column=2)
        # 第四行 第二列
        Button_login = Button(self.frame, text="登錄", width=8, font=("華文黑體", 16)).grid(row=3, column=2, sticky="e")
        # 第四行 第三列
        Button_cancer = Button(self.frame, text="取消", width=8, font=("華文黑體", 16)).grid(row=3, column=2, sticky="w")

    def run(self):
        self.frame.mainloop()

if __name__ == '__main__':
    # 由窗體的模板實(shí)例化一個具體的登錄窗體
    this_login = login_GUI()
    # 展示窗體
    this_login.run()

五坐求、響應(yīng)事件

以上我們實(shí)現(xiàn)了GUI界面的設(shè)計(jì)蚕泽,加法計(jì)算器、登錄窗口桥嗤,但是沒有程序并不能工作须妻,如果想要程序工作起來還得給控件設(shè)置響應(yīng)事件;
事件是什么呢泛领?事件就是響應(yīng)某一個動作荒吏,如點(diǎn)擊某一個按鈕、輸入鍵盤的某一個鍵等等渊鞋。
我們現(xiàn)在來完善前面設(shè)計(jì)加法計(jì)算器绰更,讓其能真正做加法計(jì)算;

1. 完成點(diǎn)擊按鈕響應(yīng)事件的步驟

(1)完成時間的功能---函數(shù)
(2)把功能捆綁到按鈕上瞧挤,添加command參數(shù),其值為功能函數(shù)名动知,注意沒有小括號
注意:取出文本框的數(shù)值可以使用get()方法皿伺,設(shè)置文本框的數(shù)值可以使用set()方法;
控件基本屬性的設(shè)定和控件的布局語句要分開盒粮;

2. 案例:實(shí)現(xiàn)兩數(shù)相加的功能

通過響應(yīng)事件完成加法計(jì)算器

# 實(shí)現(xiàn)加法計(jì)算器的的GUI界面
from tkinter import *
from tkinter.messagebox import  *

# 寫一個類:實(shí)現(xiàn)兩數(shù)相加的頁面和功能
class get_sum(object):
    def __init__(self):
        # 新建一個窗體
        self.frame = Tk()
        # 窗體添加標(biāo)題
        self.frame.title("實(shí)現(xiàn)兩數(shù)相加")
        self.frame.geometry("700x80")
        self.photo = PhotoImage(file="/Users/yushengtan/Desktop/calc.png")
        # 定義控件
        self.img_Label = Label(self.frame, image=self.photo)
        self.img_Label.pack(side=LEFT, padx=10, pady=5)

        # 第一個數(shù)字文本框
        self.num01_Entry = Entry(self.frame, bg="pink", width=10, font=("華文黑體", 20))
        self.num01_Entry.pack(side=LEFT, padx=5, pady=5)

        # 加號
        self.Label01 = Label(self.frame, text="+", font=("華文黑體", 20))
        self.Label01.pack(side=LEFT, padx=5, pady=5)

        # 第二個數(shù)字文本框
        self.num02_Entry = Entry(self.frame, bg="pink", width=10, font=("華文黑體", 20))
        self.num02_Entry.pack(side=LEFT, padx=5, pady=5)

        # 等于號
        self.Label02 = Label(self.frame, text="=", font=("華文黑體", 20))
        self.Label02.pack(side=LEFT, padx=5, pady=5)

        # 第三個數(shù)字文本框
        self.var = StringVar()
        self.result_Entry = Entry(self.frame, bg="green", width=10, font=("華文黑體", 20),textvariable = self.var)
        self.result_Entry.pack(side=LEFT, padx=5, pady=5)

        self.cal_Button = Button(self.frame, text="計(jì)算", width=10, height=2, font=("華文黑體", 15),command = self.cal_sum)
        self.cal_Button.pack(side=LEFT, padx=10, pady=5)
    # 展示窗體
    def run(self):
        self.frame.mainloop()
    # 實(shí)現(xiàn)兩數(shù)相加
    def cal_sum(self):
        # 先取出字符串
        num01 = self.num01_Entry.get()
        num02 = self.num02_Entry.get()
        # 判斷
        if num01.isdigit() and num02.isdigit():
            self.var.set(str(int(num01) + int(num02)))
        else:
            showinfo("系統(tǒng)提示","輸入的值不都是數(shù)字無法計(jì)算")

運(yùn)行效果:


1.gif
3. 案例:實(shí)現(xiàn)用戶登錄功能

需求:
(1)如果用戶名為admin,密碼為123.com,顯示登錄成功奠滑!
(2)如果用戶名不對丹皱,顯示用戶名不存在;
(3)如果密碼不對宋税,顯示密碼錯誤摊崭,如果錯誤三次,提示:賬號已鎖定杰赛。
提示:實(shí)現(xiàn)窗體的關(guān)閉呢簸,可以使用方法self.frame.destory()關(guān)閉窗體;

# 用戶登錄
from tkinter import *
from tkinter.messagebox import *

class login_GUI(object):
    def __init__(self):
        """
        窗體的構(gòu)造函數(shù)乏屯,用來做界面的初始化根时,GUI代碼放在此函數(shù)中
        """
        self.frame = Tk()
        self.frame.title("登錄窗體")
        self.frame.geometry("400x160")

        self.photo = PhotoImage(file="/Users/yushengtan/Desktop/login.png")
        self.imgLabel = Label(self.frame, image=self.photo)
        self.imgLabel.grid(row=0, column=0, rowspan=2)
        # 第一行 第一列
        self.Label_username = Label(self.frame, text="用戶名:", font=("微軟雅黑", 14))
        self.Label_username.grid(row=0, column=1)
        # 第一行 第二列
        self.Entry_username = Entry(self.frame, font=("華文黑體", 16))
        self.Entry_username.grid(row=0, column=2)
        # 第二行 第二列
        self.Label_password = Label(self.frame, text="密  碼:", font=("華文黑體", 16))
        self.Label_password.grid(row=1, column=1)
        # 第二行 第三列
        self.Entry_password = Entry(self.frame, font=("華文黑體", 16))
        self.Entry_password.grid(row=1, column=2)
        # 第四行 第二列
        self.Button_login = Button(self.frame, text="登錄", width=8, font=("華文黑體", 16),command = self.login)
        self.Button_login.grid(row=3, column=2, sticky="e")
        # 第四行 第三列
        self.Button_cancer = Button(self.frame, text="取消", width=8, font=("華文黑體", 16),command = self.cancer)
        self.Button_cancer.grid(row=3, column=2, sticky="w")

        # 定義全局變量
        self.password_error_times = 0
        self.is_disable = False
    def run(self):
        self.frame.mainloop()

    def login(self):
        # 【1】先獲取用戶名和密碼
        username = str(self.Entry_username.get())
        password = str(self.Entry_password.get())
        # 【2】驗(yàn)證
        if username.strip().lower() != "admin":
            showinfo("系統(tǒng)消息","用戶名不存在,請核實(shí)后再登錄辰晕!")
        elif password.strip() != "123.com":
            self.password_error_times += 1
            # 判斷是否達(dá)到三次
            if self.password_error_times >= 3:
                self.is_disable = True
            # 判斷禁用標(biāo)志
            if self.is_disable:
                showinfo("系統(tǒng)消息","密碼輸入錯誤已達(dá)三次蛤迎,賬號已鎖定,請聯(lián)系管理員")
            else:
                showinfo("系統(tǒng)消息", "密碼錯誤含友!")
        else:
            showinfo("系統(tǒng)消息","登錄成功")
            # 如果在3次以內(nèi)輸入正確替裆,則錯誤次數(shù)計(jì)數(shù)歸零
            self.password_error_times = 0

    def cancer(self):
        # 實(shí)現(xiàn)窗體的關(guān)閉
        self.frame.destroy()

if __name__ == '__main__':
    # 由窗體的模板實(shí)例化一個具體的登錄窗體
    this_login = login_GUI()
    # 展示窗體
    this_login.run()

演示效果:


2.gif

六、GUI擴(kuò)展功能

1. ttk模塊

ttk模塊是對傳統(tǒng)tkinter模塊的增強(qiáng)窘问,傳統(tǒng)的tkinter模塊界面比較單一辆童,控件種類有限,界面布局邏輯性差惠赫。ttk模塊是tkinter下的一個子模塊把鉴,它的界面比tkinter更豐富更美觀。ttk的用法同tkinter大體相同汉形,但是有一些屬性ttk不再支持纸镊,而tkinter中的fg、bg概疆、font屬性在ttk中不再被支持逗威,取而代之的是style對象;

2. 復(fù)選框Checkbutton
# Checkbutton控件
from tkinter import *
# from tkinter.ttk import *
from tkinter.messagebox import *

# 新建一個窗體還是需要tkinter
root = Tk()
root.geometry("450x100")
root.title("CheckButton控件")


#Label標(biāo)簽
Label01 = Label(root,text = "請選擇你去過的城市")
Label01.grid(row = 0,column = 0,padx = 0,pady = 20)

city_list = ["北京","上海","廣州","深圳","南京"]
# 用一組值存儲選中哪些
is_check_list = []

# 通過循環(huán)展示
for city in city_list:
    is_check_list.append(IntVar())
    CheckButton01 = Checkbutton(root,text=city,variable = is_check_list[-1])    # 為啥是-1
    CheckButton01.grid(row = 0,column = len(is_check_list),padx = 5,pady = 5)

# sel函數(shù)
def sel():
    all_select = ""
    for i in range(0,len(is_check_list)):
        if is_check_list[i].get() == 1:
            all_select += city_list[i] + " "
    Label_select["text"] = "所選城市為:"+all_select

# 添加一個Button
Button01 = Button(root,text = "確認(rèn)選擇",command = sel)
Button01.grid(row = 1,column = 0,padx = 5,pady = 5)

# 添加一個Label標(biāo)簽岔冀,用于展示顯示后的結(jié)果
Label_select = Label(root,text = "")
Label_select.grid(row = 1,column = 1,columnspan = 5)


# 加載
root.mainloop()

演示效果:


2.gif
3. 單選框Radiobutton
# RadioButton
from tkinter import *
# from tkinter.ttk import *
# radiobutton --- 單選框----多個值中只能選一個
root = Tk()
root.title("RadioButton組件")
root.geometry("400x100")

def sel_gender():
    if gender_check.get() == 1:
        Label_select_gender["text"] = "男"
    else:
        Label_select_gender["text"] = "女"

def sel_education():
    Label_select_education["text"] = education_list[int(education_check.get())]

# 性別單選
Label_gender = Label(root,text = "性別:")
Label_gender.grid(row = 0,column = 0,padx = 5,pady = 5)

gender_check = IntVar()

# 用哪個變量接收它是否被選中凯旭,variable,綁定的值是同一個表示一組,variable通過get方法能獲得value的值
# 最終選中后取什么值: value,同一組radiobutton中value的值最好是不同的
# 性別的單選
radio_boy = Radiobutton(root,text = "男",variable = gender_check,value = 1,command = sel_gender)
radio_boy.grid(row = 0,column = 1,padx = 5,pady = 5)
radio_boy = Radiobutton(root,text = "女",variable = gender_check,value = 0,command = sel_gender)
radio_boy.grid(row = 0,column = 2,padx = 5,pady = 5)
# 學(xué)歷
education_list = ["高中","尮藓簦科","本科","碩士","博士"]
Label_education = Label(root,text = "學(xué)歷:")
Label_education.grid(row = 1,column = 0,padx = 5,pady = 5)

education_check = IntVar()
for i in range(0,len(education_list)):
    radio = Radiobutton(root,text = education_list[i],variable = education_check,value = i,command = sel_education)
    radio.grid(row = 1,column = i + 1,padx = 5,pady = 5)

Label01 = Label(root,text = "所選的值為:")
Label01.grid(row = 2 , column = 0)

Label_select_gender = Label(root,text = "")
Label_select_gender.grid(row = 2 , column = 1)
Label_select_education = Label(root,text = "")
Label_select_education.grid(row = 2 , column = 2)

# 展示控件
root.mainloop()

演示效果:


1.gif
4. 下拉框ComboBox
# ComboBox
from tkinter import *
from tkinter.ttk import *

# ComboBox 控件 --- 下拉框單選
root = Tk()
root.title("ComboBox控件")
root.geometry("400x100")

# 做下拉選擇的時候定義函數(shù)一定要使用可變長參數(shù)
def sel_gender(*args):
    Label_select_gender["text"] = combo_gender.get()

def sel_education(*args):
    Label_select_education["text"] = combo_education.get()

# 性別單選
Label_gender = Label(root,text = "性別")
Label_gender.grid(row = 0,column = 0,padx = 5,pady = 5)

gender = StringVar()
combo_gender = Combobox(root,textvariable = gender)
combo_gender["values"] = ["男","女"]  # 下拉列表填充
combo_gender["state"] = "readonly"  # 只允許讀鞠柄,如果沒有這個參數(shù),輸入框可以輸入值
combo_gender.current(0) # 默認(rèn)情況下選擇的值的索引
combo_gender.grid(row = 0 ,column = 1)

# 學(xué)歷單選
education_list = ["高中","尲挡瘢科","本科","碩士","博士"]
Label_education = Label(root,text = "學(xué)歷:")
Label_education.grid(row = 1,column = 0)

education = StringVar()
combo_education = Combobox(root,textvariable = education,values = education_list)
combo_education["state"] = "readonly"
combo_education.current(0)
combo_education.grid(row = 1,column = 1)

# 綁定選擇性別的事件
combo_gender.bind("<<ComboboxSelected>>",sel_gender)
# 綁定選擇學(xué)歷的事件
combo_education.bind("<<ComboboxSelected>>",sel_education)

# 獲取結(jié)果:
Label01 = Label(root,text = "所選的值為:")
Label01.grid(row = 2 , column = 0)
Label_select_gender = Label(root,text = "")
Label_select_gender.grid(row = 2,column = 1,sticky = "e")
Label_select_education = Label(root,text = "")
Label_select_education.grid(row = 2,column = 2,sticky = "w")

# 窗體展示
root.mainloop()

效果演示:


1.gif
5. 容器LabelFrame

把具有相同功能的模塊組合在一起厌杜,并且加上一個名字,這個控件能讓你的界面更加有條理

# LabelFrame
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("LabelFrame控件")

LabelFrame_query = LabelFrame(root,text = "學(xué)生信息查詢")
LabelFrame_query.pack(padx = 10,pady = 10)
# 如果不加控件的話计螺,LabelFrame是看不見的

Label01 = Label(LabelFrame_query,text = "學(xué)號")
Label01.pack(side = LEFT,padx = 5,pady = 5)
Entry01 = Entry(LabelFrame_query,width = 10)
Entry01.pack(side = LEFT,padx = 5,pady = 5)
Label02 = Label(LabelFrame_query,text = "姓名")
Label02.pack(side = LEFT,padx = 5,pady = 5)
Entry02 = Entry(LabelFrame_query,width = 10)
Entry02.pack(side = LEFT,padx = 5,pady = 5)
Label03 = Label(LabelFrame_query,text = "班級")
Label03.pack(side = LEFT,padx = 5,pady = 5)
Entry03 = Entry(LabelFrame_query,width = 10)
Entry03.pack(side = LEFT,padx = 5,pady = 5)
Button01 = Button(LabelFrame_query,text = "查詢",width = 5)
Button01.pack(side = LEFT,padx = 15,pady = 5)

root.mainloop()

運(yùn)行效果:


圖片.png
6. 樹狀視圖TreeView
# Treeview控件
from tkinter import *
from tkinter.ttk import *

root = Tk()
root.title("TreeView模塊")
root.geometry("440x225")
# frame容器放置表格
frame01 = Frame(root)
frame01.place(x = 10,y = 10,width =420,height = 220 )
# 加載滾動條
scrollBar = Scrollbar(frame01)
scrollBar.pack(side = RIGHT,fill = Y)
# 準(zhǔn)備表格TreeView
tree = Treeview(frame01,columns = ("學(xué)號","姓名","性別","年齡","手機(jī)號"),show = "headings",yscrollcommand = scrollBar.set)
# 設(shè)置每一列的寬度和對齊方式
tree.column("學(xué)號",width = 80,anchor = "center")
tree.column("姓名",width = 80,anchor = "center")
tree.column("性別",width = 60,anchor = "center")
tree.column("年齡",width = 60,anchor = "center")
tree.column("手機(jī)號",width = 120,anchor = "center")
# 設(shè)置表頭的標(biāo)題文本
tree.heading("學(xué)號",text = "學(xué)號")
tree.heading("姓名",text = "姓名")
tree.heading("性別",text = "性別")
tree.heading("年齡",text = "年齡")
tree.heading("手機(jī)號",text = "手機(jī)號")
# 設(shè)置關(guān)聯(lián)
scrollBar.config(command = tree.yview)
# 加載表格信息
tree.pack()
# 插入數(shù)據(jù)
for i in range(10):
    # i 是索引
    tree.insert("",i,values=["9500"+str(i),"張三","男","23","15622338793"])
# 展示
root.mainloop()

運(yùn)行效果:


圖片.png
7. Style屬性

增強(qiáng)的ttk包里沒法用tkinter的傳統(tǒng)屬性進(jìn)行設(shè)置比如bg和fg夯尽,我們需要通過style對象來對其設(shè)置;
注意:我們對實(shí)例化對象style01進(jìn)行配置,

style01.configure("TLabel",font = ("華文黑體",18),background = "green",foreground = "blue")

第一個參數(shù)不是對象的名稱,而是對象的某一類登馒,其名稱是有規(guī)定的匙握,不是隨便取的,由于這里是對Label 的style進(jìn)行命令陈轿,所以我們只能命名成TLabel圈纺,具體的組件與名稱的對應(yīng)關(guān)系如下:

圖片.png

疑問
如果此時創(chuàng)建一個Label02對象它的style屬性沒有綁定style01對象,但是它的屬性依然是style01對象里定義的特征麦射,這是怎么回事呢蛾娶?
解答
其實(shí)只要在配置style的時候,填寫標(biāo)準(zhǔn)的Stylename法褥,后面無論某個控件是否綁定茫叭,Stylename 對應(yīng)的控件都會生效;

from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("style屬性")
root.geometry("300x200")

# 實(shí)例化一個style對象style01
style01 = Style()
# 對style01進(jìn)行配置,Stylename屬性設(shè)置為標(biāo)準(zhǔn)的TLable
style01.configure("TLabel",font = ("華文黑體",18),background = "green",foreground = "blue")
# 把Label01控件綁定給style01對象
Label01 = Label(root,text = "用戶名",style = "TLabel")
Label01.pack(padx = 10,pady = 10)
Label02 = Label(root,text = "密碼")
Label02.pack(padx = 10,pady = 10)
# 展示窗體
root.mainloop()

效果演示:


圖片.png

拓展
如果只想對某類中的某些控件生效半等,那么就必須要使用custom.Stylename格式來進(jìn)行命名揍愁;
如我創(chuàng)建的style01的Stylename名稱是username.TLabel,這里的username是自定義字段杀饵,那么后面的Label控件如果沒有指定style是username.TLabel就不會具有style01的屬性

from tkinter import *
from tkinter.ttk import *
root = Tk()
root.title("style屬性")
root.geometry("300x200")

# 實(shí)例化一個style對象style01
style01 = Style()
# 對style01進(jìn)行配置,Stylename屬性設(shè)置為password.TLable
style01.configure("password.TLabel",font = ("華文黑體",18),background = "green",foreground = "blue")
# 把Label01控件綁定給style01對象
Label01 = Label(root,text = "用戶名",style = "password.TLabel")
Label01.pack(padx = 10,pady = 10)
Label02 = Label(root,text = "密碼")
Label02.pack(padx = 10,pady = 10)
# 展示窗體
root.mainloop()

這樣控件的顯示效果如下:


圖片.png

這樣就能使具體某一個組件生效莽囤,這樣就能做到既能控制全局保持整體的統(tǒng)一,又能對具體某一類或者某一個特別對待切距,這種機(jī)制就很棒朽缎!
好啦,關(guān)于Tkinter的基礎(chǔ)知識點(diǎn)就介紹到這里啦谜悟!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末话肖,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子葡幸,更是在濱河造成了極大的恐慌最筒,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蔚叨,死亡現(xiàn)場離奇詭異床蜘,居然都是意外死亡辙培,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評論 3 385
  • 文/潘曉璐 我一進(jìn)店門邢锯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扬蕊,“玉大人,你說我怎么就攤上這事丹擎∥惨郑” “怎么了?”我有些...
    開封第一講書人閱讀 158,300評論 0 348
  • 文/不壞的土叔 我叫張陵鸥鹉,是天一觀的道長蛮穿。 經(jīng)常有香客問我,道長毁渗,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,780評論 1 285
  • 正文 為了忘掉前任单刁,我火速辦了婚禮灸异,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘羔飞。我一直安慰自己肺樟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評論 6 385
  • 文/花漫 我一把揭開白布逻淌。 她就那樣靜靜地躺著么伯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪卡儒。 梳的紋絲不亂的頭發(fā)上田柔,一...
    開封第一講書人閱讀 50,084評論 1 291
  • 那天,我揣著相機(jī)與錄音骨望,去河邊找鬼硬爆。 笑死,一個胖子當(dāng)著我的面吹牛擎鸠,可吹牛的內(nèi)容都是我干的缀磕。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼劣光,長吁一口氣:“原來是場噩夢啊……” “哼袜蚕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起绢涡,我...
    開封第一講書人閱讀 37,912評論 0 268
  • 序言:老撾萬榮一對情侶失蹤牲剃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垂寥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體颠黎,經(jīng)...
    沈念sama閱讀 44,355評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡另锋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了狭归。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夭坪。...
    茶點(diǎn)故事閱讀 38,809評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖过椎,靈堂內(nèi)的尸體忽然破棺而出室梅,到底是詐尸還是另有隱情,我是刑警寧澤疚宇,帶...
    沈念sama閱讀 34,504評論 4 334
  • 正文 年R本政府宣布亡鼠,位于F島的核電站,受9級特大地震影響敷待,放射性物質(zhì)發(fā)生泄漏间涵。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評論 3 317
  • 文/蒙蒙 一榜揖、第九天 我趴在偏房一處隱蔽的房頂上張望勾哩。 院中可真熱鬧,春花似錦举哟、人聲如沸思劳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜叛。三九已至,卻和暖如春壶硅,著一層夾襖步出監(jiān)牢的瞬間威兜,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,121評論 1 267
  • 我被黑心中介騙來泰國打工森瘪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留牡属,地道東北人。 一個月前我還...
    沈念sama閱讀 46,628評論 2 362
  • 正文 我出身青樓扼睬,卻偏偏與公主長得像逮栅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子窗宇,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評論 2 351