import customtkinter as ctk
app = ctk.CTk()
def resize_frame(event):
# Растягиваем frame на всю площадь canvas
canvas.itemconfig(frame_id, width=event.width-2*padx)
# Ширина и высота отступов
padx =20
pady = 20
# Canvas
canvas = ctk.CTkCanvas(app, bg="blue", highlightthickness=0)
canvas.pack(fill='both', expand=True, padx=padx, pady=pady)
# Функция привязки изменения размера Canvas
canvas.bind('<Configure>', resize_frame)
main_frame = ctk.CTkFrame(app, bg_color='white')
frame_id = canvas.create_window((20, 20), window=main_frame, anchor='nw')
scrollbar = ctk.CTkScrollbar(app, command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)
scrollbar.place(relx=1, rely=0, relheight=1, anchor='ne')
# наполнение
for i in range(40):
ctk.CTkButton(main_frame, text='Click Me').pack(pady=10)
canvas.update_idletasks()
canvas.configure(scrollregion=canvas.bbox("all"))
app.mainloop()
function restartTimer(
originalFunc: (...args: any[]) => void,
newDelay: number,
...args: any[]
): number {
clearTimeout(timerId); // timerId должен быть доступен в области видимости
return setTimeout(originalFunc, newDelay, ...args);
}
// Используйте так:
let timerId: number; // Храните timerId в доступном месте
function testFunc(param1: string, param2: string) {
console.log(param1);
console.log(param2);
}
// Запуск таймера
timerId = setTimeout(testFunc, 5000, 'asd', 'qwe');
// В нужный момент перезапустить таймер с новым временем. Например, с 10000 мс.
timerId = restartTimer(testFunc, 10000, 'asd', 'qwe');
const data = await this._db.collection('counters').findOne(
{ "objectId": { $exists: true } },
{ projection: { _id: 0, objectId: 1 } }
);
// Теперь data уже будет содержать только 'objectId',
// и вы можете обращаться так: data.objectId.last
await this._db.collection('counters').updateOne(
{ "objectId": { $exists : true } },
{ $inc: { "objectId.last": 1 } } // инкрементируем поле 'last' объекта 'objectId' на 1
);
function shortPathWithDistances(graph, start, end) {
const distances = {};
const visited = new Set();
const path = {};
const edgeWeights = {}; // Новый объект для хранения весов ребер
for (const key in graph) {
if (key !== start) {
distances[key] = Infinity;
} else {
distances[start] = 0;
}
}
while (!visited.has(end)) {
let lowestDistance = Infinity;
let node = null;
for (const key in distances) {
if (lowestDistance > distances[key] && !visited.has(key)) {
lowestDistance = distances[key];
node = key;
}
}
const neighbors = graph[node];
for (const key in neighbors) {
const newDistance = distances[node] + neighbors[key];
if (newDistance < distances[key]) {
distances[key] = newDistance;
path[key] = node;
edgeWeights[key] = neighbors[key]; // Сохраняем вес ребра
}
}
visited.add(node);
}
const shortPath = [];
let current = end;
while (current !== start) {
const currentWithDistance = { node: current, edgeWeight: edgeWeights[current] };
shortPath.unshift(currentWithDistance);
current = path[current];
}
shortPath.unshift({ node: start, edgeWeight: 0 });
return shortPath;
}
# Dockerfile
...
# Установка прав доступа в скрипте инициализации
COPY ./set-permissions.sh /usr/local/bin/set-permissions.sh
RUN chmod +x /usr/local/bin/set-permissions.sh
# Запуск скрипта при старте контейнера
ENTRYPOINT ["set-permissions.sh"]
CMD ["apache2-foreground"]
# set-permissions.sh
#!/bin/bash
chmod o+w /app/web/uploads
chmod o+w /app/web/uploads/result
exec "$@"
function watcher() {
gulp.watch('./src/style.css', { delay: 500 }, styles);
}
// в данном случае будет задержка в полсекунды после сохранения файла.
LANG=ru_RU.UTF-8
LANGUAGE=
LC_CTYPE="ru_RU.UTF-8"
LC_NUMERIC="ru_RU.UTF-8"
LC_TIME="ru_RU.UTF-8"
LC_COLLATE="ru_RU.UTF-8"
LC_MONETARY="ru_RU.UTF-8"
LC_MESSAGES="ru_RU.UTF-8"
LC_PAPER="ru_RU.UTF-8"
LC_NAME="ru_RU.UTF-8"
LC_ADDRESS="ru_RU.UTF-8"
LC_TELEPHONE="ru_RU.UTF-8"
LC_MEASUREMENT="ru_RU.UTF-8"
LC_IDENTIFICATION="ru_RU.UTF-8"
LC_ALL=
но когда доходит до задач, у меня появляются проблемы
где свойства firstName, lastName можно читать и менять.
get firstName() {
return this._firstName;
}