1. 程式人生 > >python tkinker庫模組詳解

python tkinker庫模組詳解

1、指令碼名稱不能命名為模組名,否則會報:

Traceback (most recent call last):
  File "C:/Users/Administrator/PycharmProjects/untitled/python/web/tkinter.py", line 1, in <module>
    import tkinter as tk
  File "C:\Users\Administrator\PycharmProjects\untitled\python\web\tkinter.py", line 2, in <module>
    root=tk.Tk()
AttributeError: module 'tkinter' has no attribute 'Tk'

2、tkinter基本用法

import tkinter as tk
#建立一個主視窗
root=tk.Tk()
#設定主視窗物件的標題欄
root.title("func")
#新增一個Label元件,可以顯示文字、圖示或者圖片
theLabel=tk.Label(root,text='this is a funck you')
#然後呼叫Label元件下的pack()方法,用於自動調節元件自身的尺寸
theLabel.pack()
#顯示視窗命令
root.mainloop()

Label元件:標籤,用於介面輸出描述的標籤,用法:
theLabel=tk.Label(root,text='this is a funck you',justify=LEFT,padx=10,image=photo,compound=CENTER,font=('宋體',20),fg='white')
root為主視窗物件,text為介面顯示的資訊,justify為顯示的資訊的顯示樣式,padx為樣式與邊框之間的距離,image為載入的圖片,compound為文字和影象的混合模式font 設定字型和字號,fg設定字型顏色,textvariable 為動態標籤
theLabel.pack()

Button元件:用於實現一個按鈕,點選按鈕可以呼叫其他命令,需要重新定義主視窗
from tkinter import *
import sys
#建立一個主視窗
sys.stdout.flush()
root=Tk()
#標籤物件
frame1=Frame(root)
#影象物件
frame2=Frame(root)
def callback():
    var.set("funck you")
var=StringVar()
var.set("this is a dangous pig")
textlabel=Label(root,text='dsfdasfdsfds',justify=LEFT)
textlabel.pack(side=LEFT)
photo=PhotoImage(file=r'C:\Users\Administrator\Desktop\106\data\pic\左中右\k線圖.gif')
imglabel=Label(frame1,image=photo)
imglabel.pack(side=RIGHT)
thebutton=Button(frame2,text='fsdfgdsgdsgwerwr',command=callback)
thebutton.pack()
frame1.pack(padx=10,pady=10)
frame2.pack(padx=10,pady=10)
mainloop()

Checkbutton元件:多選按鈕,Radiobutton是單選按鈕
from tkinter import *
root=Tk()
#用於表示該按鈕是否被選中
v=IntVar()
c=Checkbutton(root,text='測試一下',variable=v)
c.pack()
#如果選項被選中,那麼變數v被賦值為1,否則為0
#可以用動態標籤動態展示
l=Label(root,textvariable=v)
l.pack()
mainloop()

Checkbutton實現多選:選項的對齊方式使用anchor,N、NE、E、SE、S、SW、NW和CENTER  上北下南左西右東
from tkinter import *
root=Tk()
girls=['西施','王昭君','貂蟬','楊玉環']
v=[]
for girl in girls:
    v.append(IntVar())
    b=Checkbutton(root,text=girl,variable=v[-1],justify=LEFT)
    b.pack(anchor=W)
mainloop()
from tkinter import *
root=Tk()
langs=[("python",1),("python1",2),("python2",3),("python3",4)]
v=IntVar()
v.set(1)
for lang,num in langs:
    #indicatoron控制按鈕形式,False為框,預設為小圓圈
    b=Radiobutton(root,text=lang,variable=v,value=num,indicatoron=False)
    b.pack(anchor=W)
mainloop()
LabelFrame元件:是Frame框架的進化版,從形態上來說,就是給label添加了Frame,
from tkinter import *
root=Tk()
group=LabelFrame(root,text='最好的指令碼語言是?',padx=5,pady=5)
group.pack(padx=10,pady=10)
langs=[("python",1),("python1",2),("python2",3),("python3",4)]
v=IntVar()
v.set(1)
for lang,num in langs:
    b=Radiobutton(group,text=lang,variable=v,value=num)
    b.pack(anchor=W)
