@b_l_u_m_e

Выдаёт ошибку в боте для тг, не получается вызвать функцию, как это починить?

Вот код но не получается запустить функцию play, как это починить?
Вот это выдаёт при запуске:
Traceback (most recent call last):
File "C:\python\bot.py", line 64, in
bot.polling(none_stop=True, interval=0)
File "C:\Users\ewanm\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 618, in polling
self.__threaded_polling(non_stop, interval, timeout, long_polling_timeout, allowed_updates)
File "C:\Users\ewanm\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 680, in __threaded_polling
raise e
File "C:\Users\ewanm\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\__init__.py", line 640, in __threaded_polling
self.worker_pool.raise_exceptions()
File "C:\Users\ewanm\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\util.py", line 143, in raise_exceptions
raise self.exception_info
File "C:\Users\ewanm\AppData\Local\Programs\Python\Python310\lib\site-packages\telebot\util.py", line 89, in run
task(*args, **kwargs)
File "C:\python\bot.py", line 35, in yrn
bot.register_next_step_handler(message, play)
NameError: name 'message' is not defined

import telebot
import config
import random
from telebot import types
bot = telebot.TeleBot(config.TOKEN)

name = ''

game = False 

@bot.message_handler(content_types=['text', 'button'])
def start(message):
	if message.text == '/reg':
		bot.send_message(message.from_user.id, "Как тебя зовут?")
		bot.register_next_step_handler(message, get_name)
	else:
		bot.send_message(message.from_user.id, "Напиши /reg")

def get_name(message):
	global name
	name = message.text
	bot.send_message(message.from_user.id, "Привет " + name + ", какое у тебя прекрасное имя.")
	yrn = types.InlineKeyboardMarkup(row_width = 2)
	yes = types.InlineKeyboardButton("Давай", callback_data = "yes")
	no = types.InlineKeyboardButton("Не хочу", callback_data = "no")
	yrn.add(yes, no)
	bot.send_message(message.from_user.id, "Ну что, сыграешь со мной в камень-ножнцы-бумага?", reply_markup=yrn)


@bot.callback_query_handler(func=lambda call:True)
def yrn(call):
	if call.message:
		if call.data == "yes":
			bot.send_message(call.message.chat.id, "Отлично")
			game = True
		else:
			bot.send_message(call.message.chat.id, "Ну и ладно")

if game == True:
	def play(message):
		markup = types.InlineKeyboardMarkup(row_width = 3)
		Kamen = types.InlineKeyboardButton("Камень", callback_data = "1")
		Nozhnici = types.InlineKeyboardButton("Ножницы", callback_data = "2")
		Bumaga = types.InlineKeyboardButton("Бумага", callback_data = "3")
		markup.add(Kamen, Nozhnici, Bumaga)
		bot.send_message(message.chat.id, "Отлично, выбирай за кого ты будешь играть:", reply_markup=markup)
else:
	bot.send_message(message.from_user.id, "Напиши /reg")

def callback(call):
	if call.message:
		if call.data == "1":
			bot.send_message(call.message.chat.id, "Ты выбрал камень")
		elif call.data == "2":
			bot.send_message(call.message.chat.id, "Ты выбрал ножницы")
		elif call.data == "3":
			bot.send_message(call.message.chat.id, "Ты выбрал бумагу")








bot.polling(none_stop=True, interval=0)
  • Вопрос задан
  • 154 просмотра
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Уф. Тут очень много проблем. В первую очередь с пониманием того, как выполняется скрипт на питоне, и областей видимости.
Для начала:
if call.data == "yes":
      bot.send_message(call.message.chat.id, "Отлично")
      game = True

Ты присваиваешь значение локальной переменной game, а не глобальной, которую ты описал выше.
Далее:
if game == True:
  def play(message):
    ...
else:
  bot.send_message(message.from_user.id, "Напиши /reg")

Ты понимаешь, что этот код объявлен вне функции? Как следствие, он выполнится один раз, при старте скрипта. У тебя game в этот момент не будет равно True, и функция play() не будет определена.

Боты - это не простая тема, а боты с автоматами состояний - тем более. Поучи Питон сначала, кроме шуток.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы