天天看點

14.Python常用第三方庫—tkinter庫的使用

目錄

一、tkinter庫介紹

二、tkinter常用控件介紹

三、tkinter布局方式

1.  tkinter布局方式表 

2   .grid()方法詳解

四、canvas畫布

1.  canvas屬性方法表

2.  代碼執行個體(小房子) 

五、tkinter應用程式開發基本流程 

六、tkinter代碼執行個體示範

一、tkinter庫介紹

        Python标準庫tkinter是對Tcl/Tk的進一步封裝,是一套完整的GUI開發子產品的組合或套件,這些子產品共同提供了強大的跨平台GUI程式設計的功能,所有的源碼檔案位于Python安裝目錄中lib\tkinter檔案夾。

      tkinter與turtle類似,無需額外安裝,使用起來非常友善。tkinter提供了很多控件和消息事件,可以很快入手,非常适合開發具有界面的輕量級應用程式。使用tkinter之前,需要導入tkinter子產品:

import tkinter
           

二、tkinter常用控件介紹

      tkinter中的控件就是一些已經封裝好的界面單元,可以直接使用,再複雜的應用程式都是由一個個控件單元組成。隻要掌握了單個控件的使用方法,應用程式就可以如搭積木般建立出來。

(有感而發:想到老子的一句話:“道生一,一生二,二生三,三生萬物。”)

控件名稱 說明
Button 按鈕,在界面中顯示一個按鈕
Canvas 畫布,用于繪制直線、橢圓、多邊形等各種圖形
Checkbutton 複選框形式的按鈕,用于在界面中提供多項選擇功能,選擇間沒有互斥關系
Radiobutton 單選按鈕,同一組中的單選鈕任何時刻隻能有一個處于選中狀态
Entry 單行文本框
Text 多行文本框
Frame 架構,可作為其他元件的容器,常用來對元件進行分組
Label 标簽,常用來顯示單行文本
Listbox 清單框
Menu 菜單,用于顯示菜單欄,包括下拉菜單和彈出菜單
Message 消息控件,可以根據自身大小将文本換行
Scale 滑動控件,顯示一個數值刻度,為輸出限定範圍和數字之間,可以通過滑鼠拖動改變數值
Scrollbar 滾動條控件,當内容超出可視化區域時使用
Toplevel 容器控件,常用來建立新的視窗
Spinbox 輸入控件,與Entry類似,但是可以指定輸入數值範圍
PanedWindow 視窗布局管理插件,可以包含一個或多個子控件
LabelFrame 簡單的容器控件,在複雜的視窗布局中使用
tkMessageBox 彈出消息框控件

三、tkinter布局方式

1.  tkinter布局方式表 

布局 參數 描述
pack after 将元件放置于其他元件後面
before 将元件放置于其他元件前面
anchor 元件的對齊方式:N(下/南)對齊,S(上/北)對齊,w(左/西)對齊,E(右/東)對齊
side 元件相對于主視窗的位置:TOP(上方),BOTTOM(下方),LEFT(左側),RIGHT(右側)
fill 填充方式,X:水準填充,Y:垂直填充
grid row 指定元件所在行
column 指定元件所在列
rowspan 跨越(合并)的行數
columnspan 跨越(合并)的列數
sticky 這個參數用來确定:在插件正常尺寸下,如何配置設定 單元 中多餘的空間
place anchor 元件的對齊方式:N(下/南)對齊,S(上/北)對齊,w(左/西)對齊,E(右/東)對齊
x 元件左上角的x坐标
y 元件左上角的y坐标
relx 元件相對于視窗的x坐标,取值為0~1
rely 元件相對于視窗的y坐标,取值為0~1
width 元件寬度
height 元件高度
relwidth 元件相對于視窗的寬度,取值為0~1
relheight 元件相對于視窗的高度,取值為0~1

2   .grid()方法詳解

以下語句可以在你的應用界面顯示 w 插件:

w.grid(option=value , ...)
           

      這個方法使用 grid 結構管理器,登記了 w 插件。如果沒有這條語句,将不會在螢幕中顯示這個插件,而隻存在于代碼中。語句中的 option 項可檢視下表,.grid() 結構管理器的參數。

.grid()結構管理器的參數

