Форум сайта python.su
0
Всем привет. Не могу понять как сделать следующее:
Даны файлы. Картинки. допустим 3 шт. Лежал они в директории файла программы.
Нужно через Class вызывая переменную img_file выборочно доставать из класса ту или иную картинку.
Образно думаю должно быть так:
Class Image: img_file = # (здесь у нас функция загрузки и перечисления файлов из директории) print('выбрана картинка: ' + img_file (2)) >>> Выбрана картинка: *картинка 2*
Офлайн
568
Rad.89ну вот и учи! Купи учебник и учи, выполняй задания, изучай темы одну за другой, если что-то совсем непонятно будет из прочитанного - приходи спрашивай.
только начал учить)
Отредактировано FishHook (Июнь 7, 2022 09:57:48)
Офлайн
0
Не злитесь, пожалуйста. Я понимаю, что знающий человек может граничить с раздражением, когда его просят помочь советом. И понимаю, что в силу неопытности могу задавать вопросы не так, “как все привыкли”. Но тем не менее: вопрос считаю не банальным. К слову: код игры про курочку, подыхающую без еды и отдыха, если вовремя не покормить, написан и работает исправно. Хочу понять, как можно сократить выгрузку файлов, что бы не прописывать одно и тоже каждый раз. Благодарю за терпение.
И спрошу по другому тогда:
Вопрос в том, что бы сократить количество строк выгрузки файлов.
Вот есть загрузка файлов. как можно выгружать все файлы в одном действии? что бы потом просто ввел переменную с номером и из списка достал нужный мне фаил?:
# ~ загрузка файлов изображений img_folder = os.path.join(game_folder, 'sprites') playerimg1 = resource_path('sprites/chikin.png') playerimg2 = resource_path('sprites/chikin_3.png') playerimg3 = resource_path('sprites/chikin_2.png') playerimg_dead = resource_path('sprites/chikin_dead.png') btn_food_img = resource_path('sprites/btn_food.png') btn_energy_img = resource_path('sprites/btn_energy.png') # ~ вариант загрузки файла без хитрости resource_path health_img = pygame.image.load(os.path.join(img_folder, 'hart1.png')) energy_img = pygame.image.load(os.path.join(img_folder, 'energy1.png')) food_img = pygame.image.load(os.path.join(img_folder, 'food.png')) bg_res = resource_path('sprites/background.png') player_img1 = pygame.image.load(playerimg1) player_img2 = pygame.image.load(playerimg2) player_img3 = pygame.image.load(playerimg3) player_img_dead = pygame.image.load(playerimg_dead) btn_food=pygame.image.load(btn_food_img) btn_energy=pygame.image.load(btn_energy_img) bg = pygame.image.load(bg_res)
class Player (pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = player_img1 #в этом месте приходится прописывать конкретное имя переменной с файлом. self.image = pygame.transform.scale(self.image,(scale)) self.rect = self.image.get_rect() self.rect.center=((int(pl_pos)), (pl_x)) class Health (pygame.sprite.Sprite): def __init__(self): pygame.sprite.Sprite.__init__(self) self.image = health_img self.image = pygame.transform.scale(health_img,(20,20)) self.rect = self.image.get_rect() self.rect.center=(10, 85)
Офлайн
568
Rad.89вы знаете что такое “функция” и зачем они нужны?
Вот есть загрузка файлов. как можно выгружать все файлы в одном действии?
Офлайн
568
Rad.89я на вас злюсь не за то, что вы вопросы задаете, форум для того и существует. А за то, что вы не освоив азов лезете в сложные темы. Это ярко демонстрирует хаотический характер вашего самообразования. Казалось бы, в век интернета нет проблем с получением любой мыслимой литературы. Ну скачайте вы себе учебники и учитесь последовательно. Может я не прав? Ок, какую литературу вы уже освоили, что прочитали?
Не злитесь, пожалуйста. Я понимаю, что знающий человек может граничить с раздражением, когда его просят помочь советом. И понимаю, что в силу неопытности могу задавать вопросы не так, “как все привыкли”.
Офлайн
0
FishHookЯ пробовал через def. Но это опять же, если в нее прописывать все строки по каждой картинки отдельно. Или есть некая структура типа как если бы image=блаблабла загрузить из папки (список файлов). А уже через def доставать image(номер файла). Правильно мыслю?
Офлайн
0
FishHookсейчас читаю Доусона. По ходу чтения вопросы возникают и я решаю их по ходу. Тестирую новый материал. По пути написал свою первую игру на pygame. И вот один момент наступил, по которому я не могу найти нигде подсказку, как решить… Как упаковать код загрузки файлов в одну переменную и потом вытаскивать нужный файл? Нет. В целом понятно как. делал. Работал с файлами в простых структурах. Но здесь я не могу оптимизировать((
Офлайн
5
Корявенькая реализация того, что, думаю, вы подразумеваете. Я сам к ООП только подкрадываюсь, но по поводу того, что к классам вы рано лезете - это точно. По началу нужно хорошо овладеть уже имеющимися типами данных, циклами, функциями, а уже потом преступать к созданию собственных типов.
import os class Image: def __init__(self): self.img_list = [] def __repr__(self): # переопределил встроенный метод для отображения списка файлов for i in self.img_list: print(i) def find_image(self, path=os.getcwd()): # Ищет жпэг в той же дир. что и программа, for adress, folder, file in os.walk(path): # если не указан другой путь. for i in file: if '.jpg' in i: self.img_list.append(os.path.join(adress, i)) def show(self, particular=False): # Открывает файл в средстве просм. изображений по умолч. if not particular: # Если передан particular, откроет только его. for i in self.img_list: os.startfile(i) else: for i in self.img_list: if particular in i: os.startfile(i) x = Image() x.find_image() x.__repr__() x.show()
Отредактировано Palrom (Июнь 7, 2022 10:58:06)
Офлайн
61
Можно и так попробовать
import os class Imgs: def __init__(self) -> None: # Add working vars self.imgdir = "imgs" self.imgext = (".img", ".png") self.images = {} # Check if dir is exists and append vars if os.path.isdir(self.imgdir): self.ipath = os.path.join(os.getcwd(), self.imgdir) for file in os.listdir(self.ipath): if file.endswith(self.imgext): self.images[os.path.splitext(file)[0]] = file else: self.ipath = "The dir is missing. Check your path" def img_file(self, fname, full_path=False): """Return full/short file name""" result = self.images.get(str(fname)) # Check if file name is correct and full_path option if result: if full_path: fpath = os.path.join(self.ipath, result) else: fpath = result else: fpath = None print("The file name is wrong or file is not exist") return fpath def __repr__(self) -> str: return self.ipath cimg = Imgs() print(cimg) print(cimg.img_file(1)) print("======") print(cimg.img_file(2)) print("======") print(cimg.img_file("screen")) print("======") print(cimg.img_file("screen", full_path=True))
Отредактировано ZerG (Июнь 7, 2022 11:19:49)
Офлайн
124
Rad.89
КОД С ФАЙЛОМ 2. —— а здесь в коде просто вызывать ПЕРЕМЕННУЮ с обозначением номера файла
img_names = ['chicken.png', 'chicken_2.png', 'chicken_3.png', 'food.png'] #os.listdir(path) #создать словарь pygame_imgs = {name[:-4]: pygame.image.load(os.path.join(img_folder, name)) for name in img_names} # создавать переменные как далее не нужно player_img1 = pygame.image.load(playerimg1) # вместо этого использовать pygame_imgs['название_картинки'] pygame_imgs['chicken']
Офлайн