精华内容
下载资源
问答
  • Python tkinter 多线程 哲学家进餐问题 网上找了好久都没有自己满意的代码,于是自己学了一个,不过这只是个雏形,要想变成你满意的程序,需要靓男靓女们自己的努力啦! 废话不多说,直接上代码! from tkinter ...
  • I am currently working on an Email sender and recieving program with the tkinter library from python.I am using the threading module to make the program refresh the unread emails every 60 seconds whil...

    I am currently working on an Email sender and recieving program with the tkinter library from python.

    I am using the threading module to make the program refresh the unread emails every 60 seconds while you can still continue doing stuff in the program.

    The threading module works when just making a print("something") command, and I can still continue doing stuff in the program. However, when I make the thread log into gmail and getting the unread email count, the whole program freezes and crashes.

    Below is a snippet of my code. I will not post the full code, I made a short version to show how it looks.

    EDIT:

    Made a small fault in the function. the get_credentials() is removed.

    import tkinter, re, threading, time, imaplib, too many to list here.

    class Application(Frame):

    def __init__(self, parent):

    ... Start some functions

    ... Create some widgets

    ... Create some global stringvars for entry fields

    def threadrefresh(self):#I want to start this function when a button is clicked

    def multithreading():

    usernamevar = "Username"

    passwordvar = "Password"

    obj = imaplib.IMAP4_SSL('imap.gmail.com', '993') #connect to gmail

    obj.login(usernamevar, passwordvar) #log in

    obj.select() #select the inbox

    unread = str(len(obj.search(None, 'UnSeen')[1][0].split())) #get the total unread

    print(unread)

    obj.close()

    time.sleep(3)

    multi = threading.Thread(target=multithreading)

    multi.start()

    multi = threading.Thread(target=multithreading)

    multi.start()

    def other_functions_that_do_not_matter_in_this_case():

    ... Creating GUI

    ... Sending mail

    ... Etc.

    ... Create a button with function call self.threadrefresh

    def main():

    root = Tk()

    app = Application(root)

    root.mainloop()

    if __name__ == '__main__':

    main()

    解决方案

    Is this code actually correct?

    You call this in multithreading:

    time.sleep(3)

    multi = threading.Thread(target=multithreading)

    multi.start()

    You are basically telling every thread to create a copy of itself after 3 seconds... I think you are missing the point of a thread. You should probably have a (single) thread running in a while loop that gets data from a Queue.

    Whenever you want the thread to act on something, you add it to the Queue.

    Edit: Example code

    import threading

    import Queue

    import time

    def f(q):

    while True:

    print q.get() #block thread until something shows up

    q = Queue.Queue()

    t = threading.Thread(target=f,args=[q])

    t.daemon = True #if parent dies, kill thread

    t.start()

    for x in range(0,1000):

    q.put(x)

    time.sleep(1)

    展开全文
  • 今天解决了一个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);

     

    展开全文
  • 最近在使用tkinter写的一个多线程的程序的时候遇到一个问题。 这个程序有5个线程,每个线程都会去执行show函数,show函数是输出0至999到listbox上。 我在当线程要输出数据到listbox上时使用了线程锁,可是...
  • 写博客记录一下Pythontkinter 进程线程写成的邮箱应用,只是一个简单的应用,尝试进程调度,并用pyinstaller打包成exe注意:1、平台环境win7 、Python3.6 、 pyinstaller3.3(安装方法,百度有,这里不加说明,...

    写博客记录一下Python 用tkinter 多进程线程写成的邮箱应用,只是一个简单的应用,尝试进程调度,并用pyinstaller打包成exe

    注意:

    1、平台环境win7 、Python3.6 、 pyinstaller3.3(安装方法,百度有,这里不加说明,Windows下Python3的pyinstaller会出错,解决办法,百度)

    2、Windows下多进程,在if __name__=='__main__':里面去启动才不会出错

    3、tkinter调用mainloop() 函数 应在主线程的最后一行,因为mainloop会进入屏幕显示循环,mainloop()之后的代码会在UI界面退出之后再执行(已经没意义了),

    所以重点 :后台进程,后台线程,要在mainloop之前去启动

    4、pyinstaller打包Python多进程 请加以下这行

    multiprocessing.freeze_support()

    5、以上注意在代码注释有

    从上之下依次是label:作用是显示,发送成功,失败,以及找不到附件等信息

    96cd95d665734f77ed8705eb88a5632a.png

    7b12d1bb20e64fab828140e08f02bd89.png

    第一个Entry 是输入主题

    第二个Entry是输入正文(这里随便用了entry,用Text更合适)

    第三个Entry输入附件的文件位置

    Button 就是发送

    tkinter 进程代码(继承了threading.Thread)

    from tkinter import * import multiprocessing from send_mail import send_my_mail#引入发送邮件 import threading class My_Gui(threading.Thread): """docstring for My_Gui""" def __init__(self,queue_1,queue_2,event_1): super(My_Gui,self).__init__() self.queue_1=queue_1 self.queue_2=queue_2 self.root=Tk() self.root.title="EMAIL" self.label_1=Label(self.root,text='info') self.entry_1=Entry(self.root,) self.entry_2=Entry(self.root,) self.entry_3=Entry(self.root,) #button的command调用函数需要参数时 用lambda self.button_1=Button(self.root,text='SEND',command=lambda:self.button_click(queue_1,event_1)) self.label_1.pack() self.entry_1.pack() self.entry_2.pack() self.entry_3.pack() self.button_1.pack() # self.root.mainloop() def button_click(self,queue,event_1): if not self.entry_1.get()=='': queue.put(self.entry_1.get())#获取三个输入框内容依次进入队列发送给后台进程 queue.put(self.entry_2.get()) queue.put(self.entry_3.get()) event_1.set() self.label_1['text']='sending email' #多线程等待后台进程返回消息,防止UI卡顿 def run(self): self.button_1['text']='Send' while True: if not self.queue_2.empty(): info=self.queue_2.get() if info=='succeed': self.label_1['text']='succeed' elif info=='failure': self.label_1['text']='failure' else: self.label_1['text']='file not found' def back_process(queue_1,queue_2,event_1): while True: event_1.wait() subject=queue_1.get()#后台进程获取UI进程“主题”输入框内容 body=queue_1.get()#后台进程获取UI进程“正文”输入框内容 img=queue_1.get()#附件 flage_1=send_my_mail(subject,body,img)#调用发送邮件函数 queue_2.put(flage_1)#将发送邮件函数的返回 发送给UI进程 event_1.clear() if __name__=='__main__': #多线程多进程都必须在mainloop之前去执行 multiprocessing.freeze_support() #在Windows下编译需要加这行 queue_1=multiprocessing.Queue()#用来UI进程向后台发送邮件进程发送消息 queue_2=multiprocessing.Queue()#用来后台进程向UI进程发送消息 event_1=multiprocessing.Event()#控制后台进程是否阻塞 t=multiprocessing.Process(target=back_process,args=(queue_1,queue_2,event_1)) t.daemon=True t.start()#要先于mainloop调用start 不然 进程不会启动 my_Gui=My_Gui(queue_1,queue_2,event_1)#GUI之后的代码不执行 my_Gui.daemon=True my_Gui.start()#要先于mainloop调用start 不然 线程不会启动 my_Gui.root.mainloop()#mainloop必须要在最后去执行,相当于while阻塞

    发送邮件的Python文件

    import smtplib,sys from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart from email.header import Header def send_my_mail(subject,body,img): form_addr="你的邮箱@163.com" my_fassword='你的邮箱密码' to_addr=["你要发送的邮箱@qq.com"] msg=MIMEMultipart() msg['From']=Header(form_addr) msg['To']=Header("你要发送的邮箱@qq.com") msg['Subject']=Header(subject,"utf-8") body=MIMEText(body,'plain','utf-8') msg.attach(body) try: att1=MIMEText(open(img,'rb').read(),'base64','utf-8') except Exception as e: return 'file not found' att1['Content-Type']='application/octet-stream' att1['Content-Disposition']='attachment;filename=%s'%img msg.attach(att1) try: smtpobj=smtplib.SMTP() smtpobj.connect('smtp.163.com') smtpobj.login(form_addr,my_fassword) smtpobj.sendmail(form_addr,to_addr,msg.as_string()) # print('succeed') return 'succeed' except Exception as e: print(str(e)) return 'failure'

    展开全文
  • /usr/bin/python# coding: utf-8from Tkinter import *import threadingclass MyThread2(threading.Thread):def __init__(self, func):threading.Thread.__init__(self)self.func = funcdef run(self):...

    一个线程可以,两个卡死

    #!/usr/bin/python

    # coding: utf-8

    from Tkinter import *

    import threading

    class MyThread2(threading.Thread):

    def __init__(self, func):

    threading.Thread.__init__(self)

    self.func = func

    def run(self):

    self.func()

    def windows1():

    root = Tk()

    root.title("记事本")

    # root.geometry("800x600+100+100")

    s1 = Scrollbar(root)

    s1.pack(side=RIGHT, fill=Y)

    # HORIZONTAL 设置水平方向的滚动条,默认是竖直

    s2 = Scrollbar(root, orient=HORIZONTAL)

    s2.pack(side=BOTTOM, fill=X)

    # 创建文本框

    # wrap 设置不自动换行

    textpad = Text(root, yscrollcommand=s1.set, xscrollcommand=s2.set, wrap='none')

    textpad.pack(expand=YES, fill=BOTH)

    s1.config(command=textpad.yview)

    s2.config(command=textpad.xview)

    root.mainloop()

    def windows2():

    root = Tk()

    root.title("记事本")

    # root.geometry("800x600+100+100")

    s1 = Scrollbar(root)

    s1.pack(side=RIGHT, fill=Y)

    # HORIZONTAL 设置水平方向的滚动条,默认是竖直

    s2 = Scrollbar(root, orient=HORIZONTAL)

    s2.pack(side=BOTTOM, fill=X)

    # 创建文本框

    # wrap 设置不自动换行

    textpad = Text(root, yscrollcommand=s1.set, xscrollcommand=s2.set, wrap='none')

    textpad.pack(expand=YES, fill=BOTH)

    s1.config(command=textpad.yview)

    s2.config(command=textpad.xview)

    root.mainloop()

    if __name__ == '__main__':

    threads = []

    t1 = MyThread2(windows1)

    threads.append(t1)

    t2 = MyThread2(windows2)

    threads.append(t2)

    for t in threads:

    t.setDaemon(True)

    t.start()

    for t in threads:

    t.join()

    运行一直等待中,不会出窗口

    网上搜的结果,待验证。

    tkinter和多线程确实有冲突,我也是弄了很久,最后才发现是这两者的问题。

    后来我又自学了c#,发现其图形界面的控件是不允许多线程直接访问的,所以我推测python是因为图形下的控件被多线程同时访问(赋值),所以造成崩溃。

    解决办法,我目前知道的(我是新手),要么不用多线程,要么不用tkinter。

    展开全文
  • 写博客记录一下Pythontkinter 进程线程写成的邮箱应用,只是一个简单的应用,尝试进程调度,并用pyinstaller打包成exe 注意: 1、平台环境win7 、Python3.6 、 pyinstaller3.3(安装方法,百度有,这里不加...
  • 在博文“python tkinter窗口实现多线程秒表的两种方法”中,第2种创建秒表方法是每秒创建一个新线程,结束旧线程,这样频繁创建新线程,结束旧线程,虽然程序能正常运行,但显然不合理,要消耗大量cpu资源,不是编程...
  • width=400, height=300): self.width, self.height = width, height self.canvas = Tkinter.Canvas(width=width, height=height, bg='black') self.canvas.pack(fill='none', expand=False) self._oid = [] self....
  • 功能介绍: 这次的下载器特点:多线程 + 多...界面:Tkinter下载功能 :request多任务 :threading多线程:ThreadPoolExecutor断点续存:文本txt的增删改查程序左上角图标生成:base64 方法简介: 效果 方法简介
  • 使用python Tk做窗体应用程序,以及python多线程处理 首先先建一个TkinterUI.py 文件 插入如下代码(有些方法是未用到的,个人没有删代码的习惯,后面说不定留着有用) import os import threading import tkinter ...
  • 指出博文“在python tkinter窗口实现多线程秒表的两种方法”的第2种方法的不足,提出一个新方法,仍使用Timer类,使秒表代码在一个线程运行,直到秒表结束。
  • python+Tkinter+多线程

    万次阅读 2015-12-31 14:06:14
    界面和多线程一向是编程里比较难的地方,常见的做法一般是界面一个线程,后台新开一个工作线程,这两个线程进行通信,这样可以让界面不至于为响应。在python中可以利用队列完成整体的架构设计。直接给大家看代码吧,...
  • #coding=utf-8import _threadimport time# 为线程定义一个函数def print_time( threadName, delay):count = 0while count < 15:time.sleep(delay)count += 1print ("%s: %s" % (threadName, time.ctime(time.time...
  • Python GUI之tkinter 实战(二)tkinter+多线程

    万次阅读 多人点赞 2017-12-21 00:23:02
    Python3 tkinter系列 一、概述 二、布局管理 三、常用组件 四、实战(一) 五、实战(二) 自定义对话框 在继续上一篇博客之前,先讲一个东西,这个东西我们待会儿就需要用到 在tkinter中,根窗口只能有...
  • 使用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
  • python+Tkinter+多线程 简单例子1

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

    千次阅读 多人点赞 2019-12-01 17:35:50
    注:本文不讲TKinter的基本操作,以及多线程的概念,操作 首先要讲的是一个TKinter使用时常常遇到的问题,因为TKinter自身刷新GUI是单线程的,用户在调用mainloop方法后,主线程会一直不停循环刷新GUI,但是如果...

空空如也

空空如也

1 2 3 4 5 ... 15
收藏数 288
精华内容 115
关键字:

pythontkinter多线程

python 订阅