option 解釋
column 插件布放的列數值,從0開始。預設值為0
columnspan 正常情況下,一個插件隻占一個單元 。但是,你可以通過設定 columnspan 來合并一行中的多個鄰近 單元 ,并用此 單元 放置本插件。比如, 

w.grid(row=0, column=2, columnspan=3)

 ,這會把插件 w 布置在 将第0行的2,3,4列合并後的 單元 中。
in_ 用 

in_=w2

 可以将 w 登記為 w2 的child插件。 w2 必須是 w 建立時指定parent插件的child插件。
ipadx x方向的内部填充。在插件内部,左右方向各填充指定長度的空間。
ipady y方向的内部填充。在插件内部,上下方向各填充指定長度的空間。
padx x方向的外部填充。在插件外部,左右方向各填充指定長度的空間。
pady y方向的内部填充。在插件内部,上下方向各填充指定長度的空間。
row 插件布放的行數值,從0開始。預設值 為 未布放行 的下一個數值。
rowspan 正常情況下,一個插件隻占一個單元 。但是,你可以通過設定 rowspan 來合并一列中的多個鄰近 單元 ,并用此 單元 放置本插件。比如, 

w.grid(row=3, column=2, rowspan=4, columnspan=3)

 ,這會把插件 w 布置在 合并了20個 單元 的區域中,也就是3-6行和2-6列。
sticky 這個參數用來确定:在插件正常尺寸下,如何配置設定 單元 中多餘的空間。具體如下。
  • 如果沒有聲明sticky屬性,預設将插件居中于 單元 中。
  • 通過設定 

    sticky=tk.NE

     (靠右上方),

    sticky=tk.SE

    (靠右下方),

    sticky=tk.SW

    (靠左下方),

    sticky=tk.NW

    (靠左上方),可以将插件布置在 單元 的某個角落。
  • 通過設定 

    sticky=tk.N

    (靠上方),

    sticky=tk.E

    (靠右方),

    sticky=tk.S

    (靠下方),

    sticky=tk.W

    (靠左方),可以将插件布置在 單元 的某個方向上。
  • 通過設定

    sticky=tk.N+tk.S

    ,在垂直方向上延伸插件,并保持水準居中。
  • 通過設定

    sticky=tk.E+tk.W

    ,在水準方向上延伸插件,并保持垂直居中。
  • 通過設定

    sticky=tk.N+tk.E+tk.W

    ,在水準和垂直方向上延伸插件,填滿 單元 。
  • 也可以使用其他的組合。比如,

    sticky=tk.N+tk.S+tk.W

    ,在垂直方向上延伸插件,并靠左布放。

注:.grid()方法翻譯自新墨西哥理工大學計算機中心

四、canvas畫布

1.  canvas屬性方法表

屬性和方法 說明
控制參數 background,簡稱bg 背景色
foreground,簡稱fg 前景色
borderwidth 邊框寬度
width 寬度
height 高度
bitmap 位圖
image 圖檔
方法 create_arc 繪制圓弧
create_bitmap 繪制位圖,支援xbmn格式
 create_image 繪制圖檔,支援gif格式
create_line 繪制直線
create_oval 繪制橢圓
create_ploygon 繪制多邊形
create_rectangle  繪制矩形
create_text 繪制文本框
create_window 繪制視窗
delete 删除繪制的圖形
itemconfig 修改圖形屬性
move 移動圖形,如move(1,4,5),1為圖像對象辨別,4為水準移動像素,5為垂直移動像素
coords 重新設定圖形位置
 update 重新整理畫布

2.  代碼執行個體(小房子) 

代碼執行個體

# coding=utf-8
import tkinter as tk      # 導入tkinter子產品

root = tk.Tk()            # 建立一個頂級視窗
root.title('小房子1')     # 設定标題
canvas = tk.Canvas(root, bg='white', width=700, height=700)   # 在root視窗上建立畫布canvas,白色背景,寬和高均為700像素
canvas.pack(anchor='center')   # canvas在root上居中顯示

points = [(50, 250), (350, 50), (650, 250)]   # 三角形頂點坐标位置
canvas.create_polygon(points, fill='gray', outline='black', width=10)   # 白色填充,紅色線條,線寬為10
canvas.create_rectangle((200, 250, 500, 550),
                        fill='white', outline='black', width=10)     # 繪制矩形,白色填充,綠色線條,線寬為10
