• 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)

    下面放出完整代码,以多线程计数为例:

    [python] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. #coding:utf-8  
    2. from Tkinter import *  
    3. from ScrolledText import ScrolledText #文本滚动条  
    4. import threading  
    5. import time  
    6. from PIL import ImageTk,Image  
    7.   
    8.   
    9.   
    10. def count(i):  
    11.      for k in range(1, 100+1):  
    12.         text.insert(END,'第'+str(i)+'线程count:  '+str(k)+' ')  
    13.         time.sleep(0.001)  
    14.             
    15.   
    16. def fun():  
    17.     for i in range(1, 5+1):  
    18.         th=threading.Thread(target=count,args=(i,))  
    19.         th.setDaemon(True)#守护线程  
    20.         th.start()  
    21.     var.set('MDZZ')  
    22.   
    23.   
    24.   
    25. root=Tk()  
    26. root.title('九日王朝')  #窗口标题  
    27. root.geometry('+600+100')#窗口呈现位置  
    28. image2 =Image.open(r'ParticleSmoke.png')  
    29. background_image = ImageTk.PhotoImage(image2)  
    30. textlabel=Label(root,image=background_image)  
    31. textlabel.grid()  
    32. text=ScrolledText(root,font=('微软雅黑',10),fg='blue')  
    33. text.grid()  
    34. button=Button(root,text='屠龙宝刀 点击就送',font=('微软雅黑',10),command=fun)  
    35. button.grid()  
    36. var=StringVar()#设置变量  
    37. label=Label(root,font=('微软雅黑',10),fg='red',textvariable=var)  
    38. label.grid()  
    39. var.set('我不断的洗澡,油腻的师姐在哪里')  
    40. root.mainloop()  



    最后说一下,多线程无限调用ScrolledText.insert()插入文本时,可能会造成程序卡顿甚至奔溃

    如果用sleep控制一下的话会好一些,不知道这里有没有更好的处理办法

  • 相关阅读:
    我的小问题
    js实现随机的四则运算题目
    VC++ 6.0 无法打开文件
    VC6.0致命错误 RC1015: 无法打开包含文件 'afxres.h'.解决方案
    VS2010 如何添加H文件目录和LIB目录
    学习计划(四月)
    IIS与apache的对比:大杂烩
    ubuntu下有线网卡启动(Atheros AR8161 Gigabit Ethernet)
    putty终端乱码解决办法
    Proxy Switchysharp配置
  • 原文地址:https://www.cnblogs.com/monsteryang/p/6592380.html
Copyright © 2020-2023  润新知