在學(xué)習(xí)本篇之前,如果你對(duì)Python下進(jìn)行GUI編程基礎(chǔ)內(nèi)容還有不明白,推薦一篇相關(guān)文章:簡(jiǎn)單介紹利用TK在Python下進(jìn)行GUI編程的教程
寫一個(gè)簡(jiǎn)單的界面很容易,即使是什么都不了解的情況下,這個(gè)文本轉(zhuǎn)載了最簡(jiǎn)單的界面編寫,下個(gè)文本介紹了TK的簡(jiǎn)單但具體的應(yīng)用
在python中創(chuàng)建一個(gè)窗口,然后顯示出來(lái)。
from Tkinter import * root = Tk() root.mainloop()
就3行就能夠把主窗口顯示出來(lái)了。root是一個(gè)變量名稱,其代表了這個(gè)主窗口。以后創(chuàng)建控件的時(shí)候指定控件創(chuàng)建在什么窗口之中,就要用這個(gè)root來(lái)表示了。而Tk()是一個(gè)Tkinter庫(kù)之中的函數(shù)(其實(shí)是類的構(gòu)造函數(shù),構(gòu)造了一個(gè)對(duì)象)。而mainloop則是主窗口的成員函數(shù),也就是表示讓這個(gè)root工作起來(lái),開始接收鼠標(biāo)的和鍵盤的操作。你現(xiàn)在就能夠通過(guò)鼠標(biāo)縮放以及關(guān)閉這個(gè)窗口了。注意到窗口的標(biāo)題是tk,我們可以進(jìn)行一些修改
root= Tk(className='bitunion')
然后窗口的標(biāo)題就變成了bitunion了。下面要作的是把這個(gè)窗口的內(nèi)容填充一下,讓其有一些東西。先加入一個(gè)標(biāo)簽,所謂標(biāo)簽就是一行字。
from Tkinter import * root = Tk(className='bitunion') label = Label(root) label['text'] = 'be on your own' label.pack() root.mainloop()
我們很驚訝的發(fā)現(xiàn)窗口變小了,但是其中多了一行字。變小了是因?yàn)榇翱谥幸呀?jīng)放了東西了,python的Tkinter非常智能,能夠根據(jù)內(nèi)容自動(dòng)縮放,而不用和傳統(tǒng)的windows程序一樣,手工的指定絕對(duì)坐標(biāo)了。對(duì)于label,它還是一個(gè)變量而已。不過(guò)這個(gè)變量代表了一個(gè)標(biāo)簽,也就是那一行字。而這個(gè)label的創(chuàng)建是用Label,而Label的參數(shù)是root表明了這個(gè)控件是root主窗口的成員控件,或者說(shuō)是子窗口。label['text']表示設(shè)置這個(gè)標(biāo)簽的text屬性為'be on your own',也就是文字內(nèi)容了。label.pack和root.mainloop一樣費(fèi)解,但是內(nèi)涵一樣深刻。你現(xiàn)在可以簡(jiǎn)單理解為把label顯示出來(lái)的功能,因?yàn)槟惆裵ack去掉,那你就看不到東西了。其實(shí)pack是和控件的布局排版有關(guān)西的。
再添加一個(gè)按鈕就能夠有更加豐富的內(nèi)容了,方法是很類似的。看著吧:
from Tkinter import * root = Tk(className='bitunion') label = Label(root) label['text'] = 'be on your own' label.pack() button = Button(root) button['text'] = 'change it' button.pack() root.mainloop()
只不過(guò)把button替換了label而Button替換了Label。注意一下Button和Label這些都是Tkinter這些庫(kù)提供的,而button和Button這樣大小寫之間的差別僅僅是巧合,你能夠隨便的給變量取名字,但是Button和Label這些則是需要記住的東西,寫代碼的時(shí)候要經(jīng)常用到的名字。但是點(diǎn)擊按鈕你會(huì)比較失望,因?yàn)椴]有什么反應(yīng)。不過(guò)也是當(dāng)然的事情,你并沒有告訴計(jì)算機(jī)對(duì)于這樣一個(gè)按鈕的點(diǎn)擊操作需要作出一個(gè)什么樣的反應(yīng)來(lái)反饋給用戶。而這個(gè)指定作出什么反應(yīng)的工作只需要一個(gè)行,但是作出具體什么樣反應(yīng)的描述則需要新建一個(gè)函數(shù)來(lái)進(jìn)行處理。
from Tkinter import * def on_click(): label['text'] = 'no way out' root = Tk(className='bitunion') label = Label(root) label['text'] = 'be on your own' label.pack() button = Button(root) button['text'] = 'change it' button['command'] = on_click button.pack() root.mainloop()
button['command'] = on_click表示對(duì)于button(按鈕)的點(diǎn)擊屬性用on_click這個(gè)函數(shù)來(lái)處理。而on_click函數(shù)也很簡(jiǎn)潔,只是把label的文本重新設(shè)置一下。這個(gè)完成了一個(gè)事件消息的處理,如果用C來(lái)寫,需要比這個(gè)長(zhǎng)更加不好懂的寫法。另外你是否會(huì)對(duì)on_click中出現(xiàn)label這個(gè)變量比較奇怪呢?明明在on_click前面沒有定義label這個(gè)變量啊。如果我在C中這么寫程序,編譯器一定會(huì)告訴我出錯(cuò)的。而python是怎么知道label這個(gè)變量存在,然后沒有報(bào)錯(cuò)的呢?其實(shí)python在你寫的時(shí)候根本就不用知道其是否存在,只是要在運(yùn)行的時(shí)候找得到label就可以了。而運(yùn)行的前后關(guān)系,是通過(guò)時(shí)間來(lái)關(guān)聯(lián)的而不是代碼上前后行的關(guān)系。這里由于label = Label(root)先于on_click執(zhí)行,所以當(dāng)on_click執(zhí)行的時(shí)候,label就是一個(gè)已經(jīng)定義的變量。如果沒有定義呢?那就報(bào)告出錯(cuò)嘍。
最后一個(gè)例子:
from Tkinter import * def on_click(): label['text'] = text.get() root = Tk(className='bitunion') label = Label(root) label['text'] = 'be on your own' label.pack() text = StringVar() text.set('change to what?') entry = Entry(root) entry['textvariable'] = text entry.pack() button = Button(root) button['text'] = 'change it' button['command'] = on_click button.pack() root.mainloop()
這個(gè)就比較復(fù)雜了。里面有一個(gè)StringVar。這個(gè)代表一個(gè)字符串,但是跟一般字符串不一樣。一般的這樣'dfsdf'的字符串是不可變的,你只能把變量指定為不同的字符串,但是字符串本身的內(nèi)容是不可改變的。而StringVar則是可變的字符串。所以了set和get來(lái)設(shè)置和取得其內(nèi)容。主要是entry(單行輸入框)要求一個(gè)這樣的屬性來(lái)設(shè)置和接收其輸入框的內(nèi)容。
用Tkinter實(shí)現(xiàn)一個(gè)簡(jiǎn)單的GUI程序,單擊click按鈕時(shí)會(huì)在終端打印出'hello world':
__author__ = 'fyby'?
from Tkinter import *?? #引入Tkinter工具包?
def hello():?
print('hello world!')?
win = Tk()? #定義一個(gè)窗體?
win.title('Hello World')??? #定義窗體標(biāo)題?
win.geometry('400x200')???? #定義窗體的大小,是400X200像素?
btn = Button(win, text='Click me', command=hello)?
#注意這個(gè)地方,不要寫成hello(),如果是hello()的話,?
#會(huì)在mainloop中調(diào)用hello函數(shù),?
# 而不是單擊button按鈕時(shí)出發(fā)事件?
btn.pack(expand=YES, fill=BOTH) #將按鈕pack,充滿整個(gè)窗體(只有pack的組件實(shí)例才能顯示)???
mainloop() #進(jìn)入主循環(huán),程序運(yùn)行?
當(dāng)我們寫一個(gè)較大的程序時(shí),最好將代碼分成一個(gè)或者是幾個(gè)類,再看一下Hello World例子
#-*- encoding=UTF-8 -*- __author__ = 'fyby' from Tkinter import * class App: def __init__(self, master): #構(gòu)造函數(shù)里傳入一個(gè)父組件(master),創(chuàng)建一個(gè)Frame組件并顯示 frame = Frame(master) frame.pack() #創(chuàng)建兩個(gè)button,并作為frame的一部分 self.button = Button(frame, text="QUIT", fg="red", command=frame.quit) self.button.pack(side=LEFT) #此處side為L(zhǎng)EFT表示將其放置 到frame剩余空間的最左方 self.hi_there = Button(frame, text="Hello", command=self.say_hi) self.hi_there.pack(side=LEFT) def say_hi(self): print "hi there, this is a class example!" win = Tk() app = App(win) win.mainloop()
看完了上面兩個(gè)無(wú)聊的Hello World例子,再來(lái)看一個(gè)稍微Perfect點(diǎn)的東西吧。Menu組件,自己畫一個(gè)像樣點(diǎn)的程序外殼。
#-*-encoding=UTF-8-*- __author__='fyby' fromTkinterimport* classApp: def__init__(self,master): #構(gòu)造函數(shù)里傳入一個(gè)父組件(master),創(chuàng)建一個(gè)Frame組件并顯示 frame=Frame(master) frame.pack() #創(chuàng)建兩個(gè)button,并作為frame的一部分 self.button=Button(frame,text="QUIT",fg="red",command=frame.quit) self.button.pack(side=LEFT)#此處side為L(zhǎng)EFT表示將其放置到frame剩余空間的最左方 self.hi_there=Button(frame,text="Hello",command=self.say_hi) self.hi_there.pack(side=LEFT) defsay_hi(self): print"hithere,thisisaclassexample!" win=Tk() app=App(win) win.mainloop()
這個(gè)程序還是有點(diǎn)無(wú)趣,因?yàn)槲覀冎皇莿?chuàng)建了一個(gè)頂級(jí)的導(dǎo)航菜單,點(diǎn)擊后只是在終端中輸出hello而已,下面來(lái)創(chuàng)建一個(gè)下拉菜單,這樣才像一個(gè)正兒八經(jīng)的應(yīng)用大笑在下面的這個(gè)例子中,會(huì)創(chuàng)建三個(gè)頂級(jí)菜單,每個(gè)頂級(jí)菜單中都有下拉菜單(用add_command方法創(chuàng)建,最后用add_cascade方法加入到上級(jí)菜單中去),為每個(gè)下拉選項(xiàng)都綁定一個(gè)hello函數(shù),在終端中打印出hello.
root.quit是退出這個(gè)Tk的實(shí)例。
#-*- encoding=UTF-8 -*- __author__ = 'fyby' from Tkinter import * root = Tk() def hello(): print('hello') def about(): print('我是開發(fā)者') menubar = Menu(root) #創(chuàng)建下拉菜單File,然后將其加入到頂級(jí)的菜單欄中 filemenu = Menu(menubar,tearoff=0) filemenu.add_command(label="Open", command=hello) filemenu.add_command(label="Save", command=hello) filemenu.add_separator() filemenu.add_command(label="Exit", command=root.quit) menubar.add_cascade(label="File", menu=filemenu) #創(chuàng)建另一個(gè)下拉菜單Edit editmenu = Menu(menubar, tearoff=0) editmenu.add_command(label="Cut", command=hello) editmenu.add_command(label="Copy", command=hello) editmenu.add_command(label="Paste", command=hello) menubar.add_cascade(label="Edit",menu=editmenu) #創(chuàng)建下拉菜單Help helpmenu = Menu(menubar, tearoff=0) helpmenu.add_command(label="About", command=about) menubar.add_cascade(label="Help", menu=helpmenu) #顯示菜單 root.config(menu=menubar) mainloop()
寫了這一些,差不多對(duì)Tkinter有了一個(gè)大體的印象了。在Python中用Tkinter繪制GUI界面還是蠻簡(jiǎn)單的。再把上面的例子擴(kuò)展一下,和Label標(biāo)簽結(jié)合,當(dāng)單擊about的時(shí)候,在窗體上打印About的內(nèi)容,而不是在終端輸出。將about函數(shù)稍微修改一下。單擊about以后將會(huì)調(diào)用about函數(shù)渲染frame繪制一個(gè)標(biāo)簽并顯示其內(nèi)容。
def about(): w = Label(root,text="開發(fā)者感謝名單\nfuyunbiyi\nfyby尚未出現(xiàn)的女朋友\nhttp://www.programup.com網(wǎng)站") w.pack(side=TOP)
kinter的提供各種控件,如按鈕,標(biāo)簽和文本框,一個(gè)GUI應(yīng)用程序中使用。這些控件通常被稱為控件或者部件。
目前有15種Tkinter的部件。我們提出這些部件以及一個(gè)簡(jiǎn)短的介紹,在下面的表:
標(biāo)準(zhǔn)屬性:
標(biāo)準(zhǔn)屬性也就是所有控件的共同屬性,如大小,字體和顏色等等。
幾何管理:
Tkinter控件有特定的幾何狀態(tài)管理方法,管理整個(gè)控件區(qū)域組織,一下是Tkinter公開的幾何管理類:包、網(wǎng)格、位置
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