canvas.create_oval((250, 300, 450, 500),
                   fill='yellow', outline='black', width=10)    # 繪制圓形,黃色填充,黃色線條,線寬為10

root.mainloop()   # 進入消息循環
           
運作結果
14.Python常用第三方庫—tkinter庫的使用

五、tkinter應用程式開發基本流程 

  1. 編寫通用代碼,例如資料庫操作、程式中需要多次調用的函數,這需要在編寫代碼之間對軟體的功能進行分析和整理,最終提煉出通用部分的代碼封裝成類或函數。
  2. 搭建界面,放置菜單、标簽、按鈕、輸入框、選擇框等元件,設定元件屬性。
  3. 編寫元件的事件處理代碼。
# 根據需要導入需要的子產品
import tkinter
import tkinter.ttk
import tkinter.messagebox
import tkinter.simpledialog

# 這裡編寫通用代碼,或單獨放置到另外的子產品中再導入

# 建立tkinter應用程式主視窗
root = tkinter.Tk()

# 此處編寫設定視窗屬性的代碼

# 此處編寫建立視窗上各種元件的代碼

# 以及按鈕、組合框等互動式元件的事件代碼

# 啟動消息主循環,啟動應用程式
root.mainloop()
           

六、tkinter代碼執行個體示範

個人介紹頁面代碼展示

#coding = utf-8
from tkinter import *
from tkinter.ttk import *
from tkinter import messagebox

'''全局變量的定義'''
# 頂層視窗
root = None
# 姓名和密碼Entry控件
entry_name, entry_pwd = None, None
# 性别、學曆控件綁定的值
sex, education = None, None
# 音樂、舞蹈控件綁定的值
music, dance = None, None
# 個人介紹Text控件綁定的值
text_remark = None

def radiobutton_clicked():
    '''
    Radiobutton單選按鈕控件點選觸發事件
    :return:
    '''
    global sex
    print("sex : " + str(sex.get()))

def checkbutton_clicked():
    '''
    Checkbutton多選按鈕點選觸發事件
    :return:
    '''
    global music, dance
    print("music : " + str(music.get()))
    print("dance : " + str(dance.get()))

def printInfo():
    '''
    擷取和列印頁面資訊
    :return:
    '''
    print("submit is called......")
    global entry_name, entry_pwd, text_remark, \
        sex, music, dance, education
    print('name : %s' % (entry_name.get()))
    print('pwd : %s' % (entry_pwd.get()))
    print('remark : %s' % (text_remark.get('0.0', 'end')))
    print('sex : %s' % (sex.get()))
    print('pwd : %s' % (entry_pwd.get()))
    print("education : %s" % (education.get()))

def close():
    '''
    關閉視窗
    :return:
    '''
    print("close is called......")
    global root
    root.quit()

def showDlg():
    '''
    顯示對話框
    :return:
    '''
    global entry_name
    messagebox.showinfo(title='對話框事例', message=entry_name.get())

