python——Tkinter图形化界面及threading多线程
Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macintosh系统里.Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中
Tkinter包含了若干模块. Tk接口被封装在一个名为 _tkinter 二进制模块里( tkinter 的早期版本). 这个模块包含了Tk的低级接口,因而它不会被程序员直接应用.它通常表现为一个共享库(或DLL文件),但在一些版本中它与Python解释器结合在一起
在Tk接口的附加模块中,Tkinter包含了一些Python模块,保存在标准库的一个子目录里,称为 tkinter。 其中有两个重要的模块,一个是Tkinter自己,另一个叫做Tkconstants:前者自动导入后者,所以你如果使用Tkinter,仅仅导入一个模块就可以
import Tkinter
或者更常用的:
from Tkinter import *
简单列出一些常见的控件
下面具体举例说明一下,样例如下图:
首先我们指定一个Tkinter对象
root=Tk()
设置标题
root.title('九日王朝')
图片的呈现方式有很多种,这里采用的是先设置一个label控件,使其图片在label中呈现
image2 =Image.open(r'ParticleSmoke.png')
background_image = ImageTk.PhotoImage(image2)
textlabel=Label(root,image=background_image)
textlabel.grid()
这里注意,grid是布局方法,也就是说我们每次设置一个控件都需要将其grid,否则将不显示
滚动文本框ScrolledText,其可以设置字体,颜色等参数
text=ScrolledText(root,font=('微软雅黑',10),fg='blue')
text.grid()
按钮
button=Button(root,text='屠龙宝刀 点击就送',font=('微软雅黑',10),command=fun)
button.grid()
以及可变的文本,文本我们采取的也是放在label里的方式
var=StringVar()#设置变量
label=Label(root,font=('微软雅黑',10),fg='red',textvariable=var)
label.grid()
var.set('我不断的洗澡,油腻的师姐在哪里')
如果在程序执行中,需要对文本进行更改时,可以再次使用var.set
最后,我们通过mainloop()进入到事件(消息)循环,也就是维护我们的窗口界面
下面介绍一下threading多线程模块
threading.Thread(target=函数名args=(调用参数,注意最后要有一个‘,’))可以实例化一个多线程对象
通过start就可以开启
这里要说一下th.setDaemon(True)守护线程
python中得thread的一些机制和C/C++不同:在C/C++中,主线程结束后,其子线程会默认被主线程kill掉。而在python中,主线程结束后,会默认等待子线程结束后,主线程才退出。
那么尴尬的问题就出现了,有一种情况,比如说在Linux系统中存在脱离于终端的线程,即父进程在创建子进程之后先于子进程退出,会造成这个子进程变为“孤儿进程”
如果你忘记杀死子线程,那么好了,你杀主线程的时候其就会挂起等待直至子线程结束,所以为了避免这样的情况,python有两个函数管理线程:join和setDaemon
join:如在一个线程B中调用threada.join(),则threada结束后,线程B才会接着threada.join()往后运行。
setDaemon:主线程A启动了子线程B,调用b.setDaemaon(True),则主线程结束时,会把子线程B也杀死,与C/C++中得默认效果是一样的。
说了这么多就是大家最好养成习惯,一般情况下,在start前面加一下setDaemon(True)
下面放出完整代码,以多线程计数为例:
- #coding:utf-8
- from Tkinter import *
- from ScrolledText import ScrolledText #文本滚动条
- import threading
- import time
- from PIL import ImageTk,Image
- def count(i):
- for k in range(1, 100+1):
- text.insert(END,'第'+str(i)+'线程count: '+str(k)+'\n')
- time.sleep(0.001)
- def fun():
- for i in range(1, 5+1):
- th=threading.Thread(target=count,args=(i,))
- th.setDaemon(True)#守护线程
- th.start()
- var.set('MDZZ')
- root=Tk()
- root.title('九日王朝') #窗口标题
- root.geometry('+600+100')#窗口呈现位置
- image2 =Image.open(r'ParticleSmoke.png')
- background_image = ImageTk.PhotoImage(image2)
- textlabel=Label(root,image=background_image)
- textlabel.grid()
- text=ScrolledText(root,font=('微软雅黑',10),fg='blue')
- text.grid()
- button=Button(root,text='屠龙宝刀 点击就送',font=('微软雅黑',10),command=fun)
- button.grid()
- var=StringVar()#设置变量
- label=Label(root,font=('微软雅黑',10),fg='red',textvariable=var)
- label.grid()
- var.set('我不断的洗澡,油腻的师姐在哪里')
- root.mainloop()
最后说一下,多线程无限调用ScrolledText.insert()插入文本时,可能会造成程序卡顿甚至奔溃
如果用sleep控制一下的话会好一些,不知道这里有没有更好的处理办法
python——Tkinter图形化界面及threading多线程的更多相关文章
- Python的图形化界面
导入easygui模块有很多种方法 , 这里只介绍一种简单使用的 . import easygui as g 将easygui 简称为g 然后开始调用她的函数就行. import easygui as ...
- PySide——Python图形化界面
PySide——Python图形化界面 PySide——Python图形化界面入门教程(四) PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your ...
- PySide——Python图形化界面入门教程(四)
PySide——Python图形化界面入门教程(四) ——创建自己的信号槽 ——Creating Your Own Signals and Slots 翻译自:http://pythoncentral ...
- PySide——Python图形化界面入门教程(六)
PySide——Python图形化界面入门教程(六) ——QListView和QStandardItemModel 翻译自:http://pythoncentral.io/pyside-pyqt-tu ...
- PySide——Python图形化界面入门教程(五)
PySide——Python图形化界面入门教程(五) ——QListWidget 翻译自:http://pythoncentral.io/pyside-pyqt-tutorial-the-qlistw ...
- PySide——Python图形化界面入门教程(三)
PySide——Python图形化界面入门教程(三) ——使用内建新号和槽 ——Using Built-In Signals and Slots 上一个教程中,我们学习了如何创建和建立交互widget ...
- PySide——Python图形化界面入门教程(二)
PySide——Python图形化界面入门教程(二) ——交互Widget和布局容器 ——Interactive Widgets and Layout Containers 翻译自:http://py ...
- PySide——Python图形化界面入门教程(一)
PySide——Python图形化界面入门教程(一) ——基本部件和HelloWorld 翻译自:http://pythoncentral.io/intro-to-pysidepyqt-basic-w ...
- python+pycharm+PyQt5 图形化界面安装教程
python图形化界面安装教程 配置环境变量 主目录 pip所在目录,及script目录 更新pip(可选) python -m pip install --upgrade pip ps:更新出错一般 ...
随机推荐
- Oracle:Redhat 7.4+Oracle Rac 11.2.0.4 执行root.sh报错处理
一.报错信息 二.原因分析 因为RHEL 7使用systemd而不是initd运行进程和重启进程,而root.sh通过传统的initd运行ohasd进程 三.解决办法 在RHEL 7中ohasd需要被 ...
- Java生鲜电商平台-促销架构以及秒杀解决方案实战
Java生鲜电商平台-促销架构以及秒杀解决方案实战 背景:随着这几年的电商的大热,我们经常看到一些商家为了促销和快速收益,纷纷推出了秒杀活动.不管是日常的超市里面的促销,明星演唱会门票售卖,还是春节订 ...
- Java的包
Java 包 Java面向对象的核心的概念:类.接口.抽象类.对象:[主体] 包的定义: 指的是一个程序的目录,在最早的时候,如果要开发一个程序,只需要定义一个Java文件,而后在这个文件中编写所需要 ...
- 微信小程序上拉加载——分页
wxml: <view class="page"> <scroll-view class="imageViewCss_1" scroll-y= ...
- andriod8.1.0源码编译中的一个坑-package com.sun.javadoc does not exist
这里记录编译过程中的一个坑!!! 编译过程中出现了下面的报错 external/doclava/src/com/google/doclava/ClassInfo.java:20: error: pac ...
- Android MediaRecorder录制播放音频
1.请求录制音频权限 <user-permission android:name="android.permission.RECORD_AUDIO"/> RECORD_ ...
- python3+Scrapy爬虫使用pipeline数据保存到文本和数据库,数据少或者数据重复问题
爬取的数据结果是没有错的,但是在保存数据的时候出错了,出现重复数据或者数据少问题.那为什么会造成这种结果呢? 其原因是由于Spider的速率比较快,而scapy操作数据库操作比较慢,导致pipelin ...
- Mysql—用户表详解(mysql.user)
MySQL是一个多用户管理的数据库,可以为不同用户分配不同的权限,分为root用户和普通用户,root用户为超级管理员,拥有所有权限,而普通用户拥有指定的权限. MySQL是通过权限表来控制用户对数据 ...
- [PHP] 存储改造中的逻辑和清理遗留的问题
现象:用户读信时,根据路径的哈希结果,访问四台服务器中一台请求文件,这四台缓存机器已经下线,访问不到再去后端存储访问浪费了时间 前因:每一封信都是一个文件,存储在公司内部的分布式文件系统s3上.因为读 ...
- CSS百分比padding实现比例固定图片自适应布局
一.CSS百分比padding都是相对宽度计算的 在默认的水平文档流方向下,CSS margin和padding属性的垂直方向的百分比值都是相对于宽度计算的,这个和top, bottom等属性的百分比 ...