Python Tkinter для запуска подпроцесса в другом потоке, чтобы избежать неотвечающего графического интерфейса

python multithreading python-2.7 tkinter subprocess

532 просмотра

2 ответа

15 Репутация автора

Я боролся с Tkinter некоторое время и исчерпал большинство ресурсов, которые у меня есть, чтобы сослаться на это. Здесь я нашел пару похожих тем, но ни одна из них не привела меня туда, где я должен быть.

У меня есть долго работающий (на самом деле, не долгий, занимает всего 10-12 секунд) сценарий python, который автоматически устанавливает приложение, используя подпроцесс из CLI. Подпроцесс работал, и он успешно установил приложение, однако графический интерфейс блокируется (т.е. зависает / замораживается) после выполнения (и программа больше не запускает последующий код). Я знаю, что я должен использовать многопоточность здесь, но я уже пытался использовать его безрезультатно.

Как часть моего учебного процесса, я клонировал репозиторий из Github и изменил его для работы в Windows (поскольку он работает только на платформе MAC) и планировал расширить его, и это та часть, в которой я застрял. Я впервые использую TKinter, и я прошу прощения, если я пропустил что-то глупое или неправильно задал вопрос. Надеюсь, вы сможете мне помочь и заранее благодарим вас за помощь.

Код можно найти по этой ссылке .

Автор: Maynard Источник Размещён: 15.07.2016 03:05

Ответы (2)


0 плюса

5188 Репутация автора

Вы определили кнопку

installButton = Button(bottomFrame, text=installButtonTxt,
                       command=on_install_thread, width=9)

с обработчиком команд

def on_install_thread():
    ...
    loop_thread = threading.Thread(target=on_install_button_active,
                                   args=['button', 'model', itemSelectCount])

и цель для потока on_install_button_active.

затем

def on_install_button_active(button, model, selectcount):
    ...
    # Reset install status
    installStatus = 'complete'
    # Remove Cancel Button
    cancelButton.destroy()
    # Activate Install/Done button and menus
    installButton.configure(state=NORMAL)
    # menuControl('normal')
    refreshGui(mainWindow)

Похоже, в конце есть код on_install_button_active, включающий виджеты Tkinter. Вызов методов tkinter из других потоков кажется ненадежным, например, 1 .

Можно определить виртуальные события

def renderMainWindow():
    ...
    mainWindow.bind('<<InstallComplete>>', on_install_complete)

def on_install_complete():
    cancelButton.destroy()
    installButton.configure(state=NORMAL)

def on_install_button_active(button, model, selectcount):
    ...
    # Reset install status
    installStatus = 'complete'

    mainWindow.event_generate('<<InstallComplete>>', when='tail')

Если в этом потоке есть другие вызовы, связанные с виджетами Tkinter, возможно, их лучше удалить.

Автор: J.J. Hakala Размещён: 16.07.2016 12:28

0 плюса

15 Репутация автора

Мне удалось решить проблемы с моим графическим интерфейсом с помощью mtTkinter и со ссылкой на этот пост .

Автор: Maynard Размещён: 28.07.2016 04:07
Вопросы из категории :
32x32