Ali-RNT Ответов: 1

Зачем на это время.сна и после заморозить всю программу на Python?


В моей программе python, использующей TKinter, функция "code04" вызывает printIt04, и эта функция каждый раз что-то печатает и ждет в течение 0,2 секунды. но когда вызывается "code04", все приложение зависает, а затем весь текст будет напечатан один раз. Как я могу ее решить?

Что я уже пробовал:

	def code04(self):
		w = len(self.Matrix[0])
		for x in range(0, 8):
			self.printIt04(w, x)

.
.
.
	def printIt04(self, w, x):
		if (w > 200):
			MStartCol = int(round( (w - 200)/2))
			MEndCol = 200 + MStartCol
			IStartCol = 0
			IEndCol = 200
		else:
			MStartCol = 0
			MEndCol = w
			IStartCol = int(round( (200 - w)/2))
			IEndCol = IStartCol + w
		r = int(round( (w - 200)/2))
		for col in range(MStartCol, MEndCol):
			for row in range(0, x+1):
				if self.Matrix[7-row][col] == 1:
					self.img.put ("#ff0000", ( IStartCol - MStartCol + col, 7-row))
				else:
					self.img.put ("#000000", ( IStartCol - MStartCol + col, 7-row))
		time.sleep(0.2)

Sergey Alexandrovich Kryukov

Я не могу представить себе ни одного допустимого случая использования сна в потоке пользовательского интерфейса. Почему?
—СА

1 Ответов

Рейтинг:
10

Dave Kreskowiak

Причина этого заключается в том, что весь ваш код выполняется в потоке запуска, иначе известном как "поток пользовательского интерфейса". Ваш код захватывает поток, останавливая его от получения и обработки сообщений WM_PAINT, которые получает поток. Пока ваш код не вернется и поток не вернется в режим ожидания, эти сообщения paint будут просто стоять в очереди. Когда Вы, наконец, отказываетесь от контроля, все сообщения в очереди обрабатываются, и окно перекрашивается, показывая вам конечный результат.

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


Ali-RNT

Спасибо! Я думаю, что лучше использовать отдельный поток, хотя я никогда не использовал его в python. Вы знаете хорошую рекомендацию для этого?

Dave Kreskowiak

Я вообще не использую Python.