message.text
посмотреть в message.text_markdown
или message.text_html
(доки)? Ну и соответственно указать не text, а markdown или html при вызове send_message(). Если запускать через cmd не работает
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\DeviceClasses\{4d36e978-e325-11ce-bfc1-08002be10318}
. Во вложенных ветках будет свойство DeviceInstance
, собираешь значения этого свойства. Затем заглядываешь в HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\сюда вставляешь значение DeviceInstance\Device Parameters
, там можно найти имя порта и еще кое-что полезное.ODBC Driver 18 for SQL Server
.server = 'Serv'
database = 'resource'
username = ''
password = ''
connectionString = f'DRIVER={{ODBC Driver 18 for SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password}'
cnxn = pyodbc.connect(connectionString)
N = 18
R = 200
for _ in range(N):
turtle.circle(R, 360 / N)
time.sleep(0.1)
turtle.pencolor("white")
.# Функция отображения
async def show_pages(chat_id, page):
...
# тут ты отправляешь сообщение!
sent_message = await bot.send_message(chat_id, text='Выберите страницу:', reply_markup=keyboard)
return sent_message.message_id
# Обработчик кнопок
async def callback_handler(query: types.CallbackQuery):
...
message_id = await show_page(query.message.chat.id, page=current_page) # <-- show_page() отправляет сообщение!
# Редактируем сообщение вместо отправки нового <-- не вместо, а после отправки нового
await bot.edit_message_text(chat_id=query.message.chat.id, message_id=query.message.message_id, text='Выберите страницу:',
reply_markup=InlineKeyboardMarkup()) # <-- сносишь клавиатуру у старого сообщения
try:
from .wtf import stuff
except ImportError:
from wtf import stuff
from __init__ import *
class Parent:
known_children = [] # список классов-потомков Parent
@staticmethod
def register(klass): # декоратор для регистрации классов-потомков
Parent.known_children.append(klass)
return klass
@classmethod
def can_handle(cls, data): # "эй, потомок, ты можешь себя создать из этих данных?"
raise NotImplementedError()
@staticmethod
def make(data): # создаёт экземпляр одного из потомков
for child in Parent.known_children:
if child.can_handle(data): # потомок согласился обработать данные?
return child(data) # вызываем конструктор класса-потомка
else: # относится к for ... in !
raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
# тут остальная начинка класса
...
# а это пример потомка
@Parent.register # явная регистрация потомка через декоратор
# так удобнее, потому что так можно создавать промежуточных потомков,
# которые не будут реально использоваться - только в наследовании
class SomeChild(Parent):
@classmethod
def can_handle(cls, data):
return data.get('name', None) == 'SomeChild' # критерий для определения - наш случай или нет?
def __init__(self, data):
self.x = data['x']
self.y = data['y']
c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69}) # создаст экземпляр SomeChild
print(c)
try:
Parent.make({'name': 'invalid'}) # потерпит неудачу
except TypeError as err:
print(err)
admin/
. Скорее всего, он ведёт на какую-то админ-панель. Стоит взглянуть.import re
pattern = re.compile(r'^\d+\.\s+') # начало строки, 1+ цифра, точка, 1+ пробел
# re.compile() можно сделать один раз, а потом переиспользовать полученный pattern
text = '1. Салат 1'
result = pattern.sub('', text) # заменяем пустой строкой подходящие под шаблон части text
print(result)
def setting(self):
self.server.check_currency()
...
self.setting()
window1 = Kurz()
, так как приложение уйдёт в рекурсивный вызов self.setting()
и из него уже не вернётся.