尝试使用无限循环在python中进行多线程,但是我的GUI仍然会冻结

时间:2015-08-11 13:41:38

标签: python multithreading user-interface freeze

所以我对编程很缺乏经验,但是当我享受它时,我想我会分支并尝试一些东西。 我正在尝试编写的程序执行我已经在tkinter GUI窗口中编写的代码,并设置为每天在特定时间运行,直到程序关闭。 (基本上是花哨的警报)。为了做到这一点,我尝试使用线程模块在后台的不同线程上运行无限“while”循环,同时仍然可以将GUI用于其他事情。

def continuous_task(args):
    while 0==0:
        currenttime = time.localtime(time.time())
        if currenttime.tm_hour == 8 and currenttime.tm_min == 0 and currenttime.tm_sec == 0:
            task(args)


def background_task(args):
    thread1 = Thread(target = continuous_task(args))
    thread1.start()
    return None

root = Tk()
frame1 = Frame(root)
frame1.pack()
frame2 = Frame(root)
frame2.pack()
frame3 = Frame(root)
frame3.pack()
inputbox = Entry(frame2, width = 20)
inputbox.pack(side = 'left', pady = 10)
header = Label(frame1, text = 'Header', height=3, width = 60)
header.pack(side = 'left')
button = Button(frame2, text = 'Start', width = 10, command = lambda: background_task(inputbox.get()))
button.pack(side = 'left')
Close = Button(frame3, text = 'Close Program', command = root.quit)
Close.pack(side = 'bottom', pady = 5)
root.mainloop()

当我运行此代码时,当我按下启动时,GUI仍然会冻结,并且由于我不完全理解线程模块,因此我对此问题的调试有点困惑。

1 个答案:

答案 0 :(得分:3)

def background_task(entry_value):
    thread1 = Thread(target=continuous_tasks, args=(entry_value,))
    thread1.start()
    return None

了解threadingmultiprocessing图书馆的典型未知。写target=continous_tasks(args)等同于运行continuous_tasks(args)并撰写target=None

<小时/> 由于您是编程新手,这里有一些关于您想要尝试的提示。函数continuous_tasks是在特定时间(小时分钟)运行的函数。签出模块schedule,这是正确的方法。

另外,在侧面线程中进行无限循环绝对不是一个好主意。避免这样做,除非你的线程中有一些中断(如threading.{Condition,Event,...}time.sleep),即使你这样做,你肯定会在你的线程中做出停止条件线程。