неизменяемый идентификатор пользователя
from sqlite import db_start, create_profile, edit_profile
from main import balance
print(path)
. Сразу станет видно, что ничего не удваивается.'a\\b'
- это то же самое, что и r'a\b'
.for i in range(word_count, 0, -1):
И можно ли его написать более компактно? Если да, то как?
part = word[a:b:c]
будет (условно) эквивалентноpart = ''
i = a
while i < b:
part = part + word[i]
i = i + c
c
. А для отрицательного будет while i > b:
.a
опущено, по умолчанию это начало последовательности (для c > 0) или конец (для c < 0).b
опущено, по умолчанию это конец последовательности (для c > 0) или начало (для c < 0).c
опущено, по умолчанию это 1.word_reversed = word[::-1]
# это эквивалентно
word_reversed = word[len(word)-1:-1:-1]
# imported_file.py
import telebot
from telebot import types
def setup(bot): # setup() принимает бота и прочее как параметры.
# да, прописываем обработчики прямо внутри setup()
# но вот глобальные переменные здесь прописывать не стоит
@bot.message_handler(content_types=['text'])
def get_text_messages(message):
...
# main_file.py
import telebot
from telebot import types
import time
import imported_file
bot = telebot.TeleBot("ТОКЕН")
# убедись, что setup() вызывается строго один раз для каждого дополнительного файла!
imported_file.setup(bot)
... # дальше работаем как обычно
просто в папке не создается таблица бд и на этом все.
создает товар и сохраняет в бд без ошибок.
sqlite3.connect('somefile.db')
?somefile.db
будет рассчитываться относительно текущего рабочего каталога, который может меняться в зависимости от способа запуска скрипта, да и просто в ходе его работы. А может не меняться. Т.е. нет гарантий, что текущий рабочий каталог будет совпадать с каталогом, где лежит скрипт.from pathlib import Path
import sys
SCRIPT_DIR = Path(sys.argv[0]).parent.resolve() # каталог, где лежит выполняемый скрипт
DB_PATH = SCRIPT_DIR / 'somefile.db' # путь к файлу БД в этом каталоге
conn = sqlite3.connect(DB_PATH)
CREATE TABLE IF NOT EXISTS
не сработает, если таблица уже существует - но и только. Если она имеет неправильную структуру, данный вызов её не пересоздаст, а оставит как есть. Проверь структуру таблицы, либо через обращение к таблице схемы (хранит структуру всех таблиц к БД), либо подцепившись клиентом к твоей БД. class Enemy:
...
def mobReturn(self):
self.x_mob = self.rect.x
class Bullet(pygame.sprite.Sprite):
def update(self):
if x_mob>=100:
# include <fstream>
# include <string>
using namespace std;
const char* readfile(char* filename) {
ifstream file;
string lines, line;
file.open(filename);
if (file.is_open()) {
while (file >> line) {
lines += line;
}
file.close();
return lines.c_str();
} else {
char* trashVar = "Bad open";
return trashVar;
}
}
int main()
{
cout << readfile("filename.txt");
return 0;
}
import threading
import tkinter
from tkinter import ttk
import time
# Этот класс описывает длительную операцию, выполняемую в потоке.
class LongRunningOperation(threading.Thread):
# если твоя операция требует аргументы, они передаются через конструктор
def __init__(self, my_argument):
super().__init__(daemon=True) # если главный поток завершился, мы тоже должны
self._my_argument = my_argument # и сохраняются в self
self._stop_flag = threading.Event() # а это - признак "Пора останавливаться"
self._progress = 0 # эта переменная отслеживает прогресс
# этот объект гарантирует, что наш и внешний потоки не будут трогать self._progress одновременно
self._progress_lock = threading.Lock()
# От threading.Thread() мы унаследуем два важных метода
# start() вызывается снаружи потока и запускает наш поток
# wait() вызывается снаружи потока и ждёт, пока наш поток не остановится
# Этот метод вызывается снаружи потока и сигнализирует об остановке
# Но остановиться поток должен будет сам
def stop(self):
self._stop_flag.set() # threading.Event безопасен для использования несколькими потоками.
# Этот метод вызывается снаружи потока и позволяет узнать прогресс длительной операции
def get_progress(self):
with self._progress_lock: # любые обращения к self._progress заворачиваются в такой блок
# вообще, для чисел Lock не требуется. Но если ты хочешь сообщать что-то большее, это надо делать.
return self._progress
# Тело этого метода будет выполняться в отдельном потоке.
# Именно этот метод реализует длительную операцию.
def run(self):
# я не знаю, что творится у тебя в коде.
# Тебе придётся адаптировать свой код под этот шаблон.
self._progress = 0
self._stop_flag.clear()
print('Operation started')
while not self._stop_flag.is_set(): # пока нам не сказали остановиться
# Тут ты выполняешь порцию своей длительной работы. Например, одну итерацию цикла.
print('Operation with my_argument =', self._my_argument)
time.sleep(0.1) # это просто для примера - ждём 0.1 секунды.
# Выше ты выполняешь порцию своей длительной работы. Например, одну итерацию цикла.
with self._progress_lock:
self._progress += 1 # наращиваем прогресс
if self._progress == 100:
# в данном случае прерываем цикл, если прогресс дошел до 100 - дело сделано
# если у тебя цикл "пока снаружи не остановят", то условие и break можно убрать
break
print('Operation stopped')
class MainWindow(tkinter.Tk): # окно приложения
def __init__(self):
super().__init__()
self._operation = None # а вот тут будет храниться экземпляр класса LongRunningOperation
self.title('Pet Clicker III')
self.geometry('600x600')
self._progress = tkinter.IntVar() # переменная для прогресса в окне
# прогрессбар подхватит эту переменную, так как мы её указали в параметрах
self._progressbar = ttk.Progressbar(self, maximum=100, variable=self._progress, mode='determinate')
self._progressbar.pack(side='top', expand=True, fill='x')
self._button = tkinter.Button(self, text='Start', command=self._start_stop) # кнопка пуск/стоп
self._button.pack(side='top', expand=True, fill='x')
self.after(500, self._check_progress) # через 500 мс надо вызвать _check_progress()
def _check_progress(self): # показывает прогерсс операции в окне, если есть что показывать
if self._operation is not None: # операция сейчас выполняется?
progress = self._operation.get_progress()
self._progress.set(progress) # задаём новое значение прогресса
if not self._operation.is_alive(): # поток уже остановился?
self._progress.set(0) # сбрасываем прогресс
self._button.config(text='Start') # переименовываем кнопку
self._operation = None # забываем про объект операции
self.after(500, self._check_progress) # ещё через 500 мс вызовем функцию снова
def _start_stop(self): # запускает или останавливает операцию
if self._operation is None: # операции нет - запускаем её
self._operation = LongRunningOperation(42) # передаём аргументы в операцию. В нашем случае my_argument = 42.
self._progress.set(0) # сбрасываем прогресс
self._button.config(text='Stop') # переименовываем кнопку
self._operation.start() # запускаем второй поток, который будет выполнять операцию
else: # операция уже запущена - останавливаем её
self._operation.stop() # даём сигнал "остановись"
self._operation.join() # ждём, пока она действительно не остановится
self._progress.set(0) # сбрасываем прогресс
self._button.config(text='Start') # переименовываем кнопку
self._operation = None # забываем про объект операции
wnd = MainWindow()
wnd.mainloop()