暑假?zèng)]回家 ,一不小心培訓(xùn)了python,反正免費(fèi)的不聽白不聽,總比呆在寢室無聊好的多,慶幸的是堅(jiān)持下來了,現(xiàn)在回想起來雖然學(xué)習(xí)時(shí)間很短,但確實(shí)感觸蠻大的,因此寫這篇文章總結(jié)一下。第一節(jié)課就被授課者嚇到了,python處理TB級的數(shù)據(jù),是Hadoopj級別的,而擁有者能力的語言只有R,Ruby等少數(shù)語言,以后用幾個(gè)庫Scipy,Numpy,Matplotlib,可以做數(shù)值計(jì)算等,Matlab的絕大部分功能都可以用python寫出來 ,與MATLAB相比,Python是一門更易學(xué)、更嚴(yán)謹(jǐn)?shù)某绦蛟O(shè)計(jì)語言。它能讓用戶編寫出更易讀、易維護(hù)的代碼。能不能別再嚇我的,我的小心臟受不了~~這里主要是以經(jīng)典的python為例,即python2.x,另外聽說EVE主要是用python寫的~~,不得不說有點(diǎn)難以置性。
首先接觸python就被它的另類所嚇到了,啥,簡單粗暴沒括號,嚇?biāo)牢伊?。那怎么玩啊,在python中沒有分號,單引號和雙引號是不區(qū)分的,不像C中單個(gè)字符用單引號,字符串用雙引號。python的代碼段是靠縮進(jìn)來表示的,不能用大括號。通過四個(gè)空格符或一個(gè)Tab鍵即可,不過在函數(shù)開頭后應(yīng)有冒號,來表示下面的代碼是其內(nèi)部的內(nèi)容。其次有些條件語句中的括號是可以省略的,如: if a>b:(Tab)...當(dāng)然加了括號也正確。而且不用寫main函數(shù),也不用導(dǎo)入isotream或是stdio.h之類的庫。
Python 簡介
1.免費(fèi)開源
2.簡單易學(xué)
3.解釋性語言,與C/C++等編譯性語言不同
4. 可移植,這個(gè)估計(jì)是流行起來的很重要的一個(gè)因素吧。python的程序都可以無需任何修改地移植到現(xiàn)今主流的系統(tǒng)平臺上。包括Windows,Linux,Macintosh,Solaris,OS/2,Android等等
5.同是支持面向?qū)ο蠛兔嫦蜻^程編程,類似C++。至于其面向?qū)ο蟮木幊蹋琾ython還有世界上最強(qiáng)大的類庫。
6.嵌入性:可以作為腳本語言嵌入到其他程序中,比如C/C++
7.可擴(kuò)展性:python開發(fā)周期短,由于python是基于c開發(fā)的,所以用C/C++來編寫Python的擴(kuò)展,現(xiàn)在也有支持Java實(shí)現(xiàn)的Jpython。
8.豐富的類庫:
9.內(nèi)存管理器
這個(gè)特別棒,再也不用要先給變量申請內(nèi)存了,也不用想著用完后釋放等等這些麻煩死了的東西。
10.python的應(yīng)用有系統(tǒng)編程,圖形處理,數(shù)字處理,文本處理,數(shù)據(jù)庫編程,網(wǎng)絡(luò)編程,Web編程,多媒體應(yīng)用,他們也用python寫串口之類的。。
關(guān)于python版本的問題
我想很多人都會果斷用最新的python3.4.1(寫文章時(shí)是2014.7.31,估計(jì)幾年后如果這篇文章有幸被別人看到,對方肯定會呵呵的),人都是這樣,喜歡最新版本的。但是python3.x和python2.x不兼容,也就是說你寫的python3.x的程序不能在python2.x IDEL中運(yùn)行,反過來也是如此。很多庫不支持python3.0之后的版本,很多擴(kuò)展庫都沒有,你還怎么快樂玩耍。。比如python語言web框架的Django就不支持。再說了網(wǎng)上很多優(yōu)秀代碼都是用python2.x寫的,優(yōu)秀的代碼直接拿過來用就可以了,你自己寫的費(fèi)事費(fèi)時(shí),還不一定好用??吹揭槐緯系慕ㄗh:目前大多數(shù)的應(yīng)用是python2.5/2.6居多。windows建議學(xué)2.6,Linux就玩2.5,怪不得前幾天有個(gè)人在群里說他還在用2.5,估計(jì)是玩Linux的。在本人學(xué)習(xí)時(shí),他們授課是用python2.7.8的,是python2.x的最新版本(此時(shí)python3.x的最新版本是python3.4.1)。還是那句話吧,python2和python3并不是100%不兼容,只不過語法上做了一些修繕,更加精煉罷了。會python2的人對python3是不感冒的。
下面是python的print問題:
書上明明寫的是print ''hello world'',會出錯(cuò),必須寫成print (''hello world''),其實(shí)這就是版本問題,前一種是python2的語法,后一種是pyhton3的語法。書上大部分是python2,所以如果你用python3的話,很多資料的代碼你都要進(jìn)行改寫,很是麻煩。
一些基本內(nèi)容
1.round是四舍五入的函數(shù),如round(-9.1)=-9,round(10.7)=11
2.賦值可以多個(gè)同時(shí)進(jìn)行,如a,b=3,6,而且類似a<b<7,運(yùn)行顯示True。a<7<b,運(yùn)行顯示False。這一點(diǎn)與C不一樣,由此可見python的人性化啊~ ~
3.浮點(diǎn)數(shù)轉(zhuǎn)化成整數(shù)是直接截?cái)?,并非四舍五?/p>
4.python的變量是不能指定其類型的,他是通過所附的值來決定的,故int a=4是錯(cuò)誤的,而應(yīng)該寫成a = 4,此外,long型整數(shù)沒有最大的長度,具體取決于你的機(jī)器配置,一般幾百位的整數(shù)顯示時(shí)會在后面加一個(gè)L來表示其為long型。
5.‘+’可實(shí)現(xiàn)數(shù)字的相加或是字符串或是列表的相加,特別方便。如>>>a=[1,''hello'']+[2,''Mike''],則a就成了[1,''hello'',2,''Mike'']
6.用‘’來實(shí)現(xiàn)轉(zhuǎn)義,方法同C
7.逗號可以使print(不是print,python中的輸出函數(shù)是print)函數(shù)不換行的輸出。如print a,b 這和C比起來不知簡單多上倍啊,要是打印個(gè)列表,python直接一個(gè)print 就出來了。。。
8.*可以實(shí)現(xiàn)字符串或列表的重復(fù)
>>> a=''hello''
>>> b=a*4
>>> b
''hellohellohellohello''
>>> list1=[1,''d'']
>>> list2=list1*3
>>> list2
[1, ''d'', 1, ''d'', 1, ''d'']
另外**是乘方,python還支持復(fù)數(shù),如:1-2j
9.輸入與輸出,其中輸入時(shí)通過input函數(shù),例:str1=input(''提示性語句'') 此時(shí)str1的類型取決于輸入類型。還有一個(gè)函數(shù)是raw_input,可以將輸入以字符串的形式處理。
輸出時(shí)可以直接在print后加變量名或表達(dá)式,
如: >>>print ''The area of the circle is",area,''sq cm''
The area of the circle is 80 sq cm
另外也可以用C語言的風(fēng)格輸出,不過有一點(diǎn)差異。
print ''The area of the circle is %f",area,''sq cm'' %area (注意,最末尾的百分號前面只有一個(gè)空格,否則會出錯(cuò)),如果有多個(gè)參數(shù)則%(參1,參2,...)
10.通過range可以方便的實(shí)現(xiàn)一個(gè)特殊的整數(shù)列表
range(下限,上限,步長),左閉右開,同list的切片。
如:0~100 : range(0,101),或簡寫成range(101)
50~100的偶數(shù): range(0,101,2)
在表示C/C++語言中常用的循環(huán)時(shí),利用range可以很方便。
如:C/C++ for(int i =0;i<100;i++)
{
....
}
Python for i in range(100):
...
這個(gè)i 是局部變量,進(jìn)行range列表的迭代,可以實(shí)現(xiàn) i 從0到99共100次循環(huán)。是不是感覺有點(diǎn)小震撼。。
11.一些循環(huán)操作:
break:跳出循環(huán)
continue:跳過后面的語句,跳回循環(huán)體的頂部
pass:啥都不做
另外:和C相比python中沒有++,和- - ,else if用elif來代替,條件語句的()可以省略,條件后需有:。最后邏輯關(guān)系 &&用and,||用or , !用not 表示。
字符串操作
1.capitalize(),使字符串首字母大寫
2.find(s,beg,end)beg和end之間首次出現(xiàn)參數(shù)s的索引
3.islower()和isupper() 測試所有字符是否均小/大寫
4.replace(old,new) 將old替換成new
5.split() 將空格分隔的單詞以列表形式返回,同理如果是split(''a''),則會將字符串進(jìn)行如下處理,每當(dāng)碰到a字符則作為前一個(gè)字符串的結(jié)束,a字符相當(dāng)于空格。
如: >>> colors=''red orange green''
>>> colors.split(a)
[''red or'', ''nge green'']
6.strip()是刪除字符串中首尾的空格符
如: >>> a='' hello Kitty ''
>>> a.strip()
''hello Kitty''
列表操作
1. 通過for i in list1:來對list1列表的元素進(jìn)行迭代,賦值給i
2.如果要同時(shí)獲取i的索引可以用enumerate函數(shù)
如:>>> list1=[''Jim'',''Kitty'',"Tom"]
>>> for i,j in enumerate(list1):
print i,j
0 Jim
1 Kitty
2 Tom
注意 i和j之間本來是有()的,原型為(i,j),這里省略了括號,所以i和j之間除了有逗號沒有空格符
3.列表的一些操作:
切片:咋說呢,其實(shí)list和str都可以“切片”,簡單地說str[1:-1]就是去掉字符串的第一個(gè)字母和最后一個(gè)字符。str[1:]就是去掉第一個(gè)字符。切片方式和list是一樣一樣的,都是左閉右開,支持負(fù)索引,從0開始。
list1=[''a'',''b'',''c'',''d'',''e'',''f'']
list2=list[0:4]
則list2為[''a'',''b'',''c'',''d''] 區(qū)間是左閉右開的,即list2包括了list1[0]到list1[3]的所有元素
另兩種特殊的簡化形式
list2=list1[:4]等同于list2=list1[0:4] list2=list1[4:]等同于list2=list1[4:6]
此外python的列表還支持負(fù)數(shù)索引,
如>>> list2=list1[-3:-1]
>>> list2
[''d'', ''e''] 依舊是左閉右開
當(dāng)想表示從倒數(shù)第三個(gè)到結(jié)束則可以用以下兩種方式
>>> list4=list1[-3:6]
>>> list4
[''d'', ''e'', ''f'']
>>> list5=list1[-3:]
>>> list5[''d'', ''e'', ''f'']
其他情況則會返回空列表
4. 列表具有別名機(jī)制(相當(dāng)于引用)
如:list1=[...]
list2=list1
當(dāng)list1更改時(shí),list2也會更改,而字符串不具有別名機(jī)制,故字符串的別名是很安全的。
5.常見列表方法
append(v):列表后追加v
insert(i,v): v插入索引i
remove(v): 移除第一次找到的v值
reverse(): 反轉(zhuǎn)
sort(): 升序排列(字符串則以字母表順序?yàn)闇?zhǔn))
pop(): 移除最后一個(gè)元素并返回
注意:除了pop外,所有的方法都只會返回一個(gè)特殊值None,列表只有一個(gè),所有的方法都只會修改原列表而不會創(chuàng)建新的列表
如:>>>ted_colors=colors.sort()
>>>print sorted_colors
None
6.列表中的元素可以是列表
>>>life=[[''Canada'',76.5],[''United States'',75.5]]
>>>canada=life[0]
>>>canada[1]=80
>>>life
[[''Canada'',80],[''United States'',75.5]]
這里的canada是別名,對其操作會影響到主列表life
7.上文知道了如何將字符串轉(zhuǎn)化成列表了(別跟我說你已經(jīng)忘了。。split 唄~~),那么如何將列表轉(zhuǎn)化成字符串呢?用 join,字面意思就是將列表中的字符連接以來。那用什么連接呢?你可以用 ’,‘ ’%‘ 或是其他任何你喜歡的字符或字符串都可以。列表放在join后的括號中,那用于連接的字符或字符串怎么寫呢?給個(gè)例子
如:>>> list1=[''2'',''34'',''good'',''Hi'']
>>> '',''.join(list1)
''2,34,good,Hi''
這一點(diǎn)很特殊是用 字符(串).join(列表)
注意點(diǎn):
1.如果要進(jìn)行轉(zhuǎn)換操作,則對類表的元素有要求,必須全部是 字符(串),否則會出錯(cuò)。
>>> list3=[2,34,''good'',''Hi'']
>>> '',''.join(list3)
Traceback (most recent call last):
File "<pyshell#6>", line 1, in <module>
'',''.join(list3)
TypeError: sequence item 0: expected string, int found
2.可以用其他連接的哦,如:
>>> list1=[''2'',''34'',''good'',''Hi'']
>>> ''fool''.join(list1)
''2fool34foolgoodfoolHi''
8.特殊的列表:元組
元組是不可以直接更改的列表,其運(yùn)行效率更高,元組用‘()’來表示
>>>life=([''Canada'',76.5],[''United States'',75.5])
實(shí)際上元組中的對象仍舊可以更改如:life[0][1]=80.0,但不可以更改life[0]。
文件操作
1.標(biāo)準(zhǔn)文件輸入格式
如data.txt中的內(nèi)容為:
Mercury
Venus
Earth
data=open/file(''data.txt'',''r'')
for line in data:
print len(line)
為什么會長度多1呢?因?yàn)槲募凶x取的每一行末尾都有一個(gè)結(jié)束符,用string.strip(),即可去掉該空白字符。前面字符串的方法已介紹過該方法。
data=open/file(''data.txt'',''r'')
for line in data:
line=line.strip()
print len(line)
data.close()
當(dāng)該表參數(shù)‘r’,改成‘w’是直接寫如,而‘a(chǎn)’是追加
2.當(dāng)要打開網(wǎng)站上的文件時(shí)需導(dǎo)入urllib模塊,通過其中的urlopen函數(shù)打開目標(biāo)網(wǎng)頁,并返回一個(gè)對象,就像操作本地文件一樣。
import urllib
url=''...''
web_page=urlopen(url)
for i in web_page:
line=line.strip()
print line
web_page.close()
集合和字典
1.集合可以使用元組或是列表
set((2,3,5))等價(jià)于set((2,2,3,5,5)),等價(jià)于set([2,3,3,5]),簡單的說集合只有一個(gè)元素,該元素是列表或是元組都可。
2.集合的操作
并(union),交(intersection),添加(add)和移除(remove),注意,只有add,remove和clear是修改當(dāng)前集合,其余都會創(chuàng)建一個(gè)新的集合。
eg:ten=set(range(10)), lows=set([0,1,2,3,4]), odds=set([1,3,5,7,9])
_____________________________________________________________________________________________________________________________________lows.add(9) None
lows.clear() None
(由于add并不會創(chuàng)建一個(gè)新集合,故為None,要想得到預(yù)期的效果,則需>>>lows=set([0,1,2,3,4]) >>>lows.add(9) >>>lows)
lows.differece(odds) A
lows.intersection(odds) B
lows.issubset(ten) True 包含于
lows.issuperset(odds) False 包含
lows.symmetric_difference(odds)
A+C 對稱差
lows.union(odds) A+B+C 并
另一種更簡單的方法直接用數(shù)學(xué)符號表示即可
different set1-set2
intersection set1&set2
issubset set1<=set2
issuperset set1>=set2
symmetric_different set1^set2
union set1 |set2
字典
1.用‘{ }’表示字典,{字符串:值,...}
如:
>>>birds={‘canada goose’:3,‘northern fulmar’:1}
>>>birds[‘canada goose'']
3
2.通過賦值來直接對字典進(jìn)行擴(kuò)展(若原字典中無該鍵)或修改鍵值(原字典中已有該鍵)
>>>birds={}
>>>birds[''snow goose'']=3
>>>birds
{''snow goose'':3}
3.刪除鍵
del birds[''snow goose'']
4.對字典的循環(huán),返回的不是鍵值,而是鍵!這一點(diǎn)非常重要
for x in birds:
print x,birds[x]
-->''snow goose'' 3
5.其他一些常用方法
get(key,value1): 注意,若dict中有key,則返回dict[key],否則返回value1
keys(): 以列表形式返回鍵
items(): 返回(key,value)列表
values(): 以列表形式返回鍵值
update(temp): temp字典對原字典進(jìn)行更新
上訴方法其實(shí)一看名稱也就明白用途了。。
6.字典的迭代
用iteritems函數(shù)
如:for (key,value) in dictionary.iteritems():
...
Lambda表達(dá)式
這個(gè)特別有意思啊,當(dāng)你寫函數(shù)時(shí)經(jīng)常會遇到,給個(gè)啥名字好呢?你感覺寫一大堆單詞上去總怕表達(dá)不精練什么的,有可能還會寫錯(cuò)單詞字母(啥,你英語水平很好,不可能寫錯(cuò)。。好吧,我錯(cuò)了),而且只在局部用到,這時(shí)候用Lambda函數(shù)太棒了。Lambda函數(shù)是匿名函數(shù),沒有名字。
形式:>>>m=lambda a,b:a+b
>>>m(5,4)
9
lambda 參1,參2,...:表達(dá)式 (注意縮進(jìn),否則會出現(xiàn)unexcepted error)
幾個(gè)特殊的函數(shù)
1.filter(函數(shù),可迭代對象如列表等),他是個(gè)過濾器,列表中的符合函數(shù)規(guī)則的元素過濾出來,以列表形式返回。
如:def mod1 (a):
return (a%2==0)
list2=filter(mod1,range(1,10))
print list2
--> [2, 4, 6, 8]
2.map(函數(shù),可迭代對象如列表等),其的作用是對整個(gè)列表的元素進(jìn)行檢查是否滿足函數(shù),并且以列表形式返回True或False
如 def mod1 (a):
return (a%2==0)
list3=map(mod1,range(1,10))
print list3
[False, True, False, True, False, True, False, True, False]
3.reduce(函數(shù),可迭代對象如列表等),其可以實(shí)現(xiàn)連續(xù)處理功能。其作用是先把列表中第一個(gè)值和第二個(gè)值當(dāng)參數(shù)傳給function,再把function的返回值和第三個(gè)值當(dāng)參數(shù)傳給function,然后只返回一個(gè)結(jié)果。
話不多說,給個(gè)例子吧
計(jì)算1+2+3+...+100
python里就一句話
a=reduce((lambda x, y:x+y),range(1,101))
print a
-->5050 (好吧,我錯(cuò)了,寫了兩句。。)
首先將range(1,101)即列表(1,2,...,100)的第一個(gè)元素1,和第二個(gè)元素2,拿出來進(jìn)行+運(yùn)算,再把返回值3和列表中的第三個(gè)元素3相加,然后把返回值6再與列表中第四個(gè)元素4相加。。如此不斷下去,直至全部加完為止。如果用C的話,大概要十行吧。。
將上訴例子的+換成*就可以計(jì)算100!,very easy吧??梢栽囋囉?jì)算10000!來測試你的機(jī)器性能啊,我的機(jī)器只能算到1w!了,10w!等幾分鐘都不會出結(jié)果。。
這里有一個(gè)求素?cái)?shù)的代碼,如果是C/C++的話,起碼二十行吧,這里也是一行
0~100的素?cái)?shù)代碼:
print [x for x in range(1,101) if not [y for y in range(2,x/2+1)if x%y==0]]
異常
1.try和except
類似if和else,如果未發(fā)生錯(cuò)誤,先執(zhí)行完try塊中的代碼,并完全跳過except,若發(fā)生錯(cuò)誤,則跳到except塊開始執(zhí)行代碼,稱為“異常被捕獲了”。注意:try代碼塊只執(zhí)行到第一句發(fā)生錯(cuò)誤的代碼
try:
①x=1/0.3
②print ''reciprocal of 0.3 is'',x
③x=1/0.0
④print ''receprocal of 0.0 is'',x
except:
⑤print ''error: no reciprocal''
⑥ ...
執(zhí)行順序:①②③⑤⑥
在try/except后可添加else塊,來告訴python在無異常時(shí)發(fā)生的事。
注意:只有try中所有代碼被正確執(zhí)行,才會執(zhí)行else塊中的代碼。
2.異常對象
python在引發(fā)一個(gè)異常后,會創(chuàng)建一個(gè)用于存放錯(cuò)誤信息的對象,可以在except中指定具體的異常
values=[-1,0,1]
for i in range(4):
try:
r=1.0/values[i]
print ''reciprocal of'',values[i],''at'',i,''is'',r
except IndexError:
print ’Index'',i,''out of range''
except ArithmeticError:
print ''unable to calculate reciprocal of'',values[i]
如果要知道具體的異常,可以把異常賦給變量
except IndexError,e:
print ''error:'',e
3.自己引發(fā)異常,通過raise
def divide(top,butttom):
if buttom==0:
raise ValueError(''divisor is zero'')
else:
return top/bottom
for i in range(-1,2):
try:
print divide(1,i)
except ValueError,e:
print ''Caught except for'',i
面向?qū)ο缶幊蘋OP
1.類中的方法至少有一個(gè)參數(shù)self,函數(shù)前都有def,沒有返回值類型,這一點(diǎn)太棒了,直接在末尾return 任何東西都可以,返回字符串啊,甚至是列表,還可以是一句話。。如果在C/C++中那肯定要跪,你肯定要寫很多其他的東西才能實(shí)現(xiàn)該功能。
一些內(nèi)置函數(shù):
def __init__(self,a,b,c):
self.a=a
self.b=b
self.c=c
因?yàn)閜ython會自動(dòng)將對象本身的引用當(dāng)做參數(shù)傳給方法的第一個(gè)參數(shù),類似的還有
def __str__(self):
return ''...'' (此函數(shù)是類中的輸出函數(shù),最好用return把。。)
實(shí)例化直接傳參就可以了
如:time1=Time(10,2,45)
2.運(yùn)算法重載
python中的運(yùn)算符重載比C++中簡單多了。。直接在類中傳遞一個(gè)self,還有另一個(gè)參數(shù)即可。適用于單目和雙目運(yùn)算符的重載
例如重載實(shí)例:
def __add__(self,other): #reload std return "%s : %s : %s" %(self.hour +other.hour,self.minute+other.minute,self.second+other.second)
def __lt__(self,other): # "<" pass
def __call__(self,index): # __builtin__ "()" reload
if (index=="Hour"):
print "~~"
else:
print ".."
def __getitem__(self,index): #__builtin__ "[]" reload return index *2
注意重載的運(yùn)算法只能在類的實(shí)例中使用
3.類的繼承
class People:
def __init__(self,num,name): #成員變量初始化函數(shù)
self.num=num
self.name=name
...
class Teacher(People):
def __init__(self,num,name,colledge):
People.__init__(self,num,name)
self.college=college 只有在很復(fù)雜的情況下才會用到私有繼承,默認(rèn)是共有繼承,直接把父類放入括號中,若有多個(gè)父類,用逗號隔開
GUI圖形用戶界面
1. 利用 Tkinter 模塊
from Tkinter import *
import Tkinter as tk (這樣寫后面的Tkinter就可以用tk替代)
import sys (用于導(dǎo)入退出程序的函數(shù)等,如sys.exit())
一些插件:
Button,Canvas,Checkbutton(復(fù)選框),Radiobutton(單選框),Entry(單行文本框),Text(多行文本框) Label(顯示文本的單個(gè)行),Listbox(下拉列表),Menu(下拉菜單),Message(顯示文本多個(gè)行)
======================================================================================================================== Label
Label是最簡單的插件,顯示一小條文本,需置入父插件中
from Tkinter import *
window=Tk()
label=Label(window,text=''hello'').pack()
首先得先制造處窗口,通過tk.Tk()即可,然后所有的子插件都嵌套在window中。對window這個(gè)窗口可以進(jìn)行設(shè)置,通過
window.geometry("300x400+120+100") #windows'' scale and its positionwindow.title("This is just a window...")
注意geometry內(nèi)是字符串,第一個(gè)是length,第二個(gè)是width,之間用x(不是乘號,而是字母x),接下來第三第四個(gè)是窗口左上角的位置坐標(biāo),用加號連接。
2.要注意插件的配置一旦確立,若要更改則需用config方法修改插件的很多屬性
這里有一個(gè)動(dòng)態(tài)顯示Label文本的方法
...
import time
...
label=Lable(window,text=''Hello'')
time.sleep(2)
label.config(text=''Kitty'')
3.要讓插件的值發(fā)生變化,可以用可變類型來實(shí)現(xiàn)
共有四種:IntVar(),StringVar(),BooleanVar(),DoubleVar()
可變類型的值是通過set和get方法來設(shè)置和獲取的。
from Tkinter import *
window=Tk()
data=StringVar()
data.set(''Data to display'') #設(shè)置初始值
label=Label(window,textvariable=data).pack()
window.mainloop()
4.上面的是把插件直接一股腦的丟進(jìn)window一個(gè)窗口上,為了更好的安排插件的位置,可以利用Frame(框架)來將一些插件置于frame內(nèi),其實(shí)就是在窗口畫出一個(gè)框來。
顯然,將插件置于frame框中只需將window改成frame即可
如:frame=Frame(window).pack()
first=Label(frame,text=''first Label'').pack()
有時(shí)候第一個(gè)說明父插件的參數(shù)可以省略。默認(rèn)是window
5.可以將frame修改參數(shù)讓其可見,修改boardwidth(默認(rèn)為0)值即可。同時(shí)可以更改樣式relief,改成‘ sunken’,‘raised’,‘groove’等,這些屬性在其他的一些插件如Entry,Text中也有。
6.一些其他的樣式處理
eg:
label=Label(window,text="hello",bg=''green'',fg=''white'',font=(''Curier'',14,''bold italic'').pack()
bg是background,設(shè)置背景顏色,fg是fontground ??設(shè)置字體顏色。bold是粗體,對應(yīng)的normal是細(xì),italic是斜體,roman是不傾斜的。
7.插件的布局
可以看到所有的插件都會有.pack(),當(dāng)然window就沒有了。pack函數(shù)是將子插件置入父插件中,父插件是傳入的第一個(gè)參數(shù),pack內(nèi)可傳入side=‘left’等參數(shù),從而確定該插件的具體安放位置。
另一中方法是grid(row=100,column=100),用于確定具體的網(wǎng)格以便與安放插件。
但兩種方法不可以混用。
8.函數(shù):更好的實(shí)現(xiàn)交互
為了實(shí)現(xiàn)某些插件(如按鈕等)的功能,需要用到函數(shù) .(...,command=函數(shù)名)即可。注意:等號后面的函數(shù)是不允許帶參數(shù)的,目的是以同一種方式調(diào)用他們。
如:
from Tkinter import *
window = Tk()
counter=IntVar()
counter.set(0) #設(shè)置計(jì)數(shù)器初值
def click(var,value):
var.set(var.get()+value)
frame=Frame(window)
frame.pack()
button1=Button(frame,text="Up",command=lambda:click(counter,1)).pack()
button1=Button(frame,text="Down",command=lambda:click(counter,-1)).pack()
label=Label(frame,textvariable=counter).pack()
window.mainloop()
上面的代碼功能:通過點(diǎn)擊“Up”和“Down”兩個(gè)按鈕來實(shí)現(xiàn)對計(jì)數(shù)器counter的加1或減1操作,并將counter的值傳給Lable的textvariable,從而在label中顯示。
在 click函數(shù)中,有兩個(gè)參數(shù),其中形參Var會由實(shí)參IntVar型的counter代替,value則會被1或-1代替。
在前面說過command后面的函數(shù)是不帶參數(shù)的,故這里用lambda函數(shù),否則你就要寫連個(gè)command=clickup,command=clickdown。lambda函數(shù)是沒有名字的函數(shù),常用于定義動(dòng)作,可以避免全局變量的使用。
9.其他一些插件
① Text
text=Text(frame,heigth=10,width=10).pack()
Text插件還有很多其他的方法,這里略去
②Checkbutton
checkbutton=Checkbutto(frame,text=''...'',variable=...).pack()
③ Radiobutton
Radiobutton(root, text = j, value = i,variable = food).pack()
④Scale 進(jìn)度條
scale = Scale(root , from_= 1, to = 20 ,resolution = 1 ,orient=''horizontal'',variable = speed)
scale.pack(side = "left")
注意:Scale插件中是 from_=下限,to=上限,resolution是精度,orient 來定義橫放豎放,默認(rèn)是豎放。
⑤ tkMessageBox
這是彈出一個(gè)新的對話框,前面需有import tkMessageBox
tkMessageBox.askquestion("Who is Naruto?"," A main role in a famous cantoon",icon = "warning")
最后附上自己寫的第一個(gè)GUI程序源碼,第一次寫,雖然很挫,功能很少,有很多界面上的功能都是騙人的。。但還是不加修改的直接拿上來了,權(quán)當(dāng)紀(jì)念一下我的8天python之旅吧。。
# -*- coding:UTF-8 -*-
import Tkinter as tk
from Tkinter import *
import sys
import tkMessageBox
root=tk.Tk()
root.geometry(''300x440+200+330'')
root.title("Your Favorite Person")
_nameNum=IntVar()
wordsAC = StringVar()
points=StringVar()
wordsinput=StringVar()
def _chooseBox():
tkMessageBox.askquestion(" ","You should click OK not this button...",icon="warning")
print _nameNum.get()
def _wordAfterChoosing():
tkMessageBox.askquestion("Your choose",''Waw,I like the role too!'',icon="warning") #第一行是標(biāo)簽,第二行是輸出
def authorDisplay():
tkMessageBox.askquestion("Your choose",''Yan Chuan'',icon="warning")
def Advice():
tkMessageBox.askquestion("Advice",''Your advice have already sent to the Author Haha, I lied to you!'',icon="warning")
def Points():
print points.get()
def textBox():
print wordsinput.get()
tk.Label(fg=''purple'',text=''Who is your favorite?'').pack()
tk.Button(fg=''blue'', text=''please choose yours'',command=_chooseBox).pack()
namelist=[''Naruto'',''Sasuke'',''Sakura'',''Haku '',''Tsunade'',''Gaara '',''Itachi '',''Others'']
for i ,j in enumerate(namelist):
tk.Radiobutton(root,fg=''blue'',text=j,value=i,variable=_nameNum).pack()
tk.Button(fg=''red'',text=''OK'',command=_wordAfterChoosing).pack()
tk.Button(fg=''red'',text=''Author'',command=authorDisplay).pack(side=''left'')
tk.Button(fg=''blue'',text=''Advice'',command=Advice).pack(side=''left'')
tk.Label(fg=''red'',text="Please give a point for the software").pack()
scale=Scale(root,from_=1,to=5,resolution=1,orient=''horizontal'',variable=points).pack()
tk.Entry(relief="sunken",textvariable=wordsinput).pack()
Button(fg="blue",text="submit",command=textBox).pack()
tk.Button(fg="red",text=''exit'',command=sys.exit).pack()
tk.mainloop
最后如果發(fā)現(xiàn)錯(cuò)誤,還請大家提一下,畢竟水平有限。對了,忘記說了,電腦同時(shí)可以安裝python2和python3的。。。你可以兩個(gè)同時(shí)玩。。