Python 圖形界面

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里設置方位才能用的,stickyanchor功能一樣,參數(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-不驗證,也是默認情況,不過說是驗證,其實就是返回TrueFalse,然后還需要一個validatecommandinvalidcommand(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(),返回的是yesno,還有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)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容