Python GUI編程詳解
Python GUI編程
0.創(chuàng)建窗口
import tkinter as tk #創(chuàng)建一個(gè)窗口 root = tk.Tk() root.mainloop() # 第2步,給窗口的可視化起名字 root.title('My Window') # 設(shè)置窗口最小和最大 root.minsize(300,300) root.maxsize(500,500)
1.Label和Button的使用
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:洪衛(wèi) import tkinter as tk # 使用Tkinter前需要先導(dǎo)入 # 第1步,實(shí)例化object,建立窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬) window.geometry('500x300') # 這里的乘是小x # 第4步,在圖形界面上設(shè)定標(biāo)簽 var = tk.StringVar() # 將label標(biāo)簽的內(nèi)容設(shè)置為字符類型,用var來接收hit_me函數(shù)的傳出內(nèi)容用以顯示在標(biāo)簽上 l = tk.Label(window, textvariable=var, bg='green', fg='white', font=('Arial', 12), width=30, height=2) # 說明: bg為背景,fg為字體顏色,font為字體,width為長(zhǎng),height為高,這里的長(zhǎng)和高是字符的長(zhǎng)和高,比如height=2,就是標(biāo)簽有2個(gè)字符這么高 l.pack() # 定義一個(gè)函數(shù)功能(內(nèi)容自己自由編寫),供點(diǎn)擊Button按鍵時(shí)調(diào)用,調(diào)用命令參數(shù)command=函數(shù)名 on_hit = False def hit_me(): global on_hit if on_hit == False: on_hit = True var.set('you hit me') else: on_hit = False var.set('') # 第5步,在窗口界面設(shè)置放置Button按鍵 b = tk.Button(window, text='hit me', font=('Arial', 12), width=10, height=1, command=hit_me) b.pack() # 第6步,主窗口循環(huán)顯示 window.mainloop()
2.Entry和Text的使用
Entry是tkinter類中提供的的一個(gè)單行文本輸入域,用來輸入顯示一行文本,收集鍵盤輸入(類似 HTML 中的 text)。
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:洪衛(wèi) import tkinter as tk # 使用Tkinter前需要先導(dǎo)入 # 第1步,實(shí)例化object,建立窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬) window.geometry('500x300') # 這里的乘是小x # 第4步,在圖形界面上設(shè)定輸入框控件entry并放置控件 e1 = tk.Entry(window, show='*', font=('Arial', 14)) # 顯示成密文形式 e2 = tk.Entry(window, show=None, font=('Arial', 14)) # 顯示成明文形式 e1.pack() e2.pack() # 第5步,主窗口循環(huán)顯示 window.mainloop()
Text是tkinter類中提供的的一個(gè)多行文本區(qū)域,顯示多行文本,可用來收集(或顯示)用戶輸入的文字(類似 HTML 中的 textarea),格式化文本顯示,允許你用不同的樣式和屬性來顯示和編輯文本,同時(shí)支持內(nèi)嵌圖象和窗口。
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:洪衛(wèi) import tkinter as tk # 使用Tkinter前需要先導(dǎo)入 # 第1步,實(shí)例化object,建立窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬) window.geometry('500x300') # 這里的乘是小x # 第4步,在圖形界面上設(shè)定輸入框控件entry框并放置 e = tk.Entry(window, show=None) # 顯示成明文形式 e.pack() # 第5步,定義兩個(gè)觸發(fā)事件時(shí)的函數(shù)insert_point和insert_end(注意:因?yàn)镻ython的執(zhí)行順序是從上往下,所以函數(shù)一定要放在按鈕的上面) def insert_point(): # 在鼠標(biāo)焦點(diǎn)處插入輸入內(nèi)容 var = e.get() t.insert('insert', var) def insert_end(): # 在文本框內(nèi)容最后接著插入輸入內(nèi)容 var = e.get() t.insert('end', var) # 第6步,創(chuàng)建并放置兩個(gè)按鈕分別觸發(fā)兩種情況 b1 = tk.Button(window, text='insert point', width=10, height=2, command=insert_point) b1.pack() b2 = tk.Button(window, text='insert end', width=10, height=2, command=insert_end) b2.pack() # 第7步,創(chuàng)建并放置一個(gè)多行文本框text用以顯示,指定height=3為文本框是三個(gè)字符高度 t = tk.Text(window, height=3) t.pack() # 第8步,主窗口循環(huán)顯示 window.mainloop()
Entry.get()
獲取輸入的文本內(nèi)容。
Text.insert(‘insert',content)
鼠標(biāo)焦點(diǎn)處插入內(nèi)容
Text.insert(‘end',content)
末尾插入內(nèi)容。
3.Grid網(wǎng)格布局
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:洪衛(wèi) import tkinter as tk # 使用Tkinter前需要先導(dǎo)入 # 第1步,實(shí)例化object,建立窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬) window.geometry('500x300') # 這里的乘是小x # 第4步,grid 放置方法 for i in range(3): for j in range(3): tk.Label(window, text='('+str(i)+','+str(j)+')').grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10) # 第5步,主窗口循環(huán)顯示 window.mainloop()
4.Frame框架
Frame
:框架,用來承載放置其他GUI元素,就是一個(gè)容器,是一個(gè)在 Windows 上分離小區(qū)域的部件, 它能將 Windows 分成不同的區(qū),然后存放不同的其他部件. 同時(shí)一個(gè) Frame 上也能再分成兩個(gè) Frame, Frame 可以認(rèn)為是一種容器.
#!/usr/bin/env python # -*- coding: utf-8 -*- # author:洪衛(wèi) import tkinter as tk # 使用Tkinter前需要先導(dǎo)入 # 第1步,實(shí)例化object,建立窗口window window = tk.Tk() # 第2步,給窗口的可視化起名字 window.title('My Window') # 第3步,設(shè)定窗口的大小(長(zhǎng) * 寬) window.geometry('500x300') # 這里的乘是小x # 第4步,在圖形界面上創(chuàng)建一個(gè)標(biāo)簽用以顯示內(nèi)容并放置 tk.Label(window, text='on the window', bg='red', font=('Arial', 16)).pack() # 和前面部件分開創(chuàng)建和放置不同,其實(shí)可以創(chuàng)建和放置一步完成 # 第5步,創(chuàng)建一個(gè)主frame,長(zhǎng)在主window窗口上 frame = tk.Frame(window) frame.pack() # 第6步,創(chuàng)建第二層框架frame,長(zhǎng)在主框架frame上面 frame_l = tk.Frame(frame) # 第二層frame,左frame,長(zhǎng)在主frame上 frame_r = tk.Frame(frame) # 第二層frame,右frame,長(zhǎng)在主frame上 frame_l.pack(side='left') frame_r.pack(side='right') # 第7步,創(chuàng)建三組標(biāo)簽,為第二層frame上面的內(nèi)容,分為左區(qū)域和右區(qū)域,用不同顏色標(biāo)識(shí) tk.Label(frame_l, text='on the frame_l1', bg='green').pack() tk.Label(frame_l, text='on the frame_l2', bg='green').pack() tk.Label(frame_l, text='on the frame_l3', bg='green').pack() tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack() tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack() tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack() # 第8步,主窗口循環(huán)顯示 window.mainloop()
關(guān)于邊距
padx,pady
外邊距水平方向和垂直方向。
ipadx,ipady
內(nèi)邊距。
padx=10
,表示左右邊距為10像素。
padx=(10,20)
表示左邊距10,右邊距20.
//www.jb51.net/article/224752.htm
5.messagebox消息框
import tkinter as tk from tkinter import messagebox if __name__ == '__main__': def LoginButton(): u = rt.username.get() p = rt.password.get() if len(u) == 0 or len(p) == 0: messagebox.showerror('提示:', '輸入信息為空') else: messagebox.showinfo('提示:', '用戶名: %s\n密碼為: %s\n' % (u, p)) # 主窗口 rt = tk.Tk() rt.geometry('300x300') # 變量 rt.username = tk.StringVar() rt.password = tk.StringVar() # 賬號(hào) f1 = tk.Frame(rt) tk.Label(f1, text='賬號(hào): ').grid(row=0, column=0, padx=30) tk.Entry(f1, textvariable=rt.username).grid(row=0, column=1) f1.grid(pady=50) # 密碼 f2 = tk.Frame(rt) tk.Label(f2, text='密碼: ').grid(row=1, column=0, padx=30) tk.Entry(f2, show='*', textvariable=rt.password).grid(row=1, column=1) f2.grid() # 登錄按鈕 tk.Button(rt, text='登錄', command=LoginButton).grid(pady=30) rt.mainloop()
6.下拉框
def GetIdentity(*args): identity = rt.identity.get() print(identity) # 身份下拉框 f0 = tk.Frame(rt) tk.Label(f0, text='身份: ').grid(row=0, column=0, padx=(5,30)) identityBox = ttk.Combobox(f0, textvariable=rt.identity, values=['管理員', '用戶', '其他'],width=10) identityBox.grid(row=0, column=1) identityBox.current(1) identityBox.bind("<<ComboboxSelected>>", GetIdentity) f0.grid(padx=0,pady=20)
7.Menu菜單
創(chuàng)建一個(gè)頂級(jí)菜單,你需要先創(chuàng)建一個(gè)菜單實(shí)例,然后使用 add() 方法將命令和其它子菜單添加進(jìn)去:
import tkinter as tk root = tk.Tk() def callback(): print("~被調(diào)用啦~") #創(chuàng)建一個(gè)頂級(jí)菜單 menubar = tk.Menu(root) menubar.add_command(label = "Hello", command = callback) menubar.add_command(label = "Quit", command = root.quit) #顯示菜單 root.config(menu = menubar) root.mainloop()
2.創(chuàng)建一個(gè)下拉菜單(或者其他子菜單),方法也是大同小異,最主要的區(qū)別是它們最后需要添加到主菜單上(而不是窗口上):
import tkinter as tk root = tk.Tk() def callback(): print("~被調(diào)用了~") # 創(chuàng)建一個(gè)頂級(jí)菜單 menubar = tk.Menu(root) # 創(chuàng)建一個(gè)下拉菜單“文件”,然后將它添加到頂級(jí)菜單中 filemenu = tk.Menu(menubar, tearoff=False) filemenu.add_command(label="打開", command=callback) filemenu.add_command(label="保存", command=callback) filemenu.add_separator() filemenu.add_command(label="退出", command=root.quit) menubar.add_cascade(label="文件", menu=filemenu) # 創(chuàng)建另一個(gè)下拉菜單“編輯”,然后將它添加到頂級(jí)菜單中 editmenu = tk.Menu(menubar, tearoff=False) editmenu.add_command(label="剪切", command=callback) editmenu.add_command(label="拷貝", command=callback) editmenu.add_command(label="粘貼", command=callback) menubar.add_cascade(label="編輯", menu=editmenu) # 顯示菜單 root.config(menu=menubar) root.mainloop()
//www.jb51.net/article/224757.htm
項(xiàng)目學(xué)習(xí)、
1.點(diǎn)名器
a.導(dǎo)航欄
頂級(jí)菜單分為兩個(gè)子菜單:菜單和導(dǎo)入人名列表。
子菜單三個(gè)功能:刪除庫,退出,顯示作者。
b.主體
用一個(gè)Label 表示提示信息(請(qǐng)導(dǎo)入人名列表,請(qǐng)選擇人數(shù))
然后三個(gè)Label分別顯示選擇幾個(gè)人,三個(gè)Button按鈕。
清零按鈕用來清屏三個(gè)Label。
c.邏輯
運(yùn)行程序,先檢查是否當(dāng)前工作目錄下是否有文件庫.txt(人名數(shù)據(jù)表)
沒有提示導(dǎo)入,然后點(diǎn)擊導(dǎo)入,會(huì)在工作目錄下生成一個(gè)庫.txt。
點(diǎn)對(duì)應(yīng)的生成按鈕,利用random函數(shù)從人名表中生成。
總結(jié)
本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關(guān)注本站的更多內(nèi)容!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非www.sddonglingsh.com所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。