Python學習筆記-第6天:初涉GUI編程

第六天 初涉GUI編程

在web編程的主流時代,GUI用的確實不多。學習這一塊的目的計劃承上啟下,鞏固下面向?qū)ο缶幊?。學習項目及練習源碼地址:
GitHub源碼

關于Pytgon GUI

在昨天的學習內(nèi)容里面有提及常用的幾個GUI框架。

圖形用戶界面是由一個個組件組成,就像小孩“搭積木”一樣最終組成了整個界面。有的組件還能在里面再放置其他組件,我們稱為“容器”。

Tkinter編寫一個GUI程序

一般步驟:

  • 創(chuàng)建應用程序主窗口對象(也稱:根窗口)

  • 在主窗口中,添加各種可視化組件,比如:按鈕(Button)、文本框(Label)等

  • 通過幾何布局管理器,管理組件的大小和位置

  • 事件處理

    在組件上綁定各種用戶事件。如:按鈕點擊

    from tkinter import * # 最好不要這樣導入所有
    from tkinter import messagebox # 為什么要這樣導入一次,前面已經(jīng)有*了?
    
    def btn_click(e):
        messagebox.showinfo("Message","按鈕點擊!")
        print("點擊了按鈕")
    
    root = Tk(screenName="Hello World")
    root.title("GUI開發(fā)練習") # 設置標題
    root.geometry("500x400+100+200") # 設置畫布大小
    btn001 = Button(root)
    btn001['text'] = "按鈕一"
    btn001.bind("<Button-1>",btn_click) 
    
    btn001.pack() # 將按鈕放在畫布上
    
    root.mainloop() # 不這樣窗口打開后自動關閉
    

Tkinter常用類介紹

Misc和Wm:

Tkinter的GUI組件有兩個根父類,它們都直接繼承了object類:

  1. Misc:它是所有組件的根父類。
  2. Wm:它主要提供了一些與窗口管理器通信的功能函數(shù)。

Tk

Misc和Wm派生出子類Tk,它代表應用程序的主窗口。一般應用程序都需要直接或間
接使用Tk。

Pack、Place、Grid

Pack、Place、Grid 是布局管理器。布局管理器管理組件的:大小、位置。通過布局管 理器可以將容器中的組件實現(xiàn)合理的排布。

BaseWidget

BaseWidget 是所有組件的父類

Widget

Widget是所有組件類的父類。Widget一共有四個父類:BaseWidget、Pack、Grid、
Place。意味著,所有GUI組件同時具備這四個父類的屬性和方法。

GUI應用程序類的經(jīng)典寫法

使用面向?qū)ο蟮姆绞剑梢愿雍侠淼慕M織GUI應用程序的代碼。
通過一個App類組織整個GUI程序,類App繼承了Frame(一個容器組件)及通過繼承擁有了父類的特性。通過構造函數(shù) __init__()初始化窗口中的對象,通過createWidgets()方法創(chuàng)建窗口中的對象。示例代碼

Label標簽組件

Label(標簽)主要用于顯示文本信息,也可以顯示圖像。
如果顯示是圖像,則以像素為單位。默認值是根據(jù)具體顯示的內(nèi)容動態(tài)調(diào)整。

Options選項

可以通過Options設置組件的屬性,從而控制組件的各種狀態(tài)。比如:寬度、高度、顏色、位置等等。
我們可以通過三種方式設置Options選項,這在各種GUI組件中用法都一致。

  • 創(chuàng)建對象時,使用可變參數(shù)

    btn = Button(self, fg="red", bg="blue")

  • 創(chuàng)建對象后,使用字典索引方式

    btn = Button(self)
    btn['fg'] = "red"
    btn['bg'] = "blue"
    
  • 創(chuàng)建對象后,使用 config()方法

    btn = Button(self)
    btn.config(fg="red", bg="blue")
    

常見組件屬性一覽

