Python的GUI編程(TK)


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 Opencv 內容


Python的tkinter參考:http://effbot.org/tkinterbook

畫布視頻流:https://stackoverflow.com/questions/35319531/python-tkinter-canvas-root-after-maximum-recursion-depth-exceeded

教程參考:潭州教育


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM