При клонировании при помощи git репозитария, возникла ошибка «SSL certificate problem». Обычно это означает что корневой сертификат не является доверенным. В моём случае, всё хорошо, просто тов. Касперский лезет туда куда не нужно бы лезть — а именно для того чтобы перехватывать трафик пропускает весь трафик на порту 433 через себя, подсовывая свой корневой сертификат. Отключить сиё в виду определенных причин я не могу, потоэтому придётся научить git игнорировать ошибки проверки сертификата. Сделать это можно двумя способами: длинным и коротким:
Часто возникают ситуации, что необходимо отобразить данные на форме в виде таблицы (динамическая таблица значений на форме). Классический метод — добавить к документу (справочнику и т.п.) табличную часть — объект. Но из этого возникает значительный минус — при записи данные будут храниться в БД. А если это не нужно, и данные должны подтягиваться динамически из других таблиц? Выход есть — создать таблицу не как объект, а как переменную формы. В этом случае данные в БД сохраняться не будут. Что для этого нужно?
Создать реквизит с типом «Таблица значений»:
Затем добавить колонки реквизита, указывая для них необходимый тип:
Далее, перетащите получившуюся таблицу на форму:
И остаётся только при событии формы «При создании на сервере», заполнить эту таблицу:
Как результат — получим динамически формируемую таблицу на управляемой форме 1С (динамическая таблица значений). Другие статьи по теме 1С можете найти здесь
Редко, но бывают ситуации, что под рукой только консоль терминала, а нужно скачать файл размещенный на яндек.диске (скачать с яндекс диска из консоли). Для решения такой ситуации есть утилита wldhx.yadisk-direct. Установим её:
pip3 install wldhx.yadisk-direct
После установки, закачка (скачать с яндекс диска из консоли) сводится к одной команде:
Опрос клавиатуры при помощи curses несколько запутан. Во первых есть способ получить одиночное нажатие кнопки при помощи:
res=stdscr.getkey()
В этом случае в res попадёт непосредственно сам символ в виде строки.
Второй способ — использование :
res=stdscr.getch()
В этом случае в res попадет число вида int — код нажатой кнопки. Однако оба способа не работают, когда нужно получить данные о нажатой специальной клавиши, типа стрелок, F1..F12 и т.д. Если необходимо их получить, то нужно сначала включить данную возможность:
stdscr.keypad(True)
Зачем так сделано, загадка. Почему нельзя получить эти данные сразу?
Так-же есть способ отключить ожидание нажатия кнопки, при помощи:
curses.cbreak()
Итог: задача «Опрос клавиатуры при помощи curses» выполнена. Можете почитать и другие заметки посвященные Python. Официальная документация на curses здесь
Итак, продолжаем продолжаем писать квест в консоли на языке Python. Первая часть описана здесь. В ней мы реализовали автоматическую загрузку и сохранение состояния прохождения квеста. Сейчас же займемся (начнем по крайне мере) отрисовкой локации, и реакцией на нажатые кнопки. В локации предусмотрим возможность отображения картинки из ASCII. Например json стартовой локации может выглядеть примерно так:
Создадим класс TLocation, при инициалиизации будем передавать в него инициализированный класс player. В переменной класса data — будем хранить загруженную локацию.
class TLocation:
data = {}
player={}
stdscr=curses.initscr()
scr_size=stdscr.getmaxyx()
def __init__(self,player):
self.player=player;
def load_location(self, location):
f = open("locations/" + str(location) + ".json", mode='r', encoding='utf-8')
self.data = json.load(f)
f.close()
Далее нарисуем верхнее меню, где сообщаем игроку, на какие локации он может перемещаться, и что он держит в руках:
def top_menu(self):
loc="Идти: "
if "left" in self.data["available_locations"]:
loc=loc+"влево(4) "
if "right" in self.data["available_locations"]:
loc=loc+"вправо(6) "
if "forward" in self.data["available_locations"]:
loc=loc+"вперед(8) "
if "back" in self.data["available_locations"]:
loc=loc+"назад(2) "
curses.start_color()
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
self.stdscr.addstr(1, 1, loc,curses.color_pair(1))
curses.init_pair(1, curses.COLOR_RED, curses.COLOR_BLACK)
self.stdscr.addstr(1, 1, loc,curses.color_pair(1))
# что в руках
hands = "В руках: "
self.stdscr.addstr(2, 1, "")
for object in self.player.data["in_hands"]:
hands=hands+"["+object+"]"
if len(self.player.data["in_hands"])==0:
hands = hands+"ничего нет"
self.stdscr.addstr(2, 1, hands, curses.color_pair(1))
Ну и собственно основной код отрисовки локации, включающий бесконечный цикл ожидания нажатий клавиатуры. Предусматриваем переход на другую локацию, выход из игры и сохранение игры.
def location_view(self, location):
self.load_location(location)
self.stdscr.clear()
self.stdscr.border()
self.top_menu() # рисуем верхнее меню
# название локации
curses.init_pair(2, curses.COLOR_GREEN, curses.COLOR_BLACK)
x = int((self.scr_size[1] - len(self.data["title"])) / 2)
self.stdscr.addstr(2, x, self.data["title"],curses.color_pair(2))
# рисуем рисунок ежели он есть
y=3
if "ascii_art" in self.data:
mass_art=self.data["ascii_art"].split("\n")
i=0
while i<len(mass_art):
x=int((self.scr_size[1]-len(mass_art[i]))/2)
self.stdscr.addstr(y+i, x, mass_art[i])
i+=1
y = y + len(mass_art);
# Выводим описательную часть
curses.init_pair(3, curses.COLOR_CYAN, curses.COLOR_BLACK)
self.stdscr.addstr(y, 1, self.data["description"],curses.color_pair(3))
# Выводим нижнее меню
curses.init_pair(4, curses.COLOR_RED, curses.COLOR_BLACK)
self.stdscr.addstr(y + 1, 1, "Осмотреться вокруг [v] Применить что в руках [h]", curses.color_pair(4))
self.stdscr.addstr(y + 2, 1, "Выйти из квеста [q] Сохранить состояние [r]", curses.color_pair(4))
self.stdscr.refresh()
while True:
key=self.stdscr.getch()
print(key)
# реализация перехода с локации на локацию
if key==52 and "left" in self.data["available_locations"]:
self.player.data["location"]=self.data["available_locations"]["left"]
self.location_view(self.player.data["location"])
if key==54 and "right" in self.data["available_locations"]:
self.player.data["location"]=self.data["available_locations"]["right"]
self.location_view(self.player.data["location"])
if key==56 and "forward" in self.data["available_locations"]:
self.player.data["location"]=self.data["available_locations"]["forward"]
self.location_view(self.player.data["location"])
if key==50 and "back" in self.data["available_locations"]:
self.player.data["location"]=self.data["available_locations"]["back"]
self.location_view(self.player.data["location"])
if key == 114:
self.player.save()
#self.message("Внимание!","Состояние прохождения завершено. \nФайл находится в папке /saves")
if key==113:
curses.reset_shell_mode()
curses.endwin()
exit(0)
print(self.data)
В результате картинка (квест в консоли) на мониторе выглядит уже чуть симпатичнее: