精华内容
下载资源
问答
  • Python tkinter 多线程 哲学家进餐问题 网上找了好久都没有自己满意的代码,于是自己学了一个,不过这只是个雏形,要想变成你满意的程序,需要靓男靓女们自己的努力啦! 废话不多说,直接上代码! from tkinter ...
  • tkinter多线程刷新界面

    2021-02-19 16:48:26
    环境:win10 + Python3.9 + tkinter8.6.9 import tkinter as tk from tkinter import ttk import threading, time, sys, queue def fmtTime(timeStamp): timeArray = time.localtime(timeStamp) dat

    参考:https://blog.csdn.net/u013700771/article/details/103321783

    环境:win10 + Python3.9 + tkinter8.6.9

    import tkinter as tk
    from tkinter import ttk
    import threading, time, sys, queue
     
    def fmtTime(timeStamp):
        timeArray = time.localtime(timeStamp)
        dateTime = time.strftime("%Y-%m-%d %H:%M:%S", timeArray)
        return dateTime
    
    class GUI():
        def __init__(self, root):
            #new 一个Quue用于保存输出内容
            self.msg_queue = queue.Queue()
            self.initGUI(root)
        #在show_msg方法里,从Queue取出元素,输出到Text
        def show_msg(self):
            while not self.msg_queue.empty():
                content = self.msg_queue.get()
                self.text.insert("insert", content)
                self.text.see("end")
            #after方法再次调用show_msg
            self.root.after(100, self.show_msg)
     
        def initGUI(self, root):
            self.root = root
            self.root.title("test")
            self.root.geometry("400x200+700+500")
            self.root.resizable = False
        
            self.btn = ttk.Button(self.root, text="click", 
                                  takefocus=0, command=self.show)
            self.btn.pack(side="top")
     
            self.scrollBar = ttk.Scrollbar(self.root)
            self.scrollBar.pack(side="right", fill="y")
     
            self.text = tk.Text(self.root, height=10, bd=1, relief="solid", 
                                yscrollcommand=self.scrollBar.set)
            self.text.pack(side="top", fill="both", padx=10, pady=10)
            self.scrollBar.config(command=self.text.yview)
     
            #启动after方法
            self.root.after(100, self.show_msg)
    
            root.mainloop()
    
        def __show(self):
            i = 0
            while i < 3:
                # print(fmtTime(time.time()))
                self.msg_queue.put(fmtTime(time.time())+"\n")
                time.sleep(1)
                i += 1
     
        def show(self):
            T = threading.Thread(target=self.__show, args=())
            T.start()
     
    if __name__ == "__main__":
        root = tk.Tk()
        myGUI = GUI(root)

    如下图:

     

    展开全文
  • 今天解决了一个GUI程序的多线程问题。 因为GUI程序在执行高IO操作的时候容易出现假死和无响应的状态,所以需要用到多线程。 但我的程序开了线程之后依然是无响应状态。几次尝试,终于找到问题所在。 1.首先,我的...

    今天解决了一个GUI程序的多线程问题。

    因为GUI程序在执行高IO操作的时候容易出现假死和无响应的状态,所以需要用到多线程。

    但我的程序开了线程之后依然是无响应状态。几次尝试,终于找到问题所在。

    1.首先,我的程序中有一个按钮button,点击之后运行函数self.starting

    self.my_button = tk.Button(root, text="确定",command= self.starting)

    其中self.starting用于启动线程,代码如下:

        def starting(self):
            self.thread = threading.Thread(target=self.download)
            self.thread.setDaemon(True)
            self.thread.start()

    2.线程中的target为self.downoad是一个自己定义的函数,用于执行某些功能,一开始的时候我的代码是这样写的

    self.thread = threading.Thread(target=self.download(data))

    因为download函数需要一个参数,所以我就想当然的将参数写在了创建线程函数中,但是发现依然是卡死,后来我就把参数data删了,用其他的方法传递参数,然后就不再出现卡死现象,至于原因我还没仔细的查过。

    可以用一个简单的输出函数来测试一下:

        def download(self):
            print("data");
            time.sleep(5);

     

    展开全文
  • 1 爬取京东评论,绘制成词云 2 爬取最近销量(评论)并用 matplotlib 绘制(京东评论数量即销量) ...4 将爬取的信息放在 Tkinter (也要用多线程,防止界面无响应)做的界面上, 以此帮助用户更直观的分析商品
  • tkinter+多线程+socket网络登录,群聊聊天室. 可账户,账户保存至本地文件
  • 在扫雷游戏中,需要一个秒表,记录扫雷用的秒数。秒表必须在子线程中,才会不干扰扫雷。本文介绍实现秒表的两种方法。

    在扫雷游戏中,需要一个秒表,用来记录扫完所有雷所用的秒数。要求扫雷和记时两部分程序互不干扰。这就要用到多线程概念。现代操作系统都是多任务的操作系统,即允许同时运行多个程序。但计算机只有一个CPU,在某时刻只能处理一个任务。操作系统把CPU运行时间分为多个时间片,分给各个任务。由于现代CPU运行速度非常快,而人的反应速度相对于CPU是非常慢的,在感觉上似乎多个任务在同时运行。而在计算机中运行的程序,有时也有多个工作需要同时做,办法就是把程序分到的时间片再分为多个子时间片,分给各个工作,使各个工作能同时进行。这就是多线程的概念的粗浅解释。更多有关多线程概念参见网页:
    https://www.cnblogs.com/luyuze95/p/11289143.html
    在扫雷游戏中,扫雷是主要工作(主程序),占用主线程,再创建一个子线程,运行秒表代码,就能达到两工作同时进行,互不干扰。使用多线程必须引入threading类。还用到time类的延时函数sleep函数,还要引入time类。运行界面如下。
    在这里插入图片描述
    代码如下。

    import threading
    import time
    import tkinter as tk
    #事件(Event)对象是线程之间通信的最简单机制之一:一个线程发出事件信号,而其他线程等待该信号。
    event = threading.Event()   #创建Event对象,用于主程序(主线程)控制子线程
    def run(n):                 #n是创建线程对象时,传递给run()方法的参数值,本程序没用到该参数
        event.set()             #set()将flag设置为True
        global k                #子线程可以和主线程共用全局变量
        while event.is_set():   #flag为True,每隔1秒,k+1,并在label中显示。
            time.sleep(1)
            k+=1
            label['text']=str(k)
    def do_job():               #停止按钮事件函数
        event.clear()           #clear()将flag设置为False,run函数将退出,子线程结束   
    root = tk.Tk()
    root.geometry("300x100")
    k=0                         #k是一个全局变量
    label=tk.Label(root,text='0',bd='5',fg='red',font=("Arial",15))
    label.place(x=10,y=5,width=40,height=30)
    button1=tk.Button(root,text='停止',command=do_job,fg='red',font=("Arial",15))
    button1.place(x=100,y=5,width=60,height=30)
    #创建线程对象。调用start()方法后,将调用参数1指定的run()方法在此线程中运行,退出run()方法,线程结束。
    t = threading.Thread(target=run, args=(0,)) #参数2为元组,是传递给run()方法的参数值,无参数传递可去掉第2个参数
    #setDaemon(True)把所有的子线程都变成了主线程的守护线程,因此当主进程结束后,子线程也会随之结束。
    t.setDaemon(True)       #如不加此条语句,在计数未停止前,即线程未结束,关闭窗口,会抛出异常
    t.start()               #激活线程,调用run()方法,退出run()方法,线程结束。
    root.mainloop()	
    

    网上有定时器代码如下:

    from threading import Timer
    def hello(): 
        print ("hello, world") 
        Timer(1, hello).start() 
    t = Timer(1, hello) 
    t.start()
    

    对这个定时器,网上有不同看法,有人认为是“粗陋的循环定时器”,认为其有点问题。每一次循环间隔操作,创建一个Timer对象,系统都要创建一个线程,然后再回收,这对系统来说开销很大。如果时间间隔 interval 很短,系统会一下子创建很多线程,这些线程很难快速回收,导致系统内存和cpu资源被消耗掉。 所以不提倡在 function 里继续注册一个 Timer。有人觉得是递归调用,会不会由于堆栈溢出,使系统崩溃。但是事实是,将时间间隔改为1秒,运行很长时间,也未崩溃。为了验证函数hello()是在子线程运行,把这段代码移植到tkinter窗口,如函数hello()不是在子线程运行,窗口无法工作。代码如下,运行的很好。这说明这段代码应无问题。我试着解释一下,不对请指正。首先,这不是递归调用,下边代码第7条语句为新线程指定运行函数,执行第9条语句函数就退出了,旧子线程也就结束,很容易被回收了。

    from threading import Timer
    import tkinter as tk
    def hello():
        global k,t
        k+=1
        label['text']=str(k)
        t=Timer(1, hello)
        t.setDaemon(True)
        t.start()
    
    def do_job():
        t.cancel()         
    
    root = tk.Tk()
    root.geometry("300x100")
    k=0
    label=tk.Label(root,text='0',bd='5',fg='red',font=("Arial",15))
    label.place(x=10,y=5,width=40,height=30)
    button1=tk.Button(root,text='停止',command=do_job,fg='red',font=("Arial",15))
    button1.place(x=100,y=5,width=60,height=30)
    t = Timer(1, hello) 
    t.start()
    root.mainloop()	
    
    

    第1段代码只创建了一个子线程,第2段代码创建新线程,旧线程结束,似乎第2段代码好理解些。两段代码优略请大家评判。
    关于线程的运行函数退出,线程就结束了观点出自网页:
    https://docs.python.org/zh-cn/3.7/library/threading.html
    涉及的文字如下,不知是否理解正确。
    当线程对象一但被创建,其活动一定会因调用线程的 start() 方法开始。这会在独立的控制线程调用 run() 方法。
    一旦线程活动开始,该线程会被认为是 ‘存活的’ 。当它的 run() 方法终结了(不管是正常的还是抛出未被处理的异常),就不是’存活的’。 is_alive() 方法用于检查线程是否存活。

    展开全文
  • Python GUI之tkinter 实战(二)tkinter+多线程

    万次阅读 多人点赞 2017-12-21 00:23:02
    Python3 tkinter系列 一、概述 二、布局管理 三、常用组件 四、实战(一) 五、实战(二) ...如果需要创建个窗口该怎么办呢?那就需要使用另一个控件——Toplevel 在第一篇概述的主要控件列表

    Python3 tkinter系列

    一、概述
    二、布局管理
    三、常用组件
    四、实战(一)
    五、实战(二)
    六、进阶 自定义控件
    推荐视频课程 tkinter从入门到实战

    自定义对话框

    在继续上一篇博客之前,先讲一个东西,这个东西我们待会儿就需要用到

    在tkinter中,根窗口只能有一个,也就是通过Tk()方法创建的实例对象。如果需要创建多个窗口该怎么办呢?那就需要使用另一个控件——Toplevel

    在第一篇概述的主要控件列表中,我已经列出来了

    <
    展开全文
  • from tkinter import * import datetime import threading def do_word(): # 这里没特别的需求不需要动 global a if a: t = threading.Thread(target=task) t.setDaemon(True) t.start()...
  • 【Python】TKinter多线程时刷新GUI的一些碎碎念

    千次阅读 多人点赞 2019-12-01 17:35:50
    注:本文不讲TKinter的基本操作,以及多线程的概念,操作 首先要讲的是一个TKinter使用时常常遇到的问题,因为TKinter自身刷新GUI是单线程的,用户在调用mainloop方法后,主线程会一直不停循环刷新GUI,但是如果...
  • 使用TKinter编写界面,实现选择测试用例并执行,最后打印出测试结果。功能是实现了,可是每次一点下开始执行,整个界面就失去响应了,要等到测试用例执行完了,界面才恢复响应,已经把执行用例和画界面分别作为单独...
  • python+Tkinter+多线程

    万次阅读 2015-12-31 14:06:14
    界面和多线程一向是编程里比较难的地方,常见的做法一般是界面一个线程,后台新开一个工作线程,这两个线程进行通信,这样可以让界面不至于为响应。在python中可以利用队列完成整体的架构设计。直接给大家看代码吧,...
  • tkinter多线程

    千次阅读 2018-01-25 17:40:57
    在哪个线程里调用了tk.mainloop(),就只能在哪个线程里更新UI。 下例演示了如何更新。 import Tkinter as tk from ttk import * import time import Queue, threading class MainWindow: def __init
  • 381 定价:59.8 微课视频:77个 教学大纲:《Python程序设计(第3版)》配套教学大纲 习题答案:《Python程序设计(第3版)》课后习题答案 ==================== 任务描述: 使用Python编写程序,使用tkinter创建...
  • 我们写的程序任务,可以分为CPU密集型和I/O密集型,CPU密集型是指需要大量消耗CPU资源进行密集计算的任务,比如浮点数计算,科学数据计算等,由于python有全局锁 (GIL)的存在,python多线程并不适合跑这种任务,因为...
  • python——Tkinter图形化界面及threading多线程

    万次阅读 多人点赞 2016-12-19 16:56:45
    Tkinter模块("Tk 接口")是Python的标准Tk GUI工具包的接口.Tk和Tkinter可以在大多数的Unix平台下使用,同样可以应用在Windows和Macintosh系统里.Tk8.0的后续版本可以实现本地窗口风格,并良好地运行在绝大多数平台中 ...
  • 多线程解决程序运行时tkinter界面卡死的问题

    千次阅读 多人点赞 2020-01-22 13:04:08
    原文地址 用tkinter写了个窗口界面来调用写的...欸,这时候就想起了多线程,一个线程去后台执行程序,一个线程用来在前面刷新显示。 就去搜了一下,果然跟我想的一样~ 这里是关键代码 # 点击提交执行的功能 def exec...
  • 最近在使用tkinter写的一个多线程的程序的时候遇到一个问题。 这个程序有5个线程,每个线程都会去执行show函数,show函数是输出0至999到listbox上。 我在当线程要输出数据到listbox上时使用了线程锁,可是...
  • Python在使用tkinter库制作图形化界面的时候,‘点击按钮-事件处理-显示结果’是很常见的操作,当程序遇到一个比较耗时的事件时,界面就会卡死无响应。 问题出现的原因在于图形化界面的本质是一个循环,通过不断...
  • python 多线程解决tkinter界面卡死问题

    千次阅读 2020-07-19 23:30:16
    import tkinter as tk import time import threading songs = ['爱情买卖','朋友','回家过年','好日子'] movies = ['阿凡达','猩球崛起'] def music(songs): global text # 故意的,注意与movie的区别 for s...
  • python+Tkinter+多线程 简单例子1

    千次阅读 2016-12-29 16:03:39
    界面和多线程一向是编程里比较难的地方,常见的做法一般是界面一个线程,后台新开一个工作线程,这两个线程进行通信,这样可以让界面不至于为响应。在python中可以利用队列完成整体的架构设计。直接给大家看代码吧,...
  • 推荐图书: 《Python程序设计(第3版)》,(ISBN:978-7-302-55083-9),清华大学出版社,2020年6...Python tkinter版猜数游戏 Python+tkinter实现任意层级关系的组合框 Python+tkinter+pillow实现屏幕任意区域截图
  • 使用python Tk做窗体应用程序,以及python多线程处理 首先先建一个TkinterUI.py 文件 插入如下代码(有些方法是未用到的,个人没有删代码的习惯,后面说不定留着有用) import os import threading import tkinter ...
  • Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用   目录 Python 基础 之 python 线程知识点整理,并实现一个简单多线程 udp 聊天应用 一、简单介绍 二、能学到 三、实现思路 四、效果...
  • 这小工具界面又未复杂到非要使用 Pyqt5 的地步,以包体积换方便用户就不方便了,就选择使用 Tkinter 来实现好了。 最终效果: 二、问题分析 问题一:TKinter 里原生控件太少,连进度条控件也没有找着,只能自己画一...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,969
精华内容 1,587
关键字:

tkinter多线程