TK在大多數 Unix平台、Windows平台和Macintosh系統都是預裝好的,TKinter 模塊是 Tk GUI 套件的標准Python接口。可實現Python的GUI編程。
Tkinter模塊("Tk 接口")是python的標准Tk GUI工具包的接口.Tk和Tkinter可以在大多數的Unix平台下使用,同樣可以應用在Windows和Macintosh系統里.Tk8.0的后續版本可以實現本地窗口風格,並良好地運行在絕大多數平台中。(百度百科)
一般的環境里直接import tkinter即可使用,但Ubuntu里既然沒有,所以要自己安裝,因為筆者Ubuntu系統里默認有python2,python3是自己后來安裝的,查閱資料得到結果是tkinter安裝成功后,並沒有和python3成功鏈接,需要重新安裝python3才可以。
安裝:sudo apt-get install python-tk
安裝:sudo apt install tk-dev
重新安裝python3環境:
進入python版本解壓目錄:cd python3.7
命令:./configure
命令:make
命令:sudo make install
顯示圖片需安裝pillow庫 :
指定版本安裝:sudo pip3 install Pillow==4.3.0
下面先用一個小爬蟲程序入門python的tkinter編程:
效果:
程序:
1 from tkinter import * 2 from tkinter import messagebox 3 from PIL import Image,ImageTk 4 import re #正則表達式 5 import requests 6 def butonck(): 7 #改變lab顏色 8 labelx["fg"]="green" 9 #獲取輸入框值 10 textx=entryx.get() 11 #去掉字符串前后空格 12 textx=textx.strip() 13 if textx=='': 14 #彈出提示框 15 messagebox.showinfo("東東提示","輸入不可為空") 16 else: 17 #字典數據 18 datax={ 19 "word":textx, 20 "sizes":60, 21 "fonts":"lfc.ttf", 22 "fontcolor":"#000000" 23 } 24 rx=requests.post("http://www.uustv.com/",data=datax) 25 rx.encoding="utf-8" 26 htmlx=rx.text #網站源碼 27 zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括號里的.*?表示要取的值 28 #取圖片地址 29 imagex=re.findall(zz,htmlx) 30 #取圖片數據 31 imagedatax=requests.get("http://www.uustv.com/"+imagex[0]).content 32 #打開文件 33 ff=open('{}.gif'.format(textx),"wb") 34 #寫圖片數據 35 ff.write(imagedatax) 36 # 37 bmx=ImageTk.PhotoImage(file='{}.gif'.format(textx)) 38 lab2=Label(rview,image=bmx) 39 lab2.bm=bmx 40 lab2.grid(row=2,columnspan=2) 41 #創建窗口 42 rview=Tk() 43 #標題 44 rview.title("東小東標題黨") 45 #窗口大小 長高用小寫x隔開 46 #rview.geometry("600x300") 47 #窗口基於屏幕的坐標 +x軸+y軸 48 rview.geometry("+500+200") 49 #創建lab標簽 50 labelx=Label(rview,text="簽名",fg="red",font=("宋體",30)) 51 #顯示lab標簽 網格布局 sticky=W #左對齊 E為右對齊 默認為中間對齊 52 labelx.grid(row=0,column=0) 53 #創建輸入框 54 entryx=Entry(rview,font=("宋體",20)) 55 #顯示輸入框 56 entryx.grid(row=0,column=1) 57 #創建按鈕 58 buttonx=Button(rview,text="確定",font=("宋體",30),command=butonck) 59 #顯示按鈕 60 buttonx.grid(row=1,column=2) 61 #顯示后改變按鈕屬性 62 #buttonx["width"]=2 63 64 65 #消息循環 顯示窗口 66 rview.mainloop()
其他補充:
按鈕標簽:
設置是否可點擊buttonx.config(state=DISABLED)//不可按 NORMAL為正常
改變文字:buttonx["text"]="改變文字"
Lab標簽:
改變文字內容:labx.config(text="改變文字")
改變文字樣式:labx.config(font=("xx",100,"bold")) #字體,大小,加粗
獲取標簽上的內容:constr=labx["text"]
對齊方式為左上角:Label(rootv,text="123",justify=LEFT,font=("宋體",19),width=15,height=6,anchor='nw')
grid為表格布局
lab2.grid(row=2,columnspan=2)#columnspan為跨兩列,對應 rowspan為跨行
sticky=“ew”#橫向占滿填充
其它屬性:
padx和pady=10 #設置邊距
bg為背景色;fg為前景色
布局默認:將頁面尺寸去掉,則自動根據內容大小動態包裹
鼠標移動到此次改變箭頭樣式:標簽.config(cursor="gumby")
對齊方式:anchor=W //W左E右
浮雕效果:relief=SUNKEN
pack布局:
標簽.pack()默認為上居中隨窗口移動不變
標簽.pack(fill=X)#橫向大小填充,內容居中
標簽.pack(fill=BOTH,expand=True)#縱向大小填充,內容居中
標簽.pack(fill=BOTH,expand=True)#填充全部,內容居中
標簽.pack(side=LEFT) #全部向左靠
加載一張圖片:
imgx = PhotoImage(file='dong.gif')
label = Label(image=imgx, width=20,height=20)
label.image = imgx
label.grid(row=1, column=1, sticky=W + E + N + S, padx=10, pady=10) #sticky=W + E + N + S 表示填充控件
可綁定的事件:
單擊鼠標左鍵:<Button-1> #其中1為鼠標左鍵,2為鼠標右鍵,3為鼠標中鍵
左鍵移動:<B1-Motion>
左鍵釋放:<ButtonRelease-1>
雙擊左鍵:<Double-Button-1>
進入:<Enter>
離開:<Leave>
獲得光標:<FocusIn>
光標離開:<FoucusOut>
回車鍵:<Return>(F1,F2,F3,Delete…)
按任意鍵:<Key>
事件處理函數形參可用值:
輸出點擊的坐標:event.x event.y 如:<Button-1>事件
輸出鍵盤按鍵對應的符號:event.char 如:<Key>事件
獲取鼠標點擊坐標實現:
關閉程序是出現彈出提示框:
子容器:
1 from tkinter import * 2 #創建窗口 3 rview=Tk() 4 #標題 5 rview.title("東小東") 6 #窗口基於屏幕的坐標 +x軸+y軸 7 rview.geometry("+500+200") 8 #創建lab標簽 9 labelx=Label(rview,text="父容器Lab",font=("宋體",30)) 10 #顯示lab標簽 網格布局 sticky=W #左對齊 E為右對齊 默認為中間對齊 11 labelx.grid(row=0,column=1) 12 13 #---------------------------------------------------------------------------- 14 15 # 創建一個子容器,其父容器為rview 16 monty = LabelFrame(rview, text="== 子容器標題 ==") 17 monty.grid(column=0, row=0,padx=5,pady=5) #設置子容器在父容器的位置 18 19 20 #創建子容器里的按鈕1 21 buttonx1=Button(monty,text="按鈕1",font=("宋體",20),fg="red") 22 buttonx1.grid(row=0,column=0) #設置按鈕在子容器的位置 23 24 #創建子容器里的按鈕2 25 buttonx2=Button(monty,text="按鈕2",font=("宋體",20),fg="green") 26 buttonx2.grid(row=1,column=0) #設置按鈕在子容器的位置 27 28 #--------------------------------------------------------------------------- 29 30 #消息循環 顯示窗口 31 rview.mainloop()
輸入框內容操作
1 from tkinter import * 2 3 def butonck(): 4 print(entryx.get())#輸出輸入框值 5 6 #創建窗口 7 rview=Tk() 8 #標題 9 rview.title("123") 10 #窗口大小 長高用小寫x隔開 11 #rview.geometry("600x300") 12 #創建lab標簽 13 labelx=Label(rview,text="輸入:",fg="red",font=("宋體",30)) 14 #顯示lab標簽 網格布局 sticky=W #左對齊 E為右對齊 默認為中間對齊 15 labelx.grid(row=0,column=0) 16 #創建輸入框默認顯示 17 entext = StringVar() 18 #創建輸入框 19 entryx=Entry(rview,font=("宋體",20),textvariable=entext) 20 #顯示輸入框 21 entryx.grid(row=0,column=1) 22 #創建按鈕 23 buttonx=Button(rview,text="確定",font=("宋體",30),command=butonck) 24 #顯示按鈕 25 buttonx.grid(row=0,column=2) 26 27 #------------------------------------------------- 28 #設置內容 29 entext.set('西') 30 #插入內容,最開始處 31 entryx.insert(0,'東') 32 #插入內容,光標位置開始 33 entryx.insert(INSERT,'想') 34 #插入內容,末尾 35 entryx.insert(END,'想') 36 #-------------------------------------------------- 37 38 #消息循環 顯示窗口 39 rview.mainloop()
文本框加滾動條實現:
1 from tkinter import * 2 #創建窗口 3 rview=Tk() 4 #標題 5 rview.title("東小東") 6 #窗口基於屏幕的坐標 +x軸+y軸 7 rview.geometry("+500+200") 8 #創建lab標簽 9 labelx=Label(rview,text="文本框實現",font=("宋體",30)) 10 #顯示lab標簽 網格布局 sticky=W #左對齊 E為右對齊 默認為中間對齊 11 labelx.grid(row=0,column=0) 12 13 #---------------------------------------------------------------------------- 14 15 # 創建一個縱向滾動的滾動條,打包到窗口右側,鋪滿Y方向 16 scrollbar = Scrollbar(rview, orient=VERTICAL,bg="red") # orient默認為縱向 17 scrollbar.grid(row=2,column=0) 18 19 # 打包一個文本域到窗口,y方向滾動文本的監聽丟給滾動條的set函數(文本域主動關聯滾動條) 20 #高度和寬度確定的是字符個數(win) 21 text = Text(rview, width=50,height=10, yscrollcommand=scrollbar.set) 22 text.grid(row=2,column=0) 23 24 # 拉動滾動條時,改變文本域在y方向上的視圖(滾動條主動關聯文本域) 25 scrollbar.config(command=text.yview) 26 27 #--------------------------------------------------------------------------- 28 29 #消息循環 顯示窗口 30 rview.mainloop()
添加操作屬性:
text.delete(0.0, END)#清空文本框
text.insert(END, "追加的內容")
將opencv的圖片轉換到TK:
from PIL import Image, ImageTk
1 cv2image = cv2.cvtColor(tux, cv2.COLOR_BGR2RGBA) # 轉換顏色從BGR到RGBA 2 current_image = Image.fromarray(cv2image) # 將圖像轉換成Image對象 3 imgx = ImageTk.PhotoImage(image=current_image) 4 label = Label(image=imgx) 5 label.image = imgx 6 label.grid(row=1, column=0, rowspan=4, sticky=W + E + N + S, padx=10, pady=10) # sticky=W + E + N + S 表示填充控件
opencv視頻流顯示在TK
通過lab的方式會出現閃爍,通過畫布方式完美解決
1 import threading 2 import cv2 3 from tkinter import * 4 from PIL import Image, ImageTk 5 from tkinter import ttk 6 7 rootv = Tk() 8 rootv.title("東小東") 9 10 #創建lab標簽 11 labelx=Label(rootv,text="東小東TK視頻流",fg="red",font=("宋體",30)) 12 labelx.grid(row=0,column=0) 13 14 #創建一個畫布 15 canv = Canvas(rootv,width=640,height=480,bg = 'red') 16 canv.grid(row=1,column=0) 17 18 def show_video(): 19 global labelvvv 20 vix=cv2.VideoCapture(2) #打開攝像頭 21 #imgtk='' 22 while True: 23 ret,tu=vix.read() #ret為返回值,tu為當前幀 24 tu1=cv2.flip(tu,1)#圖像反轉,1為左右對換,-1為上下對換 25 cv2image = cv2.cvtColor(tu1, cv2.COLOR_BGR2RGBA)# 轉換顏色從BGR到RGBA 26 current_image = Image.fromarray(cv2image) # 將圖像轉換成Image對象 27 imgtk = ImageTk.PhotoImage(image=current_image)#img 28 canv.create_image(0,0,anchor=NW,image=imgtk)#將圖片添加到畫布 29 obr = imgtk 30 31 #開啟線程 32 t1=threading.Thread(target=show_video,args=()) 33 t1.start() 34 35 rootv.mainloop() 36
Python的tkinter參考:http://effbot.org/tkinterbook
畫布視頻流:https://stackoverflow.com/questions/35319531/python-tkinter-canvas-root-after-maximum-recursion-depth-exceeded
教程參考:潭州教育