tkinter multiprocessing-root窗口递减计数时无响应

时间:2019-03-05 16:26:11

标签: python tkinter multiprocessing

当前,我正在从事课程工作项目,并且有一个我想实现的简单功能。该程序主要在tkinter上,我希望标签显示3秒钟,隐藏7秒钟,持续一个周期,而在下一个周期中,标签中的文本应更改;标签更改时,我尝试从前3秒钟禁用输入框,然后对其进行标准化。

倒计时和标签文本更改都可以,但是对输入框进行标准化后根本不响应。

这是我的代码

    def c_time():
    from tkinter import *
    import time

    root=Tk()
    en = Entry(root)
    en.pack(side=TOP)
    en.focus_force()
    la = Label(root, text='6666')
    la.pack(side=BOTTOM)

    li = ['a', 'b','c','d']
    for i in li:
        la.config(text=i)
        root.update()
        def la_diappear():
            root.after(3000)
            la.pack_forget()
            root.update()
        def la_appear():
            root.after(7000)
            la.pack()
        la_diappear()
        la_appear()

    root.mainloop()
c_time()

尝试了root.after和time.sleep方法

当我在python中获得有关GIL的信息时,我尝试了多处理:

from multiprocessing import Process
import time
from  tkinter import *


def count_down():
    global total
    total = 5
    for i in range(total):
        time.sleep(1)
        total -= 1
        print(total)

def tkwindow():
    root=Tk()
    en = Entry(root)
    en.pack(side=TOP)
    en.focus_force()
    la = Label(root, text='6666')
    la.pack(side=BOTTOM)
    li = ['a', 'b','c','d']

    for i in li:
        la.config(text=i)
        root.update()
        count_down()
        if total == 3:
            la.pack_forget()
            root.update()
        if total == 5:
            la.pack()

    root.mainloop()


if __name__ == "__main__":
    a = Process(target=count_down)
    b = Process(target=tkwindow)
    b.start()

上面的代码应该立即可用。

请回复任何想法

非常感谢您。

1 个答案:

答案 0 :(得分:0)

您可以将for循环包装在一个函数中,并对该函数进行线程化。然后,您也可以使用time.sleep而不阻塞主线程。

from tkinter import *
from threading import Thread
import time

root=Tk()
en = Entry(root)
en.pack(side=TOP)
en.focus_force()
la = Label(root, text='6666')
la.pack(side=BOTTOM)

def la_diappear():
    la.pack_forget()

def la_appear():
    la.pack()

def actions():
    li = ['a', 'b','c','d']
    for i in li:
        la.config(text=i)
        time.sleep(3)
        la_diappear()
        time.sleep(7)
        la_appear()

t = Thread(target=actions)
t.start()

root.mainloop()