
圖形用戶界面GUI12.1 GUI 概述12.1.1 什么是 GUIGUIGraphical User Interface圖形用戶界面是程序與用戶交互的一種方式通過窗口、按鈕、文本框、菜單等可視化控件來接收用戶輸入和顯示輸出相比命令行界面CLI更直觀、更友好。12.1.2 Python 的 GUI 工具包本章介紹Tkinter因為它是 Python 自帶的開箱即用。12.2 第一個 Tkinter 程序12.2.1 創建主窗口import tkinter as tk # 創建主窗口 root tk.Tk() root.title(我的第一個GUI程序) # 進入主事件循環 root.mainloop()代碼解讀tk.Tk()創建主窗口對象title()設置窗口標題mainloop()進入事件循環等待用戶操作點擊、按鍵等12.2.2 添加控件import tkinter as tk root tk.Tk() root.title(按鈕示例) # 創建按鈕控件 btn tk.Button() btn[text] 點擊我 # 設置按鈕文本 btn.pack() # 布局——將按鈕放入窗口 root.mainloop()代碼解讀Button()創建按鈕控件pack()布局管理器將控件放入窗口控件的屬性可以像字典一樣訪問和修改12.2.3 添加事件響應import tkinter as tk def on_click(): print(按鈕被點擊了) root tk.Tk() root.title(事件響應示例) btn tk.Button() btn[text] 點擊我 btn[command] on_click # 綁定點擊事件 btn.pack() root.mainloop()代碼解讀command屬性綁定按鈕被點擊時調用的函數點擊按鈕時on_click()函數自動執行12.2.4 使用構造函數配置import tkinter as tk def on_click(): print(按鈕被點擊了) root tk.Tk() root.title(簡潔寫法) # 在創建時直接配置屬性 btn tk.Button(text點擊我, commandon_click) btn.pack() root.mainloop()12.2.5 使用config()方法import tkinter as tk root tk.Tk() btn tk.Button() btn.config(text點擊我, commandlambda: print(Clicked!)) btn.pack() root.mainloop()12.3 常用控件12.3.1 標簽Labelimport tkinter as tk root tk.Tk() root.title(標簽示例) # 創建文本標簽 label tk.Label(text這是一個標簽, font(Arial, 16), fgblue) label.pack() root.mainloop()12.3.2 文本框EntryEntry用于輸入單行文本。import tkinter as tk def show_text(): print(entry.get()) # 獲取輸入框內容 root tk.Tk() root.title(輸入框示例) entry tk.Entry() entry.pack() btn tk.Button(text提交, commandshow_text) btn.pack() root.mainloop()12.3.3 文本區域Text / ScrolledTextText用于多行文本輸入ScrolledText自帶滾動條。import tkinter as tk from tkinter.scrolledtext import ScrolledText root tk.Tk() root.title(文本區域示例) # 創建可滾動文本區域 text_area ScrolledText(height10, width40) text_area.pack() def get_text(): content text_area.get(1.0, tk.END) # 獲取全部文本 print(content) btn tk.Button(text獲取內容, commandget_text) btn.pack() root.mainloop()get()方法的參數1.0第1行第0列文件開頭tk.END文本末尾tk.INSERT當前光標位置12.3.4 按鈕Buttonimport tkinter as tk root tk.Tk() # 創建帶文字和顏色的按鈕 btn1 tk.Button(text普通按鈕, bglightblue) btn1.pack() # 創建帶圖標的按鈕需要圖像文件 # img tk.PhotoImage(fileicon.png) # btn2 tk.Button(text帶圖標, imageimg, compoundleft) # btn2.pack() root.mainloop()12.4 布局管理器布局管理器決定控件在窗口中的位置和大小。12.4.1pack()—— 堆疊布局pack()將控件依次堆疊在窗口中。import tkinter as tk root tk.Tk() # 默認從上到下排列 tk.Button(text按鈕1).pack() tk.Button(text按鈕2).pack() tk.Button(text按鈕3).pack() root.mainloop()常用參數# 水平排列 tk.Button(text左, bgred).pack(sidetk.LEFT, padx5) tk.Button(text中, bggreen).pack(sidetk.LEFT, padx5) tk.Button(text右, bgblue).pack(sidetk.LEFT, padx5) # 填充和擴展 tk.Button(text填充).pack(filltk.X, expandTrue)12.4.2grid()—— 網格布局grid()將控件放在表格網格中適合復雜布局。import tkinter as tk root tk.Tk() # 創建標簽和輸入框對 tk.Label(text用戶名).grid(row0, column0, stickye) tk.Entry().grid(row0, column1) tk.Label(text密碼).grid(row1, column0, stickye) tk.Entry().grid(row1, column1) tk.Button(text登錄).grid(row2, column0, columnspan2) root.mainloop()常用參數12.4.3place()—— 絕對定位place()直接指定控件的精確位置不推薦在不同分辨率下顯示效果差。import tkinter as tk root tk.Tk() root.geometry(300x200) tk.Button(text精確位置).place(x100, y80, width100, height30) root.mainloop()12.5 事件處理12.5.1 使用bind()綁定事件除了command屬性外Tkinter 提供bind()方法綁定更廣泛的事件。import tkinter as tk def on_click(event): print(f鼠標點擊位置({event.x}, {event.y})) root tk.Tk() root.geometry(400x300) root.bind(Button-1, on_click) # 左鍵點擊 root.mainloop()12.5.2 常見事件12.5.3 事件對象屬性def on_event(event): print(f控件{event.widget}) print(fX坐標{event.x}) print(fY坐標{event.y}) print(f按鍵{event.keysym}) print(f字符{event.char})12.5.4 鍵盤事件示例import tkinter as tk root tk.Tk() def on_key(event): if event.keysym Escape: root.quit() else: print(f按下了{event.keysym}) root.bind(Key, on_key) root.focus_set() # 讓窗口獲得焦點 root.mainloop()12.6 綜合示例簡單的文本編輯器下面是一個包含打開文件、保存文件、編輯文本功能的簡單 GUI 文本編輯器。import tkinter as tk from tkinter.scrolledtext import ScrolledText from tkinter import messagebox class SimpleEditor: 簡單的文本編輯器 def __init__(self): self.root tk.Tk() self.root.title(簡易文本編輯器) # 文件名輸入框 self.filename tk.Entry(self.root) self.filename.pack(sidetk.LEFT, expandTrue, filltk.X, padx5, pady5) # 工具欄 toolbar tk.Frame(self.root) toolbar.pack(sidetk.TOP, filltk.X) tk.Button(toolbar, text打開, commandself.open_file).pack(sidetk.LEFT, padx2) tk.Button(toolbar, text保存, commandself.save_file).pack(sidetk.LEFT, padx2) # 文本編輯區域 self.text_area ScrolledText(self.root, height20) self.text_area.pack(expandTrue, filltk.BOTH, padx5, pady5) self.root.mainloop() def open_file(self): 打開文件并顯示內容 filename self.filename.get().strip() if not filename: messagebox.showwarning(警告, 請輸入文件名) return try: with open(filename, r, encodingutf-8) as f: content f.read() self.text_area.delete(1.0, tk.END) # 清空 self.text_area.insert(tk.INSERT, content) # 插入內容 except FileNotFoundError: messagebox.showerror(錯誤, f文件 {filename} 不存在) except Exception as e: messagebox.showerror(錯誤, f讀取文件失敗{e}) def save_file(self): 保存當前內容到文件 filename self.filename.get().strip() if not filename: messagebox.showwarning(警告, 請輸入文件名) return try: content self.text_area.get(1.0, tk.END) with open(filename, w, encodingutf-8) as f: f.write(content) messagebox.showinfo(成功, 文件已保存) except Exception as e: messagebox.showerror(錯誤, f保存文件失敗{e}) if __name__ __main__: SimpleEditor()運行效果頂部輸入框輸入文件名點擊打開加載文件內容到文本區域編輯后點擊保存寫入文件12.7 對話框12.7.1 消息框from tkinter import messagebox # 信息提示 messagebox.showinfo(標題, 這是一條信息) # 警告 messagebox.showwarning(標題, 這是一條警告) # 錯誤 messagebox.showerror(標題, 發生錯誤) # 詢問返回 yes 或 no result messagebox.askyesno(確認, 確定要刪除嗎) if result: print(用戶確認) else: print(用戶取消) # 選擇返回 ok 或 cancel result messagebox.askokcancel(確認, 確定要繼續嗎)12.7.2 文件選擇對話框from tkinter import filedialog # 選擇文件打開 filename filedialog.askopenfilename( title選擇文件, filetypes[(文本文件, *.txt), (所有文件, *.*)] ) # 選擇文件保存 filename filedialog.asksaveasfilename( title保存文件, defaultextension.txt, filetypes[(文本文件, *.txt), (所有文件, *.*)] ) # 選擇目錄 dirname filedialog.askdirectory(title選擇目錄)12.7.3 顏色選擇對話框from tkinter import colorchooser color colorchooser.askcolor(title選擇顏色) # 返回 ((r, g, b), #rrggbb) 或 None if color: print(color[1]) # #ff0000