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 1 from tkinter import * 2 2 from tkinter import messagebox 3 3 from PIL import Image,ImageTk 4 4 import re #正则表达式 5 5 import requests 6 6 def butonck(): 7 7 #改变lab颜色 8 8 labelx["fg"]="green" 9 9 #获取输入框值 1010 textx=entryx.get() 1111 #去掉字符串前后空格 1212 textx=textx.strip() 1313 if textx=='': 1414 #弹出提示框 1515 messagebox.showinfo("东东提示","输入不可为空") 1616 else: 1717 #字典数据 1818 datax={ 1919 "word":textx, 2020 "sizes":60, 2121 "fonts":"lfc.ttf", 2222 "fontcolor":"#000000" 2323 } 2424 rx=requests.post("http://www.uustv.com/",data=datax) 2525 rx.encoding="utf-8" 2626 htmlx=rx.text #网站源码 2727 zz='<div class="tu">.*?<img src="(.*?)"/></div>'#括号里的.*?表示要取的值 2828 #取图片地址 2929 imagex=re.findall(zz,htmlx) 3030 #取图片数据 3131 imagedatax=requests.get("http://www.uustv.com/"+imagex[0]).content 3232 #打开文件 3333 ff=open('{}.gif'.format(textx),"wb") 3434 #写图片数据 3535 ff.write(imagedatax) 3636 # 3737 bmx=ImageTk.PhotoImage(file='{}.gif'.format(textx)) 3838 lab2=Label(rview,image=bmx) 3939 lab2.bm=bmx 4040 lab2.grid(row=2,columnspan=2) 4141 #创建窗口 4242 rview=Tk() 4343 #标题 4444 rview.title("东小东标题党") 4545 #窗口大小 长高用小写x隔开 4646 #rview.geometry("600x300") 4747 #窗口基于屏幕的坐标 +x轴+y轴 4848 rview.geometry("+500+200") 4949 #创建lab标签 5050 labelx=Label(rview,text="签名",fg="red",font=("宋体",30)) 5151 #显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐 5252 labelx.grid(row=0,column=0) 5353 #创建输入框 5454 entryx=Entry(rview,font=("宋体",20)) 5555 #显示输入框 5656 entryx.grid(row=0,column=1) 5757 #创建按钮 5858 buttonx=Button(rview,text="确定",font=("宋体",30),command=butonck) 5959 #显示按钮 6060 buttonx.grid(row=1,column=2) 6161 #显示后改变按钮属性 6262 #buttonx["width"]=2 6363 6464 6565 #消息循环 显示窗口 6666 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 1 from tkinter import * 2 2 #创建窗口 3 3 rview=Tk() 4 4 #标题 5 5 rview.title("东小东") 6 6 #窗口基于屏幕的坐标 +x轴+y轴 7 7 rview.geometry("+500+200") 8 8 #创建lab标签 9 9 labelx=Label(rview,text="父容器Lab",font=("宋体",30)) 1010 #显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐 1111 labelx.grid(row=0,column=1) 1212 1313 #---------------------------------------------------------------------------- 1414 1515 # 创建一个子容器,其父容器为rview 1616 monty = LabelFrame(rview, text="== 子容器标题 ==") 1717 monty.grid(column=0, row=0,padx=5,pady=5) #设置子容器在父容器的位置 1818 1919 2020 #创建子容器里的按钮1 2121 buttonx1=Button(monty,text="按钮1",font=("宋体",20),fg="red") 2222 buttonx1.grid(row=0,column=0) #设置按钮在子容器的位置 2323 2424 #创建子容器里的按钮2 2525 buttonx2=Button(monty,text="按钮2",font=("宋体",20),fg="green") 2626 buttonx2.grid(row=1,column=0) #设置按钮在子容器的位置 2727 2828 #--------------------------------------------------------------------------- 2929 3030 #消息循环 显示窗口 3131 rview.mainloop()

输入框内容操作

1 1 from tkinter import * 2 2 3 3 def butonck(): 4 4 print(entryx.get())#输出输入框值 5 5 6 6 #创建窗口 7 7 rview=Tk() 8 8 #标题 9 9 rview.title("123") 1010 #窗口大小 长高用小写x隔开 1111 #rview.geometry("600x300") 1212 #创建lab标签 1313 labelx=Label(rview,text="输入:",fg="red",font=("宋体",30)) 1414 #显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐 1515 labelx.grid(row=0,column=0) 1616 #创建输入框默认显示 1717 entext = StringVar() 1818 #创建输入框 1919 entryx=Entry(rview,font=("宋体",20),textvariable=entext) 2020 #显示输入框 2121 entryx.grid(row=0,column=1) 2222 #创建按钮 2323 buttonx=Button(rview,text="确定",font=("宋体",30),command=butonck) 2424 #显示按钮 2525 buttonx.grid(row=0,column=2) 2626 2727 #------------------------------------------------- 2828 #设置内容 2929 entext.set('西') 3030 #插入内容,最开始处 3131 entryx.insert(0,'东') 3232 #插入内容,光标位置开始 3333 entryx.insert(INSERT,'想') 3434 #插入内容,末尾 3535 entryx.insert(END,'想') 3636 #-------------------------------------------------- 3737 3838 #消息循环 显示窗口 3939 rview.mainloop()

