easygui
(用戶圖形界面,不建議在IDLE上打開)
下載和安裝
去下載,在命令行下:/路徑/python.exe easygui.py install,然后就可以在Lib\site-packages下看到安裝好的easygui.py了,可以用python.exe easygui.py 打開該文檔幫助
字體
如果要改字體什么的內容都可以去easygui.py里找到相應位置修改,比如字體是:PROPORTIONAL_FONT
控件
(1)msgbox('內容'):彈出一個通知框并顯示內容,一般都是先import easygui后在easygui.msgbox的,不過可以:from easygui import *,輸入后就可以直接用函數(shù)了,比如:msgbox('內容'),此時就直接彈出內容了,并且成功彈出后會返回一個'OK'
更多參考
http://bbs.fishc.com/thread-46069-1-1.html
tkinter
(自帶,且比前面那個要高級美觀)
1.基本配置語句
(1)Tk()
頂層窗口的對象,舉例:
root = tkinter.Tk() #生成一個頂層窗口的示例,用于容納所有內容
(2)title()
設置標題,舉例:
root.title('game')
(3)pack()
按添加順序排列組件,設置某個控件位置,不設置這個,控件就顯示不出來,里面有anchor(方位,N-north,W,E,S),side(位置,LEFT,RIGHT,CENTER),padx,pady(相對x,y距離,比如padx=10),fill(填充,=X則X軸上都填滿,=Y...),其中anchor是在pack里設置方位才能用的,sticky和anchor功能一樣,參數(shù)也是那四個,是在grid里面才能用的
(4)grid(row='',column=''[,sticky=''])
如果不用上面的pack(),也可以用grid,grid是按行/列形式排列組件,他所在的那個框架就變成類似表格形式,然后就可以給每個控件放到幾行幾列去,舉例:
Label(root, text='abc').grid(row=0, column=0,) #第一行第一列的label
(5)place(relx='',rely=''[relheight='',relwidth='',anchor=''])
運行指定組件的大小和位置,relx/y代表相對父組件的x/y軸位置(0代表最左邊,0.5代表中間,1表示右邊),relheight代表相對父組件大小的百分比(比如0.5代表父組件的一半大),因為place需要設置的東西很多,一般用不到,但在某些情況下還是很好用的,舉例:
Button(root, text='一定在最中間', bg='blue').place(relx=0.5, rely=0.5, relheight=0.75, relwidth=0.75, anchor=CENTER)
#最中間占原來0.75大的button
Button(root, text='一定在最中間', bg='green').place(relx=0.5, rely=0.5, relheight=0.5, relwidth=0.5, anchor=CENTER)
#最中間占原來0.5大的button
Button(root, text='一定在最中間', bg='red').place(relx=0.5, rely=0.5, relheight=0.25, relwidth=0.25, anchor=CENTER)
#最中間占原來0.25大的button
最終看起來是3個不同顏色的框框嵌套
(6)mainloop()
寫完窗口以后最后要有這一句才能顯示這整個窗口
(7)quit()
退出窗口
示例
from tkinter import *
class APP:
def __init__(self, master):
frame = Frame(master)
frame.pack(side=left,padx=100,pady=100)
#設置調整尺寸和顯示位置,如果括號里沒東西就按默認來
self.hi_there = Button(frame, text="abc",bg='black', fg="green", command=self.doone)
#設置一個button,frame是只在哪個框里,text是文本內容,bg是button的背景顏色
#fg是button文本顏色,command是事件,這里調用了下面的doone方法
self.hi_there.pack() #這里就默認位置了
self.hi_here = Label(frame, text='bbb') #設置一個標簽
self.hi_here.pack()
def doone(self):
print('111')
root = Tk() #生成一個頂層窗口的示例,用于容納所有內容
root.title('game') #設置標題
app = APP(root)
root.mainloop() #顯示這整個窗口
2.常用插件
(1)label
label(frame[,text='文本信息',textvariable='變量文本信息',image='',compound='圖片和文本混合模式',fg='字體顏色',bg='背景顏色',font='字體',justify='位置']),文本標簽,舉例:
label = Label(root, text='hello')
label.pack()
注:
text的內容是不會變的,如果想要變化就可以使用textvariable,舉例:
var = StringVar() #定義一個可變字符串
var.set('aaa') #設置字符串內容
label = Label(root, textvariable=var) #文本內容為可變變量
label.pack()
var.set('bbb') #改變文本顯示內容
root.mainloop()
最后會發(fā)現(xiàn)窗口顯示的是bbb
(2)PhotoImage
PhotoImage(file='xxx.gif'),圖片對象(貌似除了gif以外的都會失敗,而且gif圖在界面中還是靜態(tài)顯示),舉例:
from tkinter import * #不這樣的話每加一個控件就要thinker.一次,很麻煩,后面也都默認將tkinter的內容全部導入
photo = PhotoImage(file='e75a115bgy1fij374q7nrg20b40694qr.gif') #別忘了加上file=
img = Label(root, image=photo) #這里選擇的框架是整個窗口,也可以放在其他定義的框架里
img.pack(side=RIGHT,padx=10,pady=10) #這句是設置控件位置的,不弄會顯示不出來
root.mainloop()
注:
一個label如果放了圖片在放文本可能就會把文本蓋住,所以需要用到混合模式,此時文字就會在圖片上方,舉例:
photo = PhotoImage(file='e75a115bgy1fij374q7nrg20b40694qr.gif')
img = Label(root,justify=LEFT,image=photo,text='你好呀',compound=CENTER,font=('楷體',20),fg='white')
#設置了圖片和文本的混合模式,文字在中央
img.pack(side=RIGHT,padx=10,pady=10)
root.mainloop()
(3)Button
Button (frame[, text='', textvariable='',bg='', fg='', command='事件,一般是調用方法、函數(shù)'])
按鈕,舉例:
def abc():
print('hello')
button = Button(root, textvariable=var, command=abc) #點擊后會輸出hello
button.pack()
如果函數(shù)需要傳值,可以用匿名函數(shù),舉例:
def abc(x):
print(x)
button = Button(root, textvariable=var, command=lambda: abc('hello')) #點擊后會輸出hello
button.pack()
注:
事件的函數(shù)只要名字不要加括號,如果加了括號到時候button會自動運行一次這個函數(shù),而且以后按都沒效果了,就相當于init一樣
(4)Checkbutton
Checkbutton (frame[text='',variable='變量,代表是哪一個框',...]),復選框,舉例:
root.title('game')
alpha = ['a','b','c','d'] #存放每個框內容
al = [] #存放每個框的變量
lab = [] #存放顯示每個框是否被選中
for each in alpha:
al.append(IntVar())
#al是個整數(shù)變量列表,用于到時候判斷是哪一個變量,該變量選中時自動會變1,否則為0
b = Checkbutton(root, text=each, variable=al[-1])
#設置文本框內容為alpha內容,變量內容為每加上的最后一個,也就是最新加上的那個
b.pack(anchor=N) #設置方位為north
for each in range(len(alpha)):
lab.append(each) #設置和復選框同樣多大的變量
lab[each] = Label(root, textvariable=al[each])
lab[each].pack(anchor=S)
(5)Radiobutton
Radiobutton (frame[text='',variable='',value='這個變量的值,要和其他單選框的不同',indicatoron='False'...]),單選框,indicatoron默認為True,也就是傳統(tǒng)的那個樣子,改成False就會變成按鈕的樣子,舉例:
v = IntVar() #設置一個數(shù)字變量等會兒隨著選中框的值變化
alpha = [('a',1),('b',2),('c',3)]
for al, num in alpha:
Radiobutton(root, text=al, variable=v, value=num).pack() #value是每個單選框獨一無二的值
Label(root, textvariable=v).pack() #單選框選中哪個就會展示幾,比如選中2就會顯示2
v.set(1) #默認選中value為1的
(6)Frame
Frame (frame[text='',padx='',...),設置一個框架,舉例:
frame = Frame(root) #在這窗口里弄一個框架,可以把別的內容放這框架里
(7)LabelFrame
LabelFrame (frame[text='',...]),也是框架,但是有邊界顯示
(8)Entry
Entry (frame),輸入框,用get()讀取內容,用delete()清除內容,舉例:
def abc():
print('content is:%s' % (e1.get())) #輸出e1里的內容
e1 = Entry(root) #輸入框
e1.grid(row=0, column=1) #注意這里不能直接在上面一行同時定義了文本框和位置,否則等會兒消息會讀不出來
Button(root, text='click', command=abc).grid(row=2, column=0) #點擊后輸出內容
Button(root, text='quit', command=root.quit).grid(row=2, column=1) #點擊后退出,quit()可以退出程序
注:
對于像密碼框那樣我們想要顯示的內容是*那樣的話,只要在Entry里面加上show的參數(shù)就好了,舉例:
e1 = Entry(root, show='*')
注2:
其他比如想要驗證Entry框里的內容可以通過設置validate選項,focus-獲得或失去焦點時驗證、focusin-獲得時驗證、focusout-失去時驗證、key-輸入框編輯時驗證、all-上面任一情況時驗證,none-不驗證,也是默認情況,不過說是驗證,其實就是返回True和False,然后還需要一個validatecommand和invalidcommand(invalidcommand事件只有在返回為False時觸發(fā))事件來觸發(fā),舉例:
def test(): #如果內容為abc后臺就輸出right,否則輸出wrong,并清空文本框內容
if e1.get() == 'abc':
print('right')
return True
else:
print('wrong')
e1.delete(0, END) #從第0個刪除到最后一個字符
return False
def wrong():
print('返回為False')
e1 = Entry(root, textvariable=v, validate='focusout', validatecommand=test, invalidcommand=wrong)
#設置當移出這個框時觸發(fā),以及對應觸發(fā)事件test,還有返回為False出發(fā)wrong
e1.grid(row=0, column=1)
(9)Listbox
Listbox (),列表框,就是一大堆的那種,用insert()插入內容,delete()刪除內容,舉例:
lb = Listbox(root)
lb.grid(row=1)
for item in ['one','two','three','four']:
lb.insert(END,item)
#往Listbox插入內容,這里END表示從最后一個字符后面添加內容
#你也可以設置比如:0,代表從起始位置開始添加內容等
button = Button(root, text='刪除', command=lambda x=lb:x.delete(ACTIVE))
#點擊按鈕后會刪除對應的listbox選項,lambda參考前面匿名函數(shù)
#所以把lb傳到右邊x進行delete,ACTIVE表示當前選中的值,就像END表示最后一個字符所在位置
button.grid(row=2)
注:
這個列表框可以選擇單選或者多選,通過selectmode設置,其中:SINGLE表示單選,BROWSE也是單選(默認值),不過可以通過拖動鼠標或者方向鍵來改變選項,MULTIPLE表示多選,EXTENDED也是多選,但是需要按住shift才能實現(xiàn),舉例:
lb = Listbox(root, selectmode=MULTIPLE)
當感覺內容過多沒有全部顯示又想全部顯示時,可以設置height(默認是10),舉例:
lb = Listbox(root, selectmode=MULTIPLE, height=20)
(10) Scollbar
Scollbar(frame),滾動條,一般和別的組件一起使用,只要在需要使用滾動條的組件里加入yscrollcommand='實例化的滾動條'.set就行了,舉例:
sb = Scrollbar(root) #實例化滾動條
sb.pack(side=RIGHT, fill=Y) #滾動條在右邊的整個Y軸
lb = Listbox(root, yscrollcommand=sb.set) #lb的Y軸使用滾動條,X軸就xscrollcommand
lb.pack(side=LEFT, fill=BOTH)
for item in range(1000):
lb.insert(END,item)
sb.config(command=lb.yview) #原來只能通過滾輪滾動,加上這句可以用鼠標拖動滾動條
(11) Scall
Scall(frame[from_='',to='',tickinterval='',...]),有刻度的滾動條,用來提供一個確切的值,舉例:
Scale(root, from_=0, to=100, tickinterval=10, resolution=5, length=200).pack()
#因為要和from分開,所以用from_,跟class_一個道理
#然后from到to代表范圍,tickinterval是顯示精度,這里就是每10顯示一次
#resolution就是點滾動條一次移動多少,默認是1
#length代表像素長度,就是滾動條界面多長
(12) Text
Text(frame[,width='',height='行數(shù)',...),文本框,可以輸入東西的,但是比前面那個輸入框Entry強大,用insert()插入,get()獲取值舉例:
text = Text(root, width=10, height=2) #一行10個字符,共2行
text.pack()
text.insert(INSERT, 'ONE') #END表示在末尾,這個表示在輸入光標處
print(text.get('0.0', 'end')) #獲取所有文本框里值,如果不設置第二個參數(shù)則只能獲取值的第一位
注:
之所以說比Entry那些強大是因為其還可以插入其他組件在里面,比如插入一個Button:
text = Text(root, width=10, height=5)
text.insert(INSERT, 'ONE')
text.pack()
button = Button(text, text='我在text里面') #在text里新建一個Button
text.window_create(INSERT, window=button)
#text里面新建時要創(chuàng)建一個控件窗口用來顯示前面的Button,此時就相當于pack()了
#所以就不需要像原來那樣再有一個button.pack()了
插入圖片舉例
text = Text(root, width=10, height=5)
text.insert(INSERT, 'ONE')
text.pack()
photo = PhotoImage(file='a.gif')
text.image_create(END, image=photo) #插入的是圖片所以image_create
注:
還有好多功能,比如Index索引、Marks標記(選擇在文本的哪個地方插入,因為行列都是從1開始,所以1.2代表從第一行第二個字符后面插入)、Tags標簽(設置文本的那些內容的格式)
(13) Menu
Menu(frame),菜單,舉例:
def abc():
print('hello')
menubar = Menu(root)
menubar.add_command(label='hello',command=abc) #這里菜單欄上有一個hello的按鈕,按了就輸出hello
root.config(menu=menubar) #需要把frame和菜單關聯(lián)后才能顯示菜單
注:
前面那樣他們都是一個個單獨顯示,如果想象一般文件那樣點擊一個然后出來一排,例如點文件,出來保存、另存為啥的可以在原來的菜單里再加個菜單,舉例:
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=False) #在原來的菜單里再加個菜單,tearoff設置為False免得菜單可以單獨一個界面
filemenu.add_command(label='新建',command=abc)
filemenu.add_command(label='保存',command=abc)
filemenu.add_separator() #一個分割線
filemenu.add_command(label='退出',command=root.quit)
filemenu.add_cascade(label='文件',menu=filemenu) #這一行就是顯示這一個菜單的名稱,‘文件’顯示在哪,想想就知道了
root.config(menu=menubar)
(14) Menubutton
Menubutton(frame[,text='',relief='樣式',...]),按鈕菜單,點下會出現(xiàn)菜單,舉例:
mb = Menubutton(root, text='list', relief=RAISED)
mb.pack()
filemenu = Menu(mb, tearoff=False)
filemenu.add_command(label='hello',command=abc)
filemenu.add_command(label='hi',command=abc)
mb.config(menu=filemenu)
(15) OptionMenu
OptionMenu(frame[,variable,'var1','var2',...]),可選菜單,舉例:
var = StringVar()
var.set('a') #設置默認值為a
w = OptionMenu(root, var, 'a', 'b', 'c') #有a、b、c三個變量可選
w.pack()
上面那個可選變量如果傳入的是個列表,需要在前面加*,舉例:
content = ['a', 'b', 'c', 'd', 'e']
var = StringVar()
var.set(content[0])
w = OptionMenu(root, var, *content) #在content列表前加*
w.pack()
(16) Message
Message(frame[,text='',width='']),消息框,舉例:
mes = Message(root, text='this is message', width=100) #這里width是一行的長度
mes.pack()
(17) Spinbox
Spinbox(frame,from_='',to=''[,increment='每次的增/減度']),就是像一個文本框,旁邊有上下鍵,來增加/減少值,舉例:
w = Spinbox(root, from_=0, to=10, increment=2)
w.pack()
也可以是幾個內容在那里換:
w = Spinbox(root, values=('a','b','c','d','e'))
w.pack()
(18) PanedWindow
PanedWindow(),跟frame一樣也是個框架,但是這個的分布還有改變格式很方便
(19) messagebox
messagebox,對話框,都不需要Tk定義,舉例:
messagebox.askokcancel('game', '你確定?')
#第一個參數(shù)是標題,第二個是對話內容,可以print這個語句,當選擇確定輸出就是True
注:
除了askokcancel(),還有askquestion(),返回的是yes和no,還有askyesno()返回也是True
(20)filedialog
文件對話框,打開、保存文件用,舉例:
print(filedialog.askopenfilename(filetypes=[('TXT','.txt'),('PNG','.png'),('GIF','.gif')]))
#會出現(xiàn)一個要你打開文件的框,并且打開的文件類型從.txt/.png/.gif中選,返回的是路徑+文件名
print(filedialog.asksaveasfilename(defaultextension='.py'))
#會出現(xiàn)一個要你另存為文件的框,并指定了默認保存后綴為.py,返回的是路徑+文件名
(21) colorchooser
colorchooser,顏色選擇框,舉例:
print(colorchooser.askcolor()) #會打開打開一個顏色選擇框,返回顏色值
3.畫布
可以在上面添加直線、圖形啥的圖案,
定義
Canvas(frame[,width='',height='',...])
(1)圖形支持對象
包括arc-弧形、image-PhotoImage實例的對象、line-線、oval-橢圓、polygon-多邊形(傳入一個包含多個坐標的列表,他會自動連起來形成一個多邊形)、rectangle-矩形、text-文本、window-組件,舉例:
from tkinter import *
root = Tk()
w = Canvas(root, width=200, height=200)
w.pack()
w.create_line(0, 50, 200, 50, fill='red') #一條坐標從(0,50)到(200,50)的紅線
w.create_line(100, 0, 100, 100, fill='blue', dash=(4,4)) #一條虛線
w.create_rectangle(50, 25, 150, 75, fill='black', dash=(4,4))
#一個方形,前四個參數(shù)代表:padx,pady,lengthx,lengthy
w.create_oval(50, 25, 150, 75, fill='pink')
#橢圓,這里特地參數(shù)和上面方形的一樣,運行會發(fā)現(xiàn)這個橢圓的頂邊剛好和方形四邊貼合
#實際四個參數(shù)為:x-r,y-r,x+r,y+r,如果要圓形,就第一、四個參數(shù)和和第二、三個參數(shù)值的和一樣就行了
w.create_text(100, 50, text='content') #創(chuàng)建一個文本
root.mainloop()
(2)綁定事件
bind('綁定內容', '函數(shù)'),比如綁定鼠標左鍵按?。?/p>
from tkinter import *
root = Tk()
def paint(event):
x1, y1 = (event.x - 1), (event.y - 1)
x2, y2 = (event.x + 1), (event.y + 1)
w.create_oval(x1, y1, x2, y2, fill='red')
#描繪出鼠標左鍵點的地方,因為canvas沒有提供點,所以要畫點就可以用無敵小的圓來替代
w = Canvas(root, width=200, height=200)
w.pack()
w.bind('<B1-Motion>', paint)
#當按住鼠標左鍵時觸發(fā)paint事件,按住鼠標右鍵是<B3-Motion>
root.mainloop()
其他綁定
語法-<modifier-type-detail>
modifier
(可選,一般用于組合鍵)
<Alt>
<Control>
<Shift>
<Lock>:caps lock鍵(大小寫切換)
<Double>:后面那個事件執(zhí)行兩次,比如雙擊兩次——<Double-Button>
type
<Button>:鼠標隨便哪個鍵點擊
<Button-1>:鼠標左鍵點擊,和上面按住鼠標左鍵不一樣,前面那個按住移動能畫畫,這個只有點擊的那一下有東西
<Button-2>:鼠標中間滾輪點擊
<Button-3>:鼠標右鍵點擊
<ButtonRelease>:鼠標點擊松開時觸發(fā),比Button用的更多,因為Button在按下那一刻就觸發(fā),萬一突然發(fā)現(xiàn)不對勁...,然后對應的1是左鍵,2...
<Motion>:鼠標移動時
<Key>:鍵盤輸入
<KeyPress-A>:用戶按A鍵,其他同理
<KeyRelease>:松開按鍵時觸發(fā)
<MouseWheel>:鼠標滾輪時觸發(fā)
detail
可選,一般用于指定鼠標、鍵盤特定鍵
組合示例
<Control-Shift-KeyPress-A>:同時按control+shift+A
event對象:就是event的屬性,像event.x就是事件觸發(fā)時的坐標
x,y:當前鼠標位置坐標
char: 按鍵對應字符(鍵盤事件專屬)
keysym: 按鍵名(鍵盤事件專屬)
keycode: 按鍵碼(鍵盤事件專屬)
num:按鈕數(shù)字(鼠標事件專屬)
type: 事件類型
實例1.點擊左邊左鍵顯示當前點擊坐標
from tkinter import *
def location(event): #event是固定寫進去的
print('%d\t%d' % (event.x,event.y)) #事件的坐標
root = Tk()
frame = Frame(root, width=200, height=200)
frame.bind('<Button-1>', location) #綁定點擊左鍵時觸發(fā)
frame.pack()
root.mainloop()
實例2.鼠標實時位置
from tkinter import *
def location(event): #event是固定寫進去的
print('%d\t%d' % (event.x,event.y)) #事件的坐標
root = Tk()
frame = Frame(root, width=200, height=200)
frame.bind('<Motion>', location) #綁定點擊左鍵時觸發(fā)
frame.pack()
root.mainloop()
實例3.輸入鍵盤時顯示輸入字符
from tkinter import *
def location(event):
print(event.char) #輸入的字符
root = Tk()
frame = Frame(root, width=200, height=200)
frame.bind('<Key>', location) #綁定鍵盤輸入內容觸發(fā)
frame.focus_set() #當在frame里面輸入時才觸發(fā)
frame.pack()
root.mainloop()
畫圖板
自帶的turtle模塊可以進行畫圖,比如貪食蛇舉例:
import turtle
def drawSnake(rad, angle, len, neckrad):
for _ in range(len):
turtle.circle(rad, angle)
turtle.circle(-rad, angle)
turtle.circle(rad, angle / 2)
turtle.forward(rad / 2) # 直線前進
turtle.circle(neckrad, 180)
turtle.forward(rad / 4)
if __name__ == "__main__":
turtle.setup(1500, 1400, 0, 0)
turtle.pensize(30) # 畫筆尺寸
turtle.pencolor("green")
turtle.seth(-40) # 前進的方向
drawSnake(70, 80, 2, 15)