Окно многопроцессорной обработки tkinter не отвечает при обратном отсчете - PullRequest
0 голосов
/ 05 марта 2019

В настоящее время я работаю над своим проектом курсовой работы, и я хочу выполнить простую функцию. Программа в основном на 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

и я попробовал многопроцессорную обработку, когда получил информацию о GIL в python:

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 голосов
/ 05 марта 2019

Вы можете обернуть цикл 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...