def createUI():
    '''
    建立視窗和控件
    :return:
    '''
    global root, entry_name, entry_pwd, sex, \
        education, music, dance, text_remark
    root = Tk()
    root.title("Register")
    sex = IntVar()
    music = IntVar()
    dance = IntVar()
    sex.set(1)      # 1:男性, 2:女性
    music.set(1)    # 1:選中, 0:不選中
    dance.set(0)    # 1:選中, 0:不選中

    # frame_head,其父視窗為root
    frame_head = Frame(root)
    frame_head.pack(side=TOP, fill=BOTH, expand=YES)

    # frame_account,其父視窗為frame_head
    frame_account = Frame(frame_head)
    frame_account.grid(row=0, column=0)
    label_name = Label(frame_account, text='姓名:', width=10)
    label_name.grid(row=0, column=0, padx=10, pady=5)
    entry_name = Entry(frame_account, foreground='blue', width=28)
    entry_name.insert(0, '簡時刻')

    #entry_name.delete(3, END)
    entry_name.grid(row=0, column=1, padx=10, pady=5)
    label_pwd = Label(frame_account, text='密碼:', width=10)
    label_pwd.grid(row=1, column=0, padx=10, pady=5)
    entry_pwd = Entry(frame_account, show="*",foreground='red', width=28)
    entry_pwd.insert(0, '123456')
    entry_pwd.grid(row=1, column=1, padx=10, pady=5)
    label_sex = Label(frame_account, text='性别:', width=10)
    label_sex.grid(row=2, column=0, padx=10, pady=5)
    frame_sex = Frame(frame_account)
    frame_sex.grid(row=2, column=1, padx=10, pady=5)

    # 1:選中, 0:不選中
    radio_btn_m = Radiobutton(frame_sex, variable=sex, text='男', value=1,
                              command=radiobutton_clicked)
    radio_btn_m.grid(row=0, column=0, padx=20, pady=5)
    radio_btn_f = Radiobutton(frame_sex, variable=sex, text='女', value=2,
                              command=radiobutton_clicked)
    radio_btn_f.grid(row=0, column=1, padx=20, pady=5)

    # frame_image,其父視窗為frame_head
    frame_image= Frame(frame_head)
    frame_image.grid(row=0, column=1)
    bm = PhotoImage(file="男孩.png")
    label_image = Label(frame_image,image=bm)
    label_image.bm = bm
    label_image.grid(row=0,column=1, padx=10, pady=5)

    # frame_info,其父視窗為root
    frame_info = Frame(root)
    frame_info.pack(side=TOP, fill=BOTH, expand=YES)
    label_education = Label(frame_info, text='學曆:', width=10)
    label_education.grid(row=1, column=0, padx=10, pady=5)
    education = StringVar()
    comb_education = Combobox(frame_info,
                              textvariable=education, width=40)
    comb_education.grid(row=1, column=1, padx=10, pady=5)
    comb_education['value'] = ['專科','大學','碩士','博士']
    comb_education.current(2)
    label_hobby = Label(frame_info, text='愛好:', width=10)
    label_hobby.grid(row=2, column=0, padx=10, pady=5)
    frame_hobby = Frame(frame_info, width=40)
    frame_hobby.grid(row=2, column=1, padx=10, pady=5)
    check_btn_music = Checkbutton(frame_hobby, text='程式設計',
                                  variable=music,
                                  command=checkbutton_clicked)
    check_btn_music.grid(row=0, column=0, padx=20, pady=5)
    check_btn_dance = Checkbutton(frame_hobby, text='閱讀',
                                  variable=dance,
                                  command=checkbutton_clicked)
    check_btn_dance.grid(row=0, column=1, padx=20, pady=5)
    check_btn_music = Checkbutton(frame_hobby, text='遊戲',
                                  variable=music,
                                  command=checkbutton_clicked)
    check_btn_music.grid(row=0, column=2, padx=20, pady=5)

    # frame_remark,其父視窗是root
    frame_remark = Frame(root)
    frame_remark.pack(side=TOP, fill=BOTH, expand=YES)
    text_remark = Text(frame_remark, width=55,
                     height=5, foreground='green')
    text_remark.insert(1.0, '1. 簡時刻就讀于廣州大學教育技術學專業\n')
    text_remark.insert(2.0, '2. 大二參加網際網路比賽以及挑戰杯\n')
    text_remark.insert(3.0, '3. 大三考取計算機二級office、python和教師資格證書\n')
    text_remark.insert(4.0, '4. 目前正在學習Python,水準菜鳥入門級')
    text_remark.grid(row=0, column=0, padx=10, pady=5)

    # frame_btn,其父視窗為root
    frame_btn = Frame(root, width=40)
    frame_btn.pack(side=BOTTOM, fill=BOTH, expand=YES)
    btn_submit = Button(frame_btn, text='擷取資訊', command=printInfo)
    btn_submit.grid(row=0, column=0, padx=20, pady=10)
    btn_quit = Button(frame_btn, text='關閉視窗', command=close)
    btn_quit.grid(row=0, column=1, padx=20, pady=10)
    btn_dlg = Button(frame_btn, text='對話框', command=showDlg)
    btn_dlg.grid(row=0,column=2, padx=20, pady=10)
    root.mainloop()

if __name__ == '__main__':
    createUI()
           

運作結果

14.Python常用第三方庫—tkinter庫的使用
14.Python常用第三方庫—tkinter庫的使用