Форум программистов, компьютерный форум, киберфорум
Python: Tkinter
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.86/64: Рейтинг темы: голосов - 64, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 40

Tkinter и многопоточность

02.08.2015, 01:05. Показов 12297. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, возникла потребность создать приложение, с графическим интерфейсом, есть функция, которая при обработки занимает достаточное время, чтоб пользователь начал задаваться вопросом, а работает ли приложенька или умерла. Для этого хочу повесить на главное окно (или дочернее) прогресс бар (неопределенный по времени) на время пока работает функция. Конечно такого типа варианты не работают:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
from tkinter import *
from tkinter import ttk
import time
 
def lets_go():
    pr_bar = ttk.Progressbar(root)
    pr_bar.grid()
    pr_bar.start() #прогресс бар начал работать
    time.sleep(10)  #идет параллельный процесс, прогресс бар работает
    pr_bar.stop() #процесс закончился, прогресс бар остановился
 
root = Tk()
btn = ttk.Button(root, text = 'Поехали', command = lets_go) # инициация по кнопке
btn.grid()
Т.к. окно замораживается на время выполнения функции и когда отходит, прогресс бар уже не нужен. Видимо нужно на время работы функции создать второй поток и вырубить его по ее окончании. Раньше не работал с потоками, не знаю как обращаться и какие модули нужны.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.08.2015, 01:05
Ответы с готовыми решениями:

TKinter: как организовать многопоточность?
Доброго всем времени суток! Суть проблемы такова: есть программа, в которой работают два потока. Один поток - поток GUI, второй...

Как сделать так, чтобы при использовании модуля из tkinter не открывалось окно tkinter?
Как сделать так, чтобы при использовании модуля из tkinter не открывалось окно tkinter? Я пишу приложение на kivy но использую ...

Виджеты tkinter и tkinter.ttk (используется Python 3.5.2)
1) Проблема с виджетом Scale (ползунок) модуля tkinter. Я создал ползунок от 1 до 50 (как на первой картинке). По умолчанию стоит на 1....

6
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
02.08.2015, 01:22
Для работы с потоками используется модуль threading, но tkinter не потобезопасная библиотека, по этому ты не можешь просто запустить функцию lets_go в отдельном потоке.

Тебе нужно запускать в отдельном потоке обработку данных, в этом потоке будет происходить обработка и этот поток будет как-то уведомлять основной о своём статусе. Предавать уведомления можно с помощью какого нибудь потокозопасного объекта. Поток складывает нужную информацию или какие-то уведомления в твой объект, на пример Queue.Queue, а в главном потоке из этого объекта информация извлекается и отдаётся пользователю. В случае tkinter забирать из очереди сообещния и отдавать их пользователю нужно с помощью метода after.

Добавлено через 1 минуту
Вообще я бы советовал тебе использовать pyqt, это очень удобная и ооочень функциональная библиотека в отличии от tkinter + там реализован механизм сигналов с помощью, которого просто оочень удобно передавать данные из отдельного потока в основной.
1
 Аватар для Фаер
792 / 398 / 260
Регистрация: 09.12.2011
Сообщений: 786
Записей в блоге: 53
03.08.2015, 17:18
Лучший ответ Сообщение было отмечено Efresco как решение

Решение

Цитата Сообщение от Efresco Посмотреть сообщение
Видимо нужно на время работы функции создать второй поток и вырубить его по ее окончании.
Да-нет, просто update() надо использовать. Я сильно не заморачивался с примером, но вот:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
from tkinter import *
from tkinter import ttk
 
def lets_go():
    pr_bar=ttk.Progressbar(root,variable=provar)
    pr_bar.pack(side=TOP)
    root.update()
    root.after(2000,provar.set(25))
    pr_bar.update()
    root.after(2000,provar.set(45))
    pr_bar.update()
 
root = Tk()
ttk.Button(root, text = 'Поехали', command = lets_go).pack(side=BOTTOM)
provar=IntVar()
provar.set(0)
root.mainloop()
Метод after() откладывает выполнение какой-либо функции.

Просто бьёте свой код на несколько последовательно выполняющихся функций, в конце каждой изменяете переменную ProgressBar'a и вызываете на нём update(). Или прямо между командами несколько update'ов пишете и всё. Короче, суть Вы поняли.
2
2 / 2 / 1
Регистрация: 09.04.2015
Сообщений: 52
04.08.2015, 11:58
Фаер, а какой смысл второй раз писать:

Python
1
from tkinter import ttk
если изначально мы все импортировали из tkinter, командой:

Python
1
from tkinter import *
0
 Аватар для Фаер
792 / 398 / 260
Регистрация: 09.12.2011
Сообщений: 786
Записей в блоге: 53
04.08.2015, 12:27
deadmensch, так я просто скопировал скрипт ТС. Ему, видимо, так нужно.
Например, при сборке через cx_Freeze такой импорт имеет смысл, потому что вложенные модули, в частности, tkinter'овские, теряются.
0
0 / 0 / 0
Регистрация: 06.01.2015
Сообщений: 40
05.08.2015, 23:13  [ТС]
Фаер, Всё получилось, спасибо
0
0 / 0 / 0
Регистрация: 07.08.2015
Сообщений: 49
07.08.2015, 00:18
Хоть и не я задавал тему, но мне вы тоже помогли
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.08.2015, 00:18
Помогаю со студенческими работами здесь

Как сделать окно tkinter неактивным по нажатии на него. Оверлей на Tkinter
Здравствуйте. Пытаюсь сделать оверлей на tkinter, поскольку многие модули из интернета нерабочее на моем ПК. Уже все готово, кроме одной...

Ошибка при попытке открыть программу через консоль, import tkinter as tk ModuleNotFoundError: No module named 'tkinter'
import tkinter as tk ModuleNotFoundError: No module named 'tkinter' Пытаюсь открыть через py main.py, находясь в директории проекта ...

Tkinter
Помогите пожалуйста, должно выйти окно, но я не могу понять что писать в modele.

Tkinter
Суть в том, что я пишу скрипт, в котором при вводе названия файла, он передает свои данные в отдельные строки окна, а именно в виджет...

tkinter
Используя справочную литературу, изучить модуль tkinter. Реализовать класс из предыдущего задания, используя оконный интерфейс и кнопки. ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru