У меня есть графический интерфейс tkinter, который позволяет пользователям выполнять поиск в базе данных sqlite. База данных не статична, поэтому неизвестно, сколько времени займет каждый поиск. Приложение является однопоточным (и я бы хотел, чтобы оно оставалось таким). Поэтому я хотел бы, чтобы индикатор выполнения (или что-то анимированное) убедил пользователя, что что-то происходит во время поиска. На первый взгляд ttk.ProgressBar
выглядел так, как будто он может добиться цели в режиме indeterminate
, но, похоже, он не работает так, как описано в TkDocs.
Для неопределенного прогресса TkDocs сообщает...
... в начале операции вы просто вызовете метод "start" индикатора выполнения, а в конце операции вы вызовете его метод "stop". Индикатор выполнения позаботится обо всем остальном.
... но, похоже, это не так. Если я просто использую .start()
перед выполнением моего запроса sqlite и .stop()
после его завершения, индикатор выполнения присутствует, но не анимируется вообще.
Я могу заставить его обновиться, если выполню оператор sqlite select в цикле for
и включу prog.step()
и prog.update_idletasks()
. Но это влияет на производительность и действительно работает, только если возвращается несколько строк, поскольку цикл for row in select_statement:
.
Итак, как я могу получить неопределенный индикатор выполнения (или анимацию) для анимации в одном потоке, не заставляя его использовать step
и update_idletask
?
Код. Это не работает...
prog = ttk.ProgressBar(root,mode='indeterminate')
...
prog.start()
result = None
try:
conn = sqlite3.connect(database)
result = conn.execute('select * from table where a=? and b=?',(var1,var2))
result = result.fetchall()
conn.close()
except:
handle the exception
prog.stop()
Работает, но хакерский.
prog = ttk.ProgressBar(root,mode='indeterminate')
...
prog.start()
result = None
try:
for row in conn.execute('select * from table where a=? and b=?',(var1,var2)):
result.append(row)
prog.step()
prog.update_idletasks()
conn.close()
except:
handle the exception
prog.stop()
.mainloop()
? - person PM 2Ring   schedule 22.01.2015toplevel
, которое пользователь открывает из окнаroot
,mainloop
которого уже инициализировано. - person I_do_python   schedule 22.01.2015