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

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