from tkinter import *
#創建窗口
root = Tk()
#標題
root.title("簽名設計")
#窗口大小
root.geometry('600x300')
#窗口位置
root.geometry('+500+300')
#標簽控件
label = Label(root,text="簽名",font = ('華文行楷',20,fg='red')
#grid網格布局
label,grid(row=0,column=0)
#輸入框
entry = Entry(root,font=('微軟雅黑',20))
entry = grid(row=0,column=1)
#點擊按鈕
button = Button(root,text='設計簽名',font=('微軟雅黑',20))
button['width']=25
button['height']=1
button.grid(row=1,column=1,sticky=E) #W左對齊,E右對齊
tkinter使用
作為 Python 開發者,圖形用戶界面(GUI)開發是必備技能之一。目前,市面上支持
Python 的“GUI 工具包”很多,各有特點,雖然大多數工具包的基礎類似,但要學習一個
新包並掌握其細節還是非常耗時的,因此,在選用工具包時應仔細權衡。本文將介紹
Python 自帶的 GUI 工具包 TKinter。
TKinter
Python 的 GUI 庫非常多,之所以選擇 Tkinter,一是最為簡單,二是自帶庫,不需下載
安裝,隨時使用,跨平台兼容性非常好,三則是從需求出發的,Python 在實際應用中極
少用於開發復雜的桌面應用,畢竟,Python 的各種 GUI 工具包都“一般得很”,不具備優
勢。
關於 GUI,泛泛而談難免枯燥,鑒於此,本文將基於一系列實例來介紹 Tkinter 控件。
窗口創建與布局
做界面,首先需要創建一個窗口,Python Tkinter 創建窗口很簡單,代碼如下:
from tkinter import *
#初始化Tk()
myWindow = Tk()
#進入消息循環
myWindow.mainloop()
上述程序創建的窗口是非常簡陋的,有待進一步美化,設置標題、窗口大小、窗口是否
可變等,涉及屬性有:title(設置窗口標題)、 geometry(設置窗口大小)、
resizable(設置窗口是否可以變化長 寬)。請看如下實例:
復制代碼
復制代碼
from tkinter import Tk
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#設置窗口大小
myWindow.geometry('380x300')
#設置窗口是否可變長、寬,True:可變,False:不可變
myWindow.resizable(width=False, height=True)
#進入消息循環
myWindow.mainloop()
進一步,將窗口放置於屏幕中央,如下實例:
from tkinter import Tk
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#設置窗口大小
width = 380
height = 300
#獲取屏幕尺寸以計算布局參數,使窗口居屏幕中央
screenwidth = myWindow.winfo_screenwidth()
screenheight = myWindow.winfo_screenheight()
alignstr = '%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2)
myWindow.geometry(alignstr)
#設置窗口是否可變長、寬,True:可變,False:不可變
myWindow.resizable(width=False, height=True)
#進入消息循環
myWindow.mainloop()
常用控件
僅有窗口並不能實現交互,還需要控件,Tkinter 提供了各種控件,如按鈕、標簽和文本
框。在一個 GUI 應用程序中使用,這些控件通常被稱為控件或者部件,目前有15種
Tkinter 部件,如下列表:
幾何管理
Tkinter 控件有特定的幾何狀態管理方法,管理整個控件區域組織,以下是 Tkinter 公開
的幾何管理類:包、網格、位置。
Lable 控件實例
實例1:標簽展示文本,代碼如下:
from tkinter import *
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#創建一個標簽,顯示文本
Label(myWindow,text="user-name",bg='red',font=('Arial12 bold'),width=20,height=5).pack()
Label(myWindow, text="password",bg='green',width=20,height=5).pack()
#進入消息循環
myWindow.mainloop()
執行結果:
實例2:標簽展示圖標,代碼如下:
from tkinter import *
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#創建一個標簽,顯示圖標
logo = PhotoImage(file="/Users/guojin/book/temp.gif")
Label(myWindow, image=logo).pack(side='left')
#進入消息循環
myWindow.mainloop()
實例3:標簽圖文混疊,邊距控制,代碼如下:
from tkinter import *
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#創建一個標簽,顯示文本
logo = PhotoImage(file="/Users/guojin/book/temp.gif")
explanation = """At present, only GIF and PPM/PGM
formats are supported, but an interface
exists to allow additional image file
formats to be added easily."""
Label(myWindow,compound=CENTER,text=explanation,image=logo).pack(side="right")
#進入消息循環
myWindow.mainloop()
運行結果:
Button控件
Button 控件是一個標准的 Tkinter 部件,用於實現各種按鈕。按鈕可以包含文本或圖
像,還可以關聯 Python 函數。
Tkinter 的按鈕被按下時,會自動調用該函數。
按鈕文本可跨越一個以上的行。此外,文本字符可以有下划線,例如標記的鍵盤快捷
鍵。默認情況下,使用 Tab 鍵可以移動到一個按鈕部件,用法如下:
Entry(根對象, [屬性列表]),即Entry(root, option...)
常用的屬性列表如下:
Button 實例:
實例1:創建按鈕,代碼如下:
復制代碼
復制代碼
from tkinter import*
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#創建兩個按鈕
b1=Button(myWindow, text='button1',bg="red", relief='raised', width=8, height=2)
b1.grid(row=0, column=0, sticky=W, padx=5,pady=5)
b2=Button(myWindow, text='button2', font=('Helvetica 10 bold'),width=8, height=2)
b2.grid(row=0, column=1, sticky=W, padx=5, pady=5)
#進入消息循環
myWindow.mainloop()
運行結果:
實例2:創建按鈕並綁定響應函數,輸入半徑,計算圓面積並輸出,代碼如下:
復制代碼
復制代碼
from tkinter import*
def printInfo():
#清理entry2
entry2.delete(0, END)
#根據輸入半徑計算面積
R=int(entry1.get())
S= 3.1415926*R*R
entry2.insert(10, S)
#清空entry2控件
entry1.delete(0, END)
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
#標簽控件布局
Label(myWindow, text="input").grid(row=0)
Label(myWindow, text="output").grid(row=1)
#Entry控件布局
entry1=Entry(myWindow)
entry2=Entry(myWindow)
entry1.grid(row=0, column=1)
entry2.grid(row=1, column=1)
#Quit按鈕退出;Run按鈕打印計算結果
Button(myWindow, text='Quit', command=myWindow.quit).grid(row=2, column=0,sticky=W, padx=5, pady=5)
Button(myWindow, text='Run', command=printInfo).grid(row=2, column=1, sticky=W, padx=5, pady=5)
#進入消息循環
myWindow.mainloop()
Checkbutton控件Checkbutton 是復選框,又稱為多選按鈕,可以表示兩種狀態。用法為: Checkbutton
( root, option, ... ), 其中可選屬性 option 有很多,如下表所示:
以下是這個小工具的常用方法:
實例1:創建一組復選框,代碼如下:
from tkinter import*
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
# 用來獲取復選框是否被勾選,通過chVarDis.get()來獲取其的狀態,其狀態值為int類型 勾選為1
chVarDis = IntVar()
# text為該復選框后面顯示的名稱, variable將該復選框的狀態賦值給一個變量,當state='disa
check1 = Checkbutton(myWindow, text="Disabled", variable=chVarDis, state='disabled')
# 該復選框是否勾選,select為勾選, deselect為不勾選
check1.select()
# sticky=tk.W 當該列中其他行或該行中的其他列的某一個功能拉長這列的寬度或高度時,
# 設定該值可以保證本行保持左對齊,N:北/上對齊 S:南/下對齊 W:西/左對齊 E:東/右對齊
check1.grid(column=0, row=0, sticky=W)
chvarUn = IntVar()
check2 = Checkbutton(myWindow, text="UnChecked", variable=chvarUn)
check2.deselect()
check2.grid(column=1, row=0, sticky=W)
chvarEn = IntVar()
check3 = Checkbutton(myWindow, text="Enabled", variable=chvarEn)
check3.select()
check3.grid(column=2, row=0, sticky=W)
#進入消息循環
myWindow.mainloop()
實例2:綁定響應函數,代碼如下:
from tkinter import*
def callCheckbutton():
#改變v的值,即改變Checkbutton的顯示值
v.set('check CheckButton')
#初始化Tk()
myWindow = Tk()
#設置標題
myWindow.title('Python GUI Learning')
v = StringVar()
v.set('check python')
#綁定v到Checkbutton的屬性textvariable
Checkbutton(myWindow,textvariable = v,command = callCheckbutton).pack()
#進入消息循環
myWindow.mainloop()
Radiobutton控件
單選按鈕是一種可在多個預先定義的選項中選擇出一項的 Tkinter 控件 。單選按鈕可顯
示文字或圖片,顯示文字時只能使用預設字體,該控件可以綁定一個 Python 函數或方
法,當單選按鈕被選擇時,該函數或方法將被調用。
單選按鈕(Radio Button)這個名字來源於收音機(Radio)上的調頻按鈕, 這些按鈕用
來選擇特定波段或預設電台,如果一個按鈕被按下, 其他同類的按鈕就會彈起,即同時
只有一個按鈕可被按下。
一組單選按鈕控件和同一個變量關聯。點擊其中一個單選按鈕將把這個變量設為某個預
定義的值。一般用法為: Radiobutton(myWindow,options) ,其中 option 與
Checkbutton,Button 大多重合,用法一致。
實例:創建單選按鈕並綁定響應函數,代碼如下:
from tkinter import*
#初始化Tk()
myWindow=Tk()
myWindow.title('Python GUI Learning')
v=IntVar()
#列表中存儲的是元素是元組
language=[('python',0),('C++',1),('C',2),('Java',3)]
#定義單選按鈕的響應函數
def callRB():
for i in range(4):
if (v.get()==i):
root1 = Tk()
Label(root1,text='你的選擇是'+language[i][0]+'!',fg='red',width=20, height=6).pack()
Button(root1,text='確定',width=3,height=1,command=root1.destroy).pack(side='bottom')
Label(myWindow,text='選擇一門你喜歡的編程語言').pack(anchor=W)
#for循環創建單選框
for lan,num in language:
Radiobutton(myWindow, text=lan, value=num, command=callRB, variable=v).pack(anchor=W)
#進入消息循環
myWindow.mainloop()
Menu控件
Menu被用來創建一個菜單,創建Menu類的實例,然后使用add方法添加命令或者其他
菜單內容。使用方法如下:
Menu(root,option,…)
其中 option 列表如下:
特有函數:
實例:創建一個菜單組,代碼如下:
from tkinter import *
#創建窗口
myWindow=Tk()
myWindow.title("菜單")
myWindow.geometry("400x300+300+100")
# 創建一個菜單項,類似於導航欄,頂層菜單
menubar=Menu(myWindow)
# 創建菜單項
fmenu1=Menu(myWindow)
for item in ['新建','打開','保存','另存為']:
# 如果該菜單是頂層菜單的一個菜單項,則它添加的是下拉菜單的菜單項。則他添加的是下拉菜單的菜單項。
fmenu1.add_command(label=item)
fmenu2=Menu(myWindow)
for item in ['復制','粘貼','剪切']:
fmenu2.add_command(label=item)
fmenu3=Menu(myWindow)
for item in ['大綱視圖','web視圖']:
fmenu3.add_command(label=item)
fmenu4=Menu(myWindow)
for item in ["版權信息","其它說明"]:
fmenu4.add_command(label=item)
# add_cascade 的一個很重要的屬性就是 menu 屬性,它指明了要把那個菜單級聯到該菜單項上,
# 當然,還必不可少的就是 label 屬性,用於指定該菜單項的名稱
menubar.add_cascade(label="文件",menu=fmenu1)
menubar.add_cascade(label="編輯",menu=fmenu2)
menubar.add_cascade(label="視圖",menu=fmenu3)
menubar.add_cascade(label="關於",menu=fmenu4)
# 最后可以用窗口的 menu 屬性指定我們使用哪一個作為它的頂層菜單
myWindow.config(menu=menubar)
#進入消息循環
myWindow.mainloop()
運行結果:
Message控件
Message 控件用來展示一些文字短消息。Message 和 Label 控件有些類似, 但在展示文字方面比 Label 要靈活,比如 Message 控件可以改變字體,而 Label 控件只能使用一種字體,它提供了一個換行對象,以使文字可以斷為多行。它可以支持文字的自動換行及對齊,這里要澄清一下前面提到的 Message 控件可以改變字體的說法: 這是說我們可以為單個控件設置任意字體, 控件內的文字都將顯示為該字體,但我們不能給單個控件內的文字設置多種字體,如果你需要這么做,可以考慮使用Text 控件。
創建一個 Message 控件的語法如下:
w = Message ( root, option, ... )
其中 option 列表如下:
請看下面實例:
from tkinter import *
#初始化Tk()
myWindow=Tk()
#創建一個Message
whatever_you_do = "Only those who have the patience to do simple things per
msg = Message(myWindow, text = whatever_you_do)
msg.config(bg='lightgreen', font=('times', 20, 'italic'))
msg.pack( )
#進入消息循環
myWindow.mainloop()