文本框加滚动条实现:

1 1 from tkinter import * 2 2 #创建窗口 3 3 rview=Tk() 4 4 #标题 5 5 rview.title("东小东") 6 6 #窗口基于屏幕的坐标 +x轴+y轴 7 7 rview.geometry("+500+200") 8 8 #创建lab标签 9 9 labelx=Label(rview,text="文本框实现",font=("宋体",30)) 1010 #显示lab标签 网格布局 sticky=W #左对齐 E为右对齐 默认为中间对齐 1111 labelx.grid(row=0,column=0) 1212 1313 #---------------------------------------------------------------------------- 1414 1515 # 创建一个纵向滚动的滚动条,打包到窗口右侧,铺满Y方向 1616 scrollbar = Scrollbar(rview, orient=VERTICAL,bg="red") # orient默认为纵向 1717 scrollbar.grid(row=2,column=0) 1818 1919 # 打包一个文本域到窗口,y方向滚动文本的监听丢给滚动条的set函数(文本域主动关联滚动条) 2020 #高度和宽度确定的是字符个数(win) 2121 text = Text(rview, width=50,height=10, yscrollcommand=scrollbar.set) 2222 text.grid(row=2,column=0) 2323 2424 # 拉动滚动条时,改变文本域在y方向上的视图(滚动条主动关联文本域) 2525 scrollbar.config(command=text.yview) 2626 2727 #--------------------------------------------------------------------------- 2828 2929 #消息循环 显示窗口 3030 rview.mainloop()

添加操作属性:

1text.delete(0.0, END)#清空文本框 2 3text.insert(END, "追加的内容")

将opencv的图片转换到TK:

1from PIL import Image, ImageTk 2 31 cv2image = cv2.cvtColor(tux, cv2.COLOR_BGR2RGBA) # 转换颜色从BGRRGBA 42 current_image = Image.fromarray(cv2image) # 将图像转换成Image对象 53 imgx = ImageTk.PhotoImage(image=current_image) 64 label = Label(image=imgx) 75 label.image = imgx 86 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 1 import threading 2 2 import cv2 3 3 from tkinter import * 4 4 from PIL import Image, ImageTk 5 5 from tkinter import ttk 6 6 7 7 rootv = Tk() 8 8 rootv.title("东小东") 9 9 1010 #创建lab标签 1111 labelx=Label(rootv,text="东小东TK视频流",fg="red",font=("宋体",30)) 1212 labelx.grid(row=0,column=0) 1313 1414 #创建一个画布 1515 canv = Canvas(rootv,width=640,height=480,bg = 'red') 1616 canv.grid(row=1,column=0) 1717 1818 def show_video(): 1919 global labelvvv 2020 vix=cv2.VideoCapture(2) #打开摄像头 2121 #imgtk='' 2222 while True: 2323 ret,tu=vix.read() #ret为返回值,tu为当前帧 2424 tu1=cv2.flip(tu,1)#图像反转,1为左右对换,-1为上下对换 2525 cv2image = cv2.cvtColor(tu1, cv2.COLOR_BGR2RGBA)# 转换颜色从BGRRGBA 2626 current_image = Image.fromarray(cv2image) # 将图像转换成Image对象 2727 imgtk = ImageTk.PhotoImage(image=current_image)#img 2828 canv.create_image(0,0,anchor=NW,image=imgtk)#将图片添加到画布 2929 obr = imgtk 3030 3131 #开启线程 3232 t1=threading.Thread(target=show_video,args=()) 3333 t1.start() 3434 3535 rootv.mainloop() 3636

点击查看更多 Python Opencv 内容


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

画布视频流:https://stackoverflow.com/questions/35319531/python-tkinter-canvas-root-after-maximum-recursion-depth-exceeded

教程参考:潭州教育

import threadingimport cv2 from tkinter import *from PIL import Image, ImageTkfrom tkinter import ttk
rootv = Tk()rootv.title("东小东")
#创建lab标签labelx=Label(rootv,text="东小东TK视频流",fg="red",font=("宋体",30))labelx.grid(row=0,column=0)
#创建一个画布canv = Canvas(rootv,width=640,height=480,bg = 'red')canv.grid(row=1,column=0)
def show_video():global labelvvvvix=cv2.VideoCapture(2) #打开摄像头#imgtk=''while True:ret,tu=vix.read() #ret为返回值,tu为当前帧tu1=cv2.flip(tu,1)#图像反转,1为左右对换,-1为上下对换cv2image = cv2.cvtColor(tu1, cv2.COLOR_BGR2RGBA)# 转换颜色从BGR到RGBA  current_image = Image.fromarray(cv2image)  # 将图像转换成Image对象imgtk = ImageTk.PhotoImage(image=current_image)#imgcanv.create_image(0,0,anchor=NW,image=imgtk)#将图片添加到画布obr = imgtk
#开启线程t1=threading.Thread(target=show_video,args=())t1.start()
rootv.mainloop()
#https://stackoverflow.com/questions/35319531/python-tkinter-canvas-root-after-maximum-recursion-depth-exceeded

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

MySQL部分从库上面因为大量的临时表tmp_table造成慢查询

背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_

皕杰报表之UUID

​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

2020年前端实用代码段,为你的工作保驾护航

有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )