国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > Python > 正文

python GUI實(shí)例學(xué)習(xí)

2020-01-04 16:18:29
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

在學(xué)習(xí)本篇之前,如果你對(duì)Python下進(jìn)行GUI編程基礎(chǔ)內(nèi)容還有不明白,推薦一篇相關(guān)文章:簡(jiǎn)單介紹利用TK在Python下進(jìn)行GUI編程的教程

寫(xiě)一個(gè)簡(jiǎn)單的界面很容易,即使是什么都不了解的情況下,這個(gè)文本轉(zhuǎn)載了最簡(jiǎn)單的界面編寫(xiě),下個(gè)文本介紹了TK的簡(jiǎn)單但具體的應(yīng)用

在python中創(chuàng)建一個(gè)窗口,然后顯示出來(lái)。

from Tkinter import * root = Tk() root.mainloop() 

就3行就能夠把主窗口顯示出來(lái)了。root是一個(gè)變量名稱(chēng),其代表了這個(gè)主窗口。以后創(chuàng)建控件的時(shí)候指定控件創(chuàng)建在什么窗口之中,就要用這個(gè)root來(lái)表示了。而Tk()是一個(gè)Tkinter庫(kù)之中的函數(shù)(其實(shí)是類(lèi)的構(gòu)造函數(shù),構(gòu)造了一個(gè)對(duì)象)。而mainloop則是主窗口的成員函數(shù),也就是表示讓這個(gè)root工作起來(lái),開(kāi)始接收鼠標(biāo)的和鍵盤(pán)的操作。你現(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)容了,方法是很類(lè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() 

只不過(guò)把button替換了label而B(niǎo)utton替換了Label。注意一下Button和Label這些都是Tkinter這些庫(kù)提供的,而button和Button這樣大小寫(xiě)之間的差別僅僅是巧合,你能夠隨便的給變量取名字,但是Button和Label這些則是需要記住的東西,寫(xiě)代碼的時(shí)候要經(jīng)常用到的名字。但是點(diǎn)擊按鈕你會(huì)比較失望,因?yàn)椴](méi)有什么反應(yīng)。不過(guò)也是當(dāng)然的事情,你并沒(méi)有告訴計(jì)算機(jī)對(duì)于這樣一個(gè)按鈕的點(diǎn)擊操作需要作出一個(gè)什么樣的反應(yīng)來(lái)反饋給用戶(hù)。而這個(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)寫(xiě),需要比這個(gè)長(zhǎng)更加不好懂的寫(xiě)法。另外你是否會(huì)對(duì)on_click中出現(xiàn)label這個(gè)變量比較奇怪呢?明明在on_click前面沒(méi)有定義label這個(gè)變量啊。如果我在C中這么寫(xiě)程序,編譯器一定會(huì)告訴我出錯(cuò)的。而python是怎么知道label這個(gè)變量存在,然后沒(méi)有報(bào)錯(cuò)的呢?其實(shí)python在你寫(xiě)的時(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)定義的變量。如果沒(méi)有定義呢?那就報(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è)地方,不要寫(xiě)成hello(),如果是hello()的話(huà),  #會(huì)在mainloop中調(diào)用hello函數(shù),  # 而不是單擊button按鈕時(shí)出發(fā)事件  btn.pack(expand=YES, fill=BOTH) #將按鈕pack,充滿(mǎn)整個(gè)窗體(只有pack的組件實(shí)例才能顯示)    mainloop() #進(jìn)入主循環(huán),程序運(yùn)行  

python,GUI

當(dāng)我們寫(xiě)一個(gè)較大的程序時(shí),最好將代碼分成一個(gè)或者是幾個(gè)類(lèi),再看一下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()

python,GUI

看完了上面兩個(gè)無(wú)聊的Hello World例子,再來(lái)看一個(gè)稍微Perfect點(diǎn)的東西吧。Menu組件,自己畫(huà)一個(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()

python,GUI

這個(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('我是開(kāi)發(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è)下拉菜單Editeditmenu = 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)建下拉菜單Helphelpmenu = Menu(menubar, tearoff=0)helpmenu.add_command(label="About", command=about)menubar.add_cascade(label="Help", menu=helpmenu)#顯示菜單root.config(menu=menubar)mainloop()

python,GUI

寫(xiě)了這一些,差不多對(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="開(kāi)發(fā)者感謝名單/nfuyunbiyi/nfyby尚未出現(xiàn)的女朋友/nhttp://www.programup.com網(wǎng)站")w.pack(side=TOP)

python,GUI

kinter的提供各種控件,如按鈕,標(biāo)簽和文本框,一個(gè)GUI應(yīng)用程序中使用。這些控件通常被稱(chēng)為控件或者部件。

目前有15種Tkinter的部件。我們提出這些部件以及一個(gè)簡(jiǎn)短的介紹,在下面的表:

python,GUI

標(biāo)準(zhǔn)屬性:

標(biāo)準(zhǔn)屬性也就是所有控件的共同屬性,如大小,字體和顏色等等。

python,GUI

幾何管理:

Tkinter控件有特定的幾何狀態(tài)管理方法,管理整個(gè)控件區(qū)域組織,一下是Tkinter公開(kāi)的幾何管理類(lèi):包、網(wǎng)格、位置

python,GUI


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到python教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 马鞍山市| 平江县| 察雅县| 山东省| 交口县| 龙州县| 凤冈县| 济源市| 屯昌县| 萍乡市| 岗巴县| 长葛市| 台中县| 尉氏县| 翁源县| 于都县| 淳安县| 当阳市| 株洲市| 广元市| 洞头县| 炉霍县| 拉孜县| 故城县| 遂平县| 洪江市| 米脂县| 南投市| 渭源县| 闻喜县| 双辽市| 南京市| 应城市| 岳阳市| 汉寿县| 科技| 霞浦县| 泽州县| 黄冈市| 鄄城县| 南岸区|