Задать вопрос

GO + FYNE GUI как запустить скрипт после подтверждения в диалоговом окне dialog.ShowConfirm?

Пытаюсь сделать desktop приложение, парсер контента с использованием GUI библиотеки Fyne.
Столкнулся с проблемой с логикой выполняя скрипта, а именно с подтверждением в диалоговом окне виджета dialog.ShowConfirm.
В процессе исполнения скрипта, пользователь получает диалоговое окно с предложением отказаться или продолжить парсинг.

68d3c507672a6586307531.jpeg
В соответствии с документацией в функции обратного вызова виджета, после подтверждения пользователям, запускается процесс парсинга контента, который занимает какое-то время.

testStart := widget.NewButtonWithIcon(" Test ", theme.InfoIcon(), func() {
	dialog.ShowConfirm(
		"Начать парсинг?",
		fmt.Sprintf("Ссылки для парсинга получены"),
		func(yes bool) {
			if yes {
				progress.Show() // Порказываем и запускаем прогрессбар
				progress.Start()
				fmt.Println("Start")
				qty, file_name := parsing(urls) // функция  - парсинг товаров по ссылкам
				//time.Sleep(5 * time.Second)
				progress.Stop()
				dialog.NewInformation("Данные получены", "Все работает!", myWindow).Show()
			} else {
				return
			}
		},
		myWindow,
	)
})

Однако диалоговое окно после подтверждения пользователем не закрывается сразу, а продолжает висеть до окончания выполнения функции обратного вызова. То есть, окно открыто до завершения процесса парсинга, который занимает какое-то время, и закрывается только после его окончания.

Не могу понять, начать работу функции парсинга, только после закрытия диалогового окна.
  • Вопрос задан
  • 76 просмотров
Подписаться 1 Простой 4 комментария
Решения вопроса 1
Vamp
@Vamp
Вам нужно вынести парсинг в отдельную горутину, так как диалоговое окно закрывается только после завершения выполнения callback функции. А так как вы весь парсинг выполняете в ней, то диалог, соответственно, ждёт.

testStart := widget.NewButtonWithIcon(" Test ", theme.InfoIcon(), func() {
	dialog.ShowConfirm(
		"Начать парсинг?",
		fmt.Sprintf("Ссылки для парсинга получены"),
		func(yes bool) {
			if yes {
				progress.Show() // Порказываем и запускаем прогрессбар
				progress.Start()
				fmt.Println("Start")
				go doTheJob()
			} else {
				return
			}
		},
		myWindow,
	)
})

func doTheJob() {
	qty, file_name := parsing(urls) // функция  - парсинг товаров по ссылкам
	//time.Sleep(5 * time.Second)
	// Обновление виджетов разрешено делать только из главной горутины,
	// поэтому нужно шедулить обновление виджетов через fyne.Do
	fyne.Do(func() {
		progress.Stop()
		dialog.NewInformation("Данные получены", "Все работает!", myWindow).Show()
	})
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы