Это то, что вы в настоящее время имеете в своем коде:
, который вы установили self.espconnecting = False
, на который вы звоните _connect_esp()
, который вызывает _show_conn_progress()
, который устанавливает self.espconnecting = True
и запускает индикатор выполнения self.sp_pbar.start()
, а затем вызывает _update_conn_progress()
, который проверяет значение self.espconnecting
.Если self.espconnecting
равно True
(что на данный момент), соединение продолжается и индикатор выполнения продолжает катиться, как и ожидалось.Если self.espconnecting
равен False
, индикатор выполнения останавливается self.sp_pbar.stop()
Прежде чем .after()
сможет выполнить обратный вызов за 500 мс, управление передается обратно в _connect_esp
, который устанавливает self.espconnecting = False
.Затем .after()
вызывает _update_conn_progress()
, что означает, что планка должна двигаться,
, но (вот ваша проблема): каково последнее значение self.espconnecting
?=False
следовательно, управление переходит к self.sp_pbar.stop()
, что останавливает полосу прогресса.Вот почему, когда вы комментируете эту строку, ваш код работает должным образом, потому что, даже если там есть ответвление элемента управления, ничто не помешает работе индикатора выполнения.
SOLUTION
Не устанавливайте self.espconnecting = False
в _connect_esp()
, потому что до того, как .after()
сделает обратный вызов за 500 мс, управление будет передано обратно в _connect_esp()
, который устанавливает self.espconnecting = False
, что препятствует работе вашего индикатора выполнения.
Это означает, что вам нужно найти другое средство, чтобы «завершить соединение», как только оно начнется.
Примечание: Я действительно не вижу необходимости в time.sleep(5)
вкод.
Вот один из возможных способов его решения:
...
def __init__( self, master=None, *args, **kw ):
super().__init__( master,style='App.TFrame')
self.master = master
self.espconnecting = False
self.count=0
self._set_style()
self._create_widgets()
def _set_style( self ):
print( '\ndef _set_style( self ):' )
self.style = ttk.Style()
self.style.configure( 'App.TFrame', background='pink')
self.style.configure( 'sp.TFrame', background='light green')
def _create_widgets( self ):
print( '\ndef _create_widgets( self ):' )
self.sp_frame = ttk.Frame( self, style='sp.TFrame' )
self.sp_frame.grid(row=0, column=0)
#self.sp_frame widgets
self.sp_label1 = ttk.Label( self.sp_frame, text='SP(s):')
self.sp_label2 = ttk.Label( self.sp_frame, text='ESP(s):')
self.sp_label3 = ttk.Label( self.sp_frame, )
self.sp_combox = ttk.Combobox( self.sp_frame, state="readonly",
values=['a','b','c'] )
self.sp_combox.bind('<<ComboboxSelected>>', self._connect_esp)
self.sp_pbar = ttk.Progressbar( self.sp_frame, length=200,
mode='indeterminate',
orient=tk.HORIZONTAL, )
self.sp_label1.grid( row=0, column=0 )
self.sp_combox.grid( row=0, column=1, padx=[10,0] )
self.sp_pbar.grid( row=1, column=0, columnspan=2, sticky='ew' )
self.sp_label2.grid( row=2, column=0)
self.sp_label3.grid( row=2, column=1)
def _connect_esp( self, event=None):
print( '\ndef connect_esp( self, event=None ):' )
self._show_conn_progress()
print("START Connection")
time.sleep(5)
def end_connection(self):
print("END Connection")
self.espconnecting = False
def _show_conn_progress( self ):
print( '\ndef _show_conn_progress( self ):' )
self.espconnecting = True
self.sp_label3['text']='Connecting.....'
self.sp_label3.update_idletasks()
self.sp_pbar.start()
self._update_conn_progress()
def _update_conn_progress( self ):
print( '\ndef _update_conn_progress( self ):' )
if not self.espconnecting:
print('connected')
self.sp_pbar.stop()
self.sp_label3['text']='Connected'
else:
print('connecting')
#self.sp_pbar.update_idletasks()
self.after(500, self._update_conn_progress) # Call this method after 500 ms.
self.count=self.count + 1
if self.count==10:
self.end_connection()
def main():
root = tk.Tk()
root.geometry('300x100+0+24')
root.rowconfigure(0, weight=1)
root.columnconfigure(0, weight=1)
app = App( root )
app.grid(row=0, column=0, sticky='nsew')
root.mainloop()
if __name__ == '__main__':
main()