mainloop()
Entry元件,輸入框,可以控制輸入內容的合法性
from tkinter import *
root=Tk()
e=Entry(root)
e.pack(padx=20,pady=20)
e.delete(0,END)
e.insert(0,"預設")
mainloop()
from tkinter import *
root=Tk()
#tkinter總共提供了三種佈局元件的方法,pack(),grid()和place()
#pack(fill=X) X表示橫向 Y表示縱向 
#grid()方法允許你用表格的形式來管理元件
#place() relx rely
#row 行,column 列
Label(root,text='作品').grid(row=0)
Label(root,text='作者').grid(row=1)
v1=StringVar()
v2=StringVar()
e1=Entry(root,textvariable=v1)
e2=Entry(root,textvariable=v2,show='*')
e1.grid(row=0,column=1,padx=10,pady=5)
e2.grid(row=1,column=1,padx=10,pady=5)
def show():
    print("作品:《%s》"%(e1.get()))
    print("作者: %s"%(e2.get()))
    e1.delete(0,END)
    e2.delete(0, END)
#如果表格大於元件,那麼可以使用sticky選項來設定元件的位置
Button(root,text='獲取資訊',width=10,command=show).grid(row=3,column=0,sticky=W,padx=10,pady=5)
Button(root,text='退出',width=10,command=root.quit).grid(row=3,column=1,sticky=E,padx=10,pady=5)
mainloop()

focus:當Entry元件獲得或者失去焦點的時候驗證
focusin 當Entry元件獲得焦點的時候驗證
focusout 當Entry元件失去焦點
key 當輸入框被編輯的時候驗證
all 當出現上面任何一種情況的時候驗證
none 關閉驗證功能。預設為關閉,none為字串,而非None
from tkinter import *
root=Tk()
def test():
    if e1.get()=='小甲魚':
        print("正確")
        return True
    else:
        print("錯誤")
        e1.delete(0,END)
        return False
#文字變數
v=StringVar()
#validate 驗證
#validatecommand 驗證方法
e1=Entry(root,textvariable=v,validate='focusout',validatecommand=test)
e2=Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()
from tkinter import *
root=Tk()
def test():
    if e1.get()=='小甲魚':
        print("正確")
        return True
    else:
        print("錯誤")
        e1.delete(0,END)
        return False
def test1():
    print("我被呼叫了")
    return True
#文字變數
v=StringVar()
#validate 驗證
#validatecommand 驗證方法
e1=Entry(root,textvariable=v,validate='focusout',validatecommand=test,invalidcommand=test1)
e2=Entry(root)
e1.pack(padx=10,pady=10)
e2.pack(padx=10,pady=10)
mainloop()

#validatecommand方法只有在返回值為False的時候才被呼叫
當你輸入任何值的時候,只有把焦點轉移到第二個輸入框的時候,驗證功能才會被觸發,invalidcommand命令只有在validatecommand返回False時才能被呼叫。

'%d' 操作程式碼:0表示刪除操作;1表示插入操作;2表示獲得、失去焦點或textvariable變數的值被修改
'%i' 當用戶嘗試或刪除操作的時候,該選項表示插入或刪除的位置(索引號),如果是由於獲得、失去焦點或textvaliable變數的值被修改而呼叫驗證函式,那麼該值為-1
'%P' 當輸入框的值允許改變的時候,該值有效,該選項表示文字被插入和刪除的內容
'%s' 該值為呼叫驗證函式前輸入框的文字內容
'%S' 當插入或者刪除操作觸發驗證函式的時候,該值有效
該選項表示文字被插入和刪除的內容
'%v' 該元件當前的validate選項的值
'%V' 呼叫驗證函式的原因,該值是focusin、focusout、key、forced中的一個
'%W' 該元件的名稱
validatecommand=(f,s1,s2,...)
f是驗證函式,s1,s2,s3是額外的選項,這些引數會依次傳給f函式,需要呼叫register()方法將驗證函式包裝起來.


from tkinter import *
root=Tk()
frame=Frame(root)
frame.pack(padx=10,pady=10)
v1=StringVar()
v2=StringVar()
v3=StringVar()
def test(content):
    if content.isdigit():
        return True
    else:
        return False
#register將函式封裝起來
testCMD=root.register(test)
Entry(frame,textvariable=v1,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=0)
Label(frame,text='+').grid(row=0,column=1)
Entry(frame,textvariable=v2,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=2)
Label(frame,text='=').grid(row=0,column=3)
Entry(frame,textvariable=v3,width=10,validate='key',validatecommand=(testCMD,'%P')).grid(row=0,column=4)
def calc():
    result=int(v1.get())+int(v2.get())
    v3.set(result)
Button(frame,text='計算結果',command=calc).grid(row=1,column=2,pady=5)
mainloop()
Listbox元件:對於Checkbutton多選按鈕和Radiobutton單選按鈕,固定視窗滿足不了,可以使用Listbox,配合使用insert方法
from tkinter import *
root=Tk()
theLB=Listbox(root,setgrid=True)
theLB.pack()
for item in ['雞蛋','鴨蛋','鵝蛋','李狗蛋']:
    theLB.insert(END,item)
#ACTIVE表示特殊的索引,表示當前被選中的專案
#Listbox元件根據selectmode選項提供了4種模式,SINGLE(單選),BROWSE(單選,拖到滑鼠鍵或者方向鍵),MULTIPLE(多選),EXTENDED(多選,但需要同時按住Shift和Ctrl),預設是BROWSE
theButton=Button(root,text='刪除',command=lambda x=theLB:x.delete(ACTIVE))
theButton.pack()
mainloop()

Scrollbar元件:為了在某一個獨立的元件而存在,1、設定該元件的yscrollbarcommand選項為Scrollbar元件的set()方法:
2、設定Scrollbar元件的command選項為該元件的yview()方法   設定滾動條
from tkinter import *
root=Tk()
sb=Scrollbar(root)
sb.pack(side=RIGHT,fill=Y)
lb=Listbox(root,yscrollcommand=sb.set)
for i in range(1000):
    lb.insert(END,i)
lb.pack(side=LEFT,fill=BOTH)
sb.config(command=lb.yview)
mainloop()

Scale元件:主要是通過滑塊來表示某個範圍內的一個數字,可以通過修改選項,當用戶輸入
from tkinter import *
root=Tk()
sb=Scrollbar(root)
sb.pack(side=RIGHT,fill=Y)
lb=Listbox(root,yscrollcommand=sb.set)
for i in range(1000):
    lb.insert(END,i)
lb.pack(side=LEFT,fill=BOTH)
sb.config(command=lb.yview)
mainloop()
Text元件:用於顯示和處理多行文字,主要目的是顯示多行文字,也常常用為簡單的文字編輯器和網頁瀏覽器使用.不僅支援插入和編輯文字,它還支援插入image物件和window元件.
from tkinter import *
root=Tk()
text=Text(root,width=30,height=20) #寬高設定必須大於圖片實際大小
text.pack()
text.insert(INSERT,"I funck you")
photo=PhotoImage(file=r'C:\Users\Administrator\Desktop\106\data\pic\左中右\k線圖.png')
def show():
    text.image_create(END,image=photo)
b1=Button(text,text="顯示K線圖",command=show)
text.window_create(INSERT,window=b1)
mainloop()

Indexes用法:用來指向Text元件中文字的位置,Text元件索引也是對應實際字元之間的位置
1、line.column:用行號和列號組成的字串是常用的索引方式,他們將索引位置的行號和列號以字串的形式表示出來,行號以1開始,列號以0開始.   "%d.%d"%(line,column)
指定超出現有文字的最後一行的行號,或超出一行中列數的列號都不會引發錯誤。解釋為已有內容末尾的下一個位置。也可以使用為浮點值。
2、line.end 行號加上字串表示改行的最後一個字元。
text.insert(INSERT,"I funck you")
print(text.get("1.2","1.end"))
3、INSERT:對應插入游標的位置
4、CURRENT:對應與滑鼠座標最接近的位置。不過,直到鬆開才會生效。
5、END:對應的Text元件的文字緩衝區最後一個字元的下一個位置
6、user-defined tags:代表可以分配給Text元件的特殊事件繫結和風格。
"%s.first"%tagname   使用tag的文字的第一個字元之前
"%s.last"%tagname    使用tag的文字的最後一個字元之後,語法表示標籤的範圍
Marks用法:嵌入到text元件文字中的不可見物件。Marks是指定字元間的位置,並且跟隨相應的字元一起移動。其中INSERT 和CURRENT和user-defined marks
tags用法:用於改變文字的字型、顏色、尺寸、SEL表示選中的內容
canvas通常用於顯示和編輯影象
from tkinter import *
import webbrowser
root=Tk()
w=Canvas(root,width=200,height=100)
w.pack()
#畫一條黃色的橫線
line1=w.create_line(0,50,200,50,fill='yellow')
#畫一條紅色的豎線(虛線)
line2=w.create_line(100,0,100,100,fill='red',dash=(4,4))
#中間畫一個矩形
rec1=w.create_rectangle(50,25,150,75,fill='blue')
#移動線圖
w.coords(line1,0,25,200,25)
#更改尺寸
w.itemconfig(rec1,fill='red')
w.delete(line2)
Button(root,text='刪除全部',command=(lambda x=ALL:w.delete(x))).pack()
mainloop()
當需要對Canvas物件進行修改的時候,可以使用coords、itemconfig()、move()方法 來移動畫布上的物件,或者使用delete()方法來刪除
w.create_rectangle 畫框   w.create_oval 繪製橢圓或者圓形  w.create_text 編輯文字  w.create_polygon 繪製多邊形
w.create_arc 弧形、弦、扇形  w.create_bitmap 內建的點陣圖檔案 w.create_line 畫線 w.create_window 元件

Menu元件:實現選單功能.
from tkinter import *
import webbrowser
root=Tk()
def callback():
    print("被呼叫了....")
def popup(event):
    menu.post(event.x_root,event.y_root)
#建立一個頂級選單
menubar=Menu(root)
#建立一個下拉選單"檔案",然後將它加入頂級選單裡面
filemenu=Menu(menubar,tearoff=False)
filemenu.add_command(label='開啟',command=callback)
filemenu.add_command(label='儲存',command=callback)
filemenu.add_separator()
filemenu.add_command(label='退出',command=root.quit)
menubar.add_cascade(label='檔案',menu=filemenu)
editmenu=Menu(menubar,tearoff=False)
editmenu.add_command(label='剪下',command=callback)
editmenu.add_command(label='拷貝',command=callback)
editmenu.add_command(label='貼上',command=callback)
menubar.add_cascade(label='編輯',menu=editmenu)
root.config(menu=menubar)
frame=Frame(root,width=512,height=512)
frame.pack()
frame.bind("<Button -3>",popup)
mainloop()

#Menubutton元件 和menu元件一致,但可以放在視窗的任意位置,並且按下出現彈出視窗。

from tkinter import *
root=Tk()
def callback():
    print("被呼叫了....")
mb=Menubutton(root,text='點我',relief=RAISED)
mb.pack()
#建立一個頂級選單
menubar=Menu(mb,tearoff=False)
#建立一個下拉選單"檔案",然後將它加入頂級選單裡面
filemenu=Menu(menubar,tearoff=False)
filemenu.add_checkbutton(label='開啟',command=callback,selectcolor='yellow')
filemenu.add_command(label='儲存',command=callback)
filemenu.add_separator()
filemenu.add_command(label='退出',command=root.quit)
mb.config(menu=filemenu)
mainloop()
OptionMebu元件:下拉選單的改進版,彌補了Listbox元件無法實現下拉列表框的遺憾。
from tkinter import *
options=['california','458','dfasf','dasd']
root=Tk()
variable=StringVar()
variable.set('you are a bitch')
w=OptionMenu(root, variable,*options)
w.pack()
def callback():
    print(variable.get())
Button(root,text='點我',command=callback).pack()
mainloop()

Message元件:是Label元件的變體,用於多行文字訊息顯示,並且能夠自動換行,調整文字尺寸使其適應給定的尺寸
from tkinter import *
root=Tk()
w1=Message(root,text='這是一則訊息',width=100)
w1.pack()
w2=Message(root,text='這是一則駭人聽聞的長春出差吃醋尺寸長春出差',width=100)
w2.pack()
mainloop()
Spinbox元件:是Entry元件的變體,用於從一些固定的值中選取一個。,區別:Spinbox可以通過範圍或者元祖指定使用者輸入內容。
from tkinter import *
root=Tk()
w=Spinbox(root,from_=0,to=10)
#values可以設定顯示特定的值#w=Spinbox(root,values=("傻逼",'逗比','二逼'))w.pack()
mainloop()

PanedWINDOW元件:是一個空間管理元件,和Frame類似,但允許讓使用者調整應用程式的空間劃分。
from tkinter import *
root=Tk()
m=PanedWindow(orient=VERTICAL)
m.pack(fill=BOTH,expand=1)
top=Label(m,text='top pane')
m.add(top)
bottom=Label(m,text='bottom pane')
m.add(bottom)
mainloop()

Toplevel元件:類似Frame元件,用在顯示額外的視窗、對話方塊和其他彈出視窗,attributes()方法用於設定和獲取視窗屬性,如果給出選項名,將返回當前視窗該選項的值。注意:以下選項不支援關鍵字引數,需要在選項前新增橫槓 並用字串的方式表示,用逗號隔開選項和值
from tkinter import *
root=Tk()
def create():
    top=Toplevel()
    top.title("Fishc Demo")
    top.attributes('-alpha',0.5)
    msg=Message(top,text=" fuck you")
    msg.pack()
Button(root,text='建立頂級視窗',command=create).pack()
mainloop()

事件繫結:包括使用者觸發的滑鼠、鍵盤操作和視窗管理器觸發的重繪事件,可以通過bind()方法將函式或者方法繫結到具體的事件上。當被觸發的事件滿足該元件繫結的事件時,Tkinter就會帶著事件描述去呼叫handler()方法。
from tkinter import *
root=Tk()
def callback(event):
    print("點選位置是:",event.x,event.y)
frame=Frame(root,width=200,height=200)
#bind是將函式繫結事件
frame.bind("<Button>",callback)
frame.pack()
mainloop()

事件序列:使用bind()方法將具體的事件序列與自定義的方法繫結。事件序列是以字串的形式表示的,可以表示一個或多個相關的事件。
事件序列使用語法:<modifier-type-detail>
type描述普通的事件型別,比如滑鼠的單擊或者鍵盤的單擊
modifier 可選,通常用於描述組合鍵
detail可選,用於描述具體的按鍵
<Button-1> 表示使用者單擊滑鼠左鍵
<KeyPress-H> 表示使用者按下H鍵
<Control-Shift-KeyPress-H> 表示使用者按下ctrl+shift+H
-----------------------------------------------------------------------------------------------
type:列舉部分常用的關鍵詞及含義:
Activate 當元件的狀態從未啟用變成啟用的時候觸發該事件。
Button 當用戶單擊滑鼠按鍵的時候觸發該事件。detail部分指定具體哪個按鍵:
<Button-1>滑鼠左鍵  <Button-2>滑鼠中鍵 <Button-3> 滑鼠右鍵 <Button-4>滾輪上滾(Linux) <Button-5>滾輪下滾
ButtonRelease當用戶釋放滑鼠按鍵的時候觸發該事件。
Configure 當元件的尺寸發生變化的時候觸發該事件。
Deactivate 當元件的狀態從啟用變成未啟用的時候觸發該事件。
Destroy 當元件被銷燬的時候觸發該事件
Enter 當滑鼠指標進入元件的時候觸發該事件。注意:不是使用者按下回車鍵
Expose 當視窗或者元件的某部分不再被覆蓋的時候觸發該事件
FocusOut 當元件失去焦點的時候觸發該事件
FocusIn 當元件獲得焦點的時候觸發該事件
KeyPress 當用戶按下鍵盤按鍵的時候觸發該事件
Leave 當滑鼠指標離開元件的時候觸發該元件
Map 當元件被對映的時候觸發該事件
Motion 當滑鼠在元件內移動的整個過程均觸發該事件
MouseWheel 當滑鼠滾動的時候觸發該事件 
modifier:
Alt:當按下Alt按鍵的時候
Any:表示任何型別的按鍵被按下的時候。<Any-KeyPress> 表示當用戶按下任何按鍵的時候觸發該事件
Control:當按下Ctrl按鍵的時候
Double:當後續兩個事件被連續觸發的時候。例如<Double-Button-1> 表示使用者雙擊滑鼠左鍵時觸發該事件
Lock當開啟大寫字母鎖定鍵的時候(CapsLock)
Shift 當按下Shift按鍵的時候
Triple 跟Double類似,當後續三個事件被連續觸發的時候