選項名(別名) 含義
activebackground 指定組件處于激活狀態(tài)時的背景色
activeforeground 指定組件處于激活狀態(tài)時的前景色
anchor 指定組件內(nèi)的信息(比如文本或圖片)在組件中如何顯示(當所在組件比信息大時,可以看出效果)。必須為下面的值之一:N、NE、E、SE、S、SW W、NW 或 CENTER。比如 NW(NorthWest)指定將信息顯示在組件的左上角
background(bg) 指定組件正常顯示時的背景色
bitmap 指定在組件上顯示該選項指定的位圖,該選項值可以是Tk_GetBitmap接收的任何形式的位圖。位圖的顯示方式受anchor、justify選項的影響。如果同時指定了bitmap和text,那么 bitmap 覆蓋文本;如果同時指定了bitmap和image,那么image覆bitmap
borderwidth 指定組件正常顯示時的 3D 邊框的寬度,該值可以是 Tk_GetPixels 接收的任 何格式
cursor 指定光標在組件上的樣式。該值可以是 Tk_GetCursors 接受的任何格式
command 指定按組件關聯(lián)的命令方法,該方法通常在鼠標離開組件時被觸發(fā)調(diào)用
disabledforeground 指定組件處于禁用狀態(tài)時的前景色
font 指定組件上顯示的文本字體
foreground(fg) 指定組件正常顯示時的前景色
highlightbackground 指定組件在高亮狀態(tài)下的背景色
highlightcolor 指定組件在高亮狀態(tài)下的前景色
highlightthickness 指定組件在高亮狀態(tài)下的周圍方形區(qū)域的寬度,該值可以是 Tk_GetPixels 接收的任何格式
height 指定組件的高度,以 font 選項指定的字體的字符高度為單位,至少為 1
image 指定組件中顯示的圖像,如果設置了 image 選項,它將會覆蓋 text、bitmap 選項
justify 指定組件內(nèi)部內(nèi)容的對齊方式,該選項支持 LEFT(左對齊)、CENTER(居 中對齊)或 RIGHT(右對齊)這三個值
padx 指定組件內(nèi)部在水平方向上兩邊的空白,該值可以是 Tk_GctPixels接收的任何格式
pady 指定組件內(nèi)部在垂直方向上兩地的空白,該值可以是 Tk_GctPixels接收的任何格式指定組件的 3D 效果,該選項支持的值包括 RAISED、SUNKEN、FLAT、 relief RIDGE、SOLID、GROOVE。該值指出組件內(nèi)部相對于外部的外觀樣式,比如 RAISED 表示組件內(nèi)部相對于外部凸起
selectbackground 指定組件在選中狀態(tài)下的背景色
selectborderwidth 指定組件在選中狀態(tài)下的3D邊框的寬度,該值可以是Tk_GetPixels接收的任何格式
selectforeground 指定組在選中狀態(tài)下的前景色
state 指定組件的當前狀態(tài)。該選項支持 NORMAL(正常)、DISABLE(禁用) 這兩個值
takefocus 指定組件在鍵盤遍歷(Tab 或 Shift+Tab)時是否接收焦點,將該選項設為 1 表示接收焦點;設為 0 表示不接收焦點
text 指定組件上顯示的文本,文本顯示格式由組件本身、anchor 及 justify 選 項決定
textvariable 指定一個變量名,GUI 組件負責顯示該變量值轉(zhuǎn)換得到的字符串,文本顯 示格式由組件本身、anchor 及 justify 選項決定
underline 指定為組件文本的第幾個字符添加下畫線,該選項就相當于為組件綁定了 快捷鍵
width 指定組件的寬度,以 font 選項指定的字體的字符高度為單位,至少為 1
wraplength 對于能支持字符換行的組件,該選項指定每行顯示的最大字符數(shù),超過該

Button組件

Button(按鈕)用來執(zhí)行用戶的單擊操作。Button可以包含文本,也可以包含圖像。按鈕被單擊后會自動調(diào)用對應事件綁定的方法。

Entry單行文本框

Entry用來接收一行字符串的控件。如果用戶輸入的文字長度長于Entry控件的寬度時, 文字會自動向后滾動

Text多行文本框

Text(多行文本框)的主要用于顯示多行文本,還可以顯示網(wǎng)頁鏈接, 圖片, HTML頁面, 甚至 CSS 樣式表,添加組件等。因此,也常被當做簡單的文本處理器、文本編輯器或者 網(wǎng)頁瀏覽器來使用。

Radiobutton單選按鈕

Checkbutton復選按鈕

canvas畫布

canvas(畫布)是一個矩形區(qū)域,可以放置圖形、圖像、 組件等。

布局管理器

tkinter提供的布局管理器幫助組織、管理在父組件中子組件的布局方式。tkinter提供了三種管理器:pack、grid、place。

grid布局管理器

grid表格布局,采用表格結構組織組件。子組件的位置由
行和列的單元格來確定,并且可以跨行和跨列,從而實現(xiàn)復
雜的布局

pack布局管理器

pack按照組件的創(chuàng)建順序?qū)⒆咏M件添加到父組件中,按照垂直或者水平的方向自然排布。如果不指定任何選項,默認在父組件中自頂向下垂直添加組件。

place 布局管理器

place 布局管理器可以通過坐標精確控制組件的位置,適用
于一些布局更加靈活的場景

事件處理

一個GUI應用整個生命周期都處在一個消息循環(huán) (event
loop) 中。它等待事件的發(fā)生,并作出相應的處理。
Tkinter提供了用以處理相關事件的機制. 處理函數(shù)可被綁 定給各個控件的各種事件。
widget.bind(event, handler)
如果相關事件發(fā)生, handler函數(shù)會被觸發(fā), 事件對象
event會傳遞給handler函數(shù).

組件對象的綁定

  1. 通過command屬性綁定(適合簡單不需獲取event對象)

    Button(root,text=”登錄”,command=login)

  2. 通過 bind()方法綁定(適合需要獲取 event 對象)

    c1 = Canvas(); 
    c1.bind(“<Button-1>”,drawLine)
    

組件類的綁定

調(diào)用對象的bind_class函數(shù),將該組件類所有的組件綁定事件:

w.bind_class(“Widget”,”event”,eventhanler)

菜單和工具欄

主菜單

主菜單一般包含:文件、編輯、幫助等,位于GUI窗口的上面。創(chuàng)建主菜單一般有如下4步:

  1. 創(chuàng)建主菜單欄對象

    menubar = tk.Menu(root)

  2. 創(chuàng)建菜單,并添加到主菜單欄對象

     file_menu = tk.Menu(menubar)
     menubar.add_cascade(label=”文件”,menu=file_menu) 
    
  3. 添加菜單項到 2 步中的菜單

    file_menu.add_command(label=”打開”)
    file_menu.add_command(label=”保 存”,accelerator=”^p command=mySaveFile)
    file_menu.add_separator()
    file_menu.add_command(label=”退出”) 
    
  4. 將主菜單欄添加到根窗口

    root[“menu”]=menubar

上下文菜單

快捷菜單(上下文菜單)是通過鼠標右鍵單擊組件而彈出的菜單,一般是和這個組件相關的操作,比如:剪切、復制、粘貼、屬性等。

  1. 創(chuàng)建菜單

    menubar = tk.Menu(root) 
    menubar.add_command(label=”字體”)
    
  2. 綁定鼠標右鍵單擊事件

    def test(event):
        menubar.post(event.x_root,event.y_root) #在鼠標右鍵單擊坐標處顯示菜單
    root.bind(“<Button-3>”,test) # 在窗體綁定事件
    

其他組件

OptionMenu選擇項

OptionMenu(選擇項)用來做多選一,選中的項會在頂部顯
示。

Scale移動滑塊

Scale(移動滑塊)用于在指定的數(shù)值區(qū)間,通過滑塊的移動來選擇值

顏色選擇框

顏色選擇框可以用來設置背景色、前景色、畫筆顏色、字體顏色等等。

文件對話框

文件對話框幫助我們實現(xiàn)可視化的操作目錄、操作文件。最后,將文件、目錄的信息傳入到程序中。

簡單輸入對話框

simpledialog(簡單對話框)

通用消息框

messagebox(通用消息框)用于和用戶簡單的交互,用戶點擊確定、取消。

項目實戰(zhàn)練習

編寫一個記事本程序

需求分析

模仿windows的記事本,實現(xiàn)新建、保存等功能。

  • 需要一個主菜單
  • 需要一個右鍵菜單
  • 最好能響應快捷

詳細設計

練習代碼

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容