2016-12-29 52 views
0

正如有人谁是新的节目,我不断地发现自己遇到了错误和问题,同时寻找答案和解决方案,我很少找出为什么是这样的。这一次,它与Python 2.7上的Tkinter。 手头的问题是每次按下我创建的“提交”按钮时,GUI都会冻结。研究部门告诉我,这个问题是因为没有回调让程序到达主循环。我面临的问题是与GUI一起运行的程序是定时器上永无止境的自动化循环。我也在这个网站上搜索过,但是,像往常一样,我只能得到答案,它说“这样做,因为我说它的工作原理”。作为一个真正感兴趣并试图深入探究编程的辉煌黑洞的人,解释为什么需要这样做以及你如何得出这个结论对我来说是一个很大的帮助。我完全理解,编程是那些广泛而又特别的东西之一,解释会变得不同,有时候会有偏差,但是我发现很难从其他方面学习。当我点击我的按钮时,如何阻止我的Tkinter GUI冻结?

我的代码到目前为止的简化版本如下: (我知道简化的代码在本网站上不是首选,但我没有办法在没有编写代码的情况下将代码转移到任何其他计算机所有下来,在这里键入它。我知道你们会在我喊它以后。因此,对于这一点,我很抱歉。)

import os 
import time 
from datetime import datetime 
import shutil 
from Tkinter import * 

root=Tk() 
root.title("Automation") 
root.config(bg="black") 
root.geometry("500x500") 

def submit(): 
    input=e1.get() 
    #the input is a limit set for a variable in the timer that when 
    #it hits that limit, it jumps to the 400 lines of code 
    def Timer(): 
     <timer code> 
    <400 lines of code that has been tested to work 100%> 
    Timer() 

b1=Button(root, command=submit) 
button.grid(row=0, column =0) 
e1=Entry(root, width=50) 
e1.grid(row=0, column=1) 

mainloop() 

而且,我觉得很难发现和明确的信息,如果没有它说GUI的GUI程序“嘿...只是这样做,因为我这么说”,并链接到一些研究/参考材料将不胜感激。

像往常一样,我非常感谢所有这一切都在本网站和所有的智能大大个人,使人们认为它是地方提供的帮助。谢谢你们!

+1

问题出在''。这段代码是否有一个大循环?如果没有,是否有可能将这些代码分成几个毫秒或更少的块来运行? –

+1

你读过以下博客文章吗?它很好地解释了发生的事情:http://stupidpythonideas.blogspot.com/2013/10/why-your-gui-app-freezes.html –

回答

0

您Tk的GUI冻结的原因是因为你有1个线程运行的一切。 mainloop受到submit函数调用的影响,该函数调用必须花费很长时间,因此当您单击按钮时,您可能会在Tk窗口中看到“Not Responding”(未响应)。为了解决这个问题,你需要生成一个单独的线程来submit在运行,这样可以mainloop继续做这件事,并冻结保持你的Tk的窗口。

这是使用threading完成。相反,您的按钮直接调用submit,有按钮调用启动一个新线程,然后开始submit的功能。然后创建另一个函数来检查线程的状态。您也可以添加一个状态栏

import os 
import time 
from datetime import datetime 
import shutil 
import threading 
from Tkinter import * 
import ttk 

def submit(): 
    time.sleep(5) # put your stuff here 


def start_submit_thread(event): 
    global submit_thread 
    submit_thread = threading.Thread(target=submit) 
    submit_thread.daemon = True 
    progressbar.start() 
    submit_thread.start() 
    root.after(20, check_submit_thread) 

def check_submit_thread(): 
    if submit_thread.is_alive(): 
     root.after(20, check_submit_thread) 
    else: 
     progressbar.stop() 

root = Tk() 
frame = ttk.Frame(root) 
frame.pack() 
progressbar = ttk.Progressbar(frame, mode='indeterminate') 
progressbar.grid(column=1, row=0, sticky=W) 

ttk.Button(frame, text="Check", 
     command=lambda:start_submit_thread(None)).grid(column=0, row=1,sticky=E) 
root.mainloop() 
相关问题