python GUI實例學(xué)習(xí)
在學(xué)習(xí)本篇之前,如果你對Python下進行GUI編程基礎(chǔ)內(nèi)容還有不明白,推薦一篇相關(guān)文章:簡單介紹利用TK在Python下進行GUI編程的教程
寫一個簡單的界面很容易,即使是什么都不了解的情況下,這個文本轉(zhuǎn)載了最簡單的界面編寫,下個文本介紹了TK的簡單但具體的應(yīng)用
在python中創(chuàng)建一個窗口,然后顯示出來。
from Tkinter import * root = Tk() root.mainloop()
就3行就能夠把主窗口顯示出來了。root是一個變量名稱,其代表了這個主窗口。以后創(chuàng)建控件的時候指定控件創(chuàng)建在什么窗口之中,就要用這個root來表示了。而Tk()是一個Tkinter庫之中的函數(shù)(其實是類的構(gòu)造函數(shù),構(gòu)造了一個對象)。而mainloop則是主窗口的成員函數(shù),也就是表示讓這個root工作起來,開始接收鼠標(biāo)的和鍵盤的操作。你現(xiàn)在就能夠通過鼠標(biāo)縮放以及關(guān)閉這個窗口了。注意到窗口的標(biāo)題是tk,我們可以進行一些修改
root= Tk(className='bitunion')
然后窗口的標(biāo)題就變成了bitunion了。下面要作的是把這個窗口的內(nèi)容填充一下,讓其有一些東西。先加入一個標(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)窗口變小了,但是其中多了一行字。變小了是因為窗口中已經(jīng)放了東西了,python的Tkinter非常智能,能夠根據(jù)內(nèi)容自動縮放,而不用和傳統(tǒng)的windows程序一樣,手工的指定絕對坐標(biāo)了。對于label,它還是一個變量而已。不過這個變量代表了一個標(biāo)簽,也就是那一行字。而這個label的創(chuàng)建是用Label,而Label的參數(shù)是root表明了這個控件是root主窗口的成員控件,或者說是子窗口。label['text']表示設(shè)置這個標(biāo)簽的text屬性為'be on your own',也就是文字內(nèi)容了。label.pack和root.mainloop一樣費解,但是內(nèi)涵一樣深刻。你現(xiàn)在可以簡單理解為把label顯示出來的功能,因為你把pack去掉,那你就看不到東西了。其實pack是和控件的布局排版有關(guān)西的。
再添加一個按鈕就能夠有更加豐富的內(nèi)容了,方法是很類似的??粗桑?/p>
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這些則是需要記住的東西,寫代碼的時候要經(jīng)常用到的名字。但是點擊按鈕你會比較失望,因為并沒有什么反應(yīng)。不過也是當(dāng)然的事情,你并沒有告訴計算機對于這樣一個按鈕的點擊操作需要作出一個什么樣的反應(yīng)來反饋給用戶。而這個指定作出什么反應(yīng)的工作只需要一個行,但是作出具體什么樣反應(yīng)的描述則需要新建一個函數(shù)來進行處理。
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這個函數(shù)來處理。而on_click函數(shù)也很簡潔,只是把label的文本重新設(shè)置一下。這個完成了一個事件消息的處理,如果用C來寫,需要比這個長更加不好懂的寫法。另外你是否會對on_click中出現(xiàn)label這個變量比較奇怪呢?明明在on_click前面沒有定義label這個變量啊。如果我在C中這么寫程序,編譯器一定會告訴我出錯的。而python是怎么知道label這個變量存在,然后沒有報錯的呢?其實python在你寫的時候根本就不用知道其是否存在,只是要在運行的時候找得到label就可以了。而運行的前后關(guān)系,是通過時間來關(guān)聯(lián)的而不是代碼上前后行的關(guān)系。這里由于label = Label(root)先于on_click執(zhí)行,所以當(dāng)on_click執(zhí)行的時候,label就是一個已經(jīng)定義的變量。如果沒有定義呢?那就報告出錯嘍。
最后一個例子:
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()
這個就比較復(fù)雜了。里面有一個StringVar。這個代表一個字符串,但是跟一般字符串不一樣。一般的這樣'dfsdf'的字符串是不可變的,你只能把變量指定為不同的字符串,但是字符串本身的內(nèi)容是不可改變的。而StringVar則是可變的字符串。所以了set和get來設(shè)置和取得其內(nèi)容。主要是entry(單行輸入框)要求一個這樣的屬性來設(shè)置和接收其輸入框的內(nèi)容。
用Tkinter實現(xiàn)一個簡單的GUI程序,單擊click按鈕時會在終端打印出'hello world':
__author__ = 'fyby'
from Tkinter import * #引入Tkinter工具包
def hello():
print('hello world!')
win = Tk() #定義一個窗體
win.title('Hello World') #定義窗體標(biāo)題
win.geometry('400x200') #定義窗體的大小,是400X200像素
btn = Button(win, text='Click me', command=hello)
#注意這個地方,不要寫成hello(),如果是hello()的話,
#會在mainloop中調(diào)用hello函數(shù),
# 而不是單擊button按鈕時出發(fā)事件
btn.pack(expand=YES, fill=BOTH) #將按鈕pack,充滿整個窗體(只有pack的組件實例才能顯示)
mainloop() #進入主循環(huán),程序運行
當(dāng)我們寫一個較大的程序時,最好將代碼分成一個或者是幾個類,再看一下Hello World例子
#-*- encoding=UTF-8 -*- __author__ = 'fyby' from Tkinter import * class App: def __init__(self, master): #構(gòu)造函數(shù)里傳入一個父組件(master),創(chuàng)建一個Frame組件并顯示 frame = Frame(master) frame.pack() #創(chuàng)建兩個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): #構(gòu)造函數(shù)里傳入一個父組件(master),創(chuàng)建一個Frame組件并顯示 frame=Frame(master) frame.pack() #創(chuàng)建兩個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()
這個程序還是有點無趣,因為我們只是創(chuàng)建了一個頂級的導(dǎo)航菜單,點擊后只是在終端中輸出hello而已,下面來創(chuàng)建一個下拉菜單,這樣才像一個正兒八經(jīng)的應(yīng)用大笑在下面的這個例子中,會創(chuàng)建三個頂級菜單,每個頂級菜單中都有下拉菜單(用add_command方法創(chuàng)建,最后用add_cascade方法加入到上級菜單中去),為每個下拉選項都綁定一個hello函數(shù),在終端中打印出hello.
root.quit是退出這個Tk的實例。
#-*- encoding=UTF-8 -*- __author__ = 'fyby' from Tkinter import * root = Tk() def hello(): print('hello') def about(): print('我是開發(fā)者') menubar = Menu(root) #創(chuàng)建下拉菜單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) #創(chuàng)建另一個下拉菜單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()
寫了這一些,差不多對Tkinter有了一個大體的印象了。在Python中用Tkinter繪制GUI界面還是蠻簡單的。再把上面的例子擴展一下,和Label標(biāo)簽結(jié)合,當(dāng)單擊about的時候,在窗體上打印About的內(nèi)容,而不是在終端輸出。將about函數(shù)稍微修改一下。單擊about以后將會調(diào)用about函數(shù)渲染frame繪制一個標(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)簽和文本框,一個GUI應(yīng)用程序中使用。這些控件通常被稱為控件或者部件。
目前有15種Tkinter的部件。我們提出這些部件以及一個簡短的介紹,在下面的表:
標(biāo)準(zhǔn)屬性:
標(biāo)準(zhǔn)屬性也就是所有控件的共同屬性,如大小,字體和顏色等等。
幾何管理:
Tkinter控件有特定的幾何狀態(tài)管理方法,管理整個控件區(qū)域組織,一下是Tkinter公開的幾何管理類:包、網(wǎng)格、位置
相關(guān)文章
解決pycharm中導(dǎo)入自己寫的.py函數(shù)出錯問題
今天小編就為大家分享一篇解決pycharm中導(dǎo)入自己寫的.py函數(shù)出錯問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02AMP?Tensor?Cores節(jié)省內(nèi)存PyTorch模型詳解
這篇文章主要為大家介紹了AMP?Tensor?Cores節(jié)省內(nèi)存PyTorch模型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-10-10Python實現(xiàn)PDF文字識別提取并寫入CSV文件
這篇文章主要是和大家分享一個Python實現(xiàn)PDF文字識別與提取并寫入?CSV文件的腳本。文中的示例代碼講解詳細,感興趣的小伙伴可以了解一下2022-03-03利用python腳本提取Abaqus場輸出數(shù)據(jù)的代碼
這篇文章主要介紹了利用python腳本提取Abaqus場輸出數(shù)據(jù),利用python腳本對Abaqus進行數(shù)據(jù)提取時,要對python腳本做前步的導(dǎo)入處理,本文通過實例代碼詳細講解需要的朋友可以參考下2022-11-11tkinter如何實現(xiàn)打開文件對話框并獲取文件絕對路徑
這篇文章主要介紹了tkinter實現(xiàn)打開文件對話框并獲取文件絕對路徑問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01