class SettingsScreen(Widget): def __init__(self,size,*args): super(SettingsScreen,self).__init__(size=size,*args) button_height = self.height*.10 button_size = [button_height*6,button_height] self.option_1 = Label(text=('debug:on' if Global.debugMode else 'debug:off'), size=button_size, font_size=button_size[1], pos=[0,self.height*.60]) self.option_2 = Label(text='back', size=button_size, font_size=button_size[1], pos=[0,self.height*.30]) self.option_1.center_x = self.center_x self.option_2.center_x = self.center_x self.add_widget(self.option_1) self.add_widget(self.option_2) def on_touch_down(self,touch,*args): super(SettingsScreen,self).on_touch_down(touch,*args) if self.option_1.collide_point(*touch.pos): if not Global.debugMode: self.option_1.text = 'debug:on' Global.debugMode = True else: self.option_1.text = 'debug:off' Global.debugMode = False elif self.option_2.collide_point(*touch.pos): self.parent.add_widget(MainMenu(size=self.size)) self.parent.remove_widget(self)
class MainMenu(Widget): def __init__(self,size,*args): super(MainMenu,self).__init__(size=size,*args) button_height = self.height*.10 button_size = [button_height*5,button_height] self.option_1 = Label(text='play game', size=button_size, font_size=button_size[1], pos=[0,self.height*.60]) self.option_2 = Label(text='settings', size=button_size, font_size=button_size[1], pos=[0,self.height*.30]) self.option_1.center_x = self.center_x self.option_2.center_x = self.center_x self.add_widget(self.option_1) self.add_widget(self.option_2) def on_touch_down(self,touch,*args): super(MainMenu,self).on_touch_down(touch,*args) if self.option_1.collide_point(*touch.pos): self.parent.add_widget(GameArea(size=self.size)) self.parent.remove_widget(self) elif self.option_2.collide_point(*touch.pos): self.parent.add_widget(SettingsScreen(size=self.size)) self.parent.remove_widget(self)
class CommandMenu(BoxLayout): def __init__(self, node_): BoxLayout.__init__(self, orientation='vertical', size_hint=(0.25,1), pos_hint={'x': 0.75 if node_.pos_hint['x'] <= 0.5 else 0, 'y': 0}) self.node = node_ self.canvas.add(Color(0.745098, 0.745098, 0.745098)) self.bg_rect = Rectangle(pos=self.pos, size=self.size) self.canvas.add(self.bg_rect) self.canvas.add(Color(0,0,0)) def temp_labeller_redraw(a, b): self.bg_rect.pos = self.pos self.bg_rect.size = self.size self.bind(pos=temp_labeller_redraw, size=temp_labeller_redraw) self.add_below = Label(size_hint=(1, None), height=0.36*self.height, text = "Node\nX: %(x).3f\nY: %(y).3f" % self.node.pos_hint, font_size=20) def add_below_callback(thing, instance): if self.add_below.collide_point(*instance.pos): self.parent.dont_check = True return super(Label, self.add_below).on_touch_down(instance) self.add_below.bind(on_touch_down=add_below_callback) self.add_widget(self.add_below) self.scroller = ScrollView(size_hint=(1,1), do_scroll_y=True, do_scroll_x=False) self.add_widget(self.scroller) self.grid = GridLayout(cols=1, spacing=10, size_hint_y=None) self.scroller.add_widget(self.grid) self.grid.bind(minimum_height=self.grid.setter('height')) self.bind(pos=self.redraw, size=self.redraw) if len(self.node.command_list) == 0: self.grid.add_widget(SetCommandButton()) else: for i in self.node.command_list: self.grid.add_widget(SetCommandButton(val=i)) def redraw(self, _1, _2): self.add_below.height=0.36*self.height for i in self.grid.children: i.height = 0.2*self.height def store_list(self): self.node.command_list = [] for i in reversed(self.grid.children): if i.command != "" and i.command != "(Set Command)": self.node.command_list.append(i.command)
class ModelEntry(SparseGridLayout): def __init__(self, model_id, is_active, model_manager: ModelManager, open_callback, save_callback, delete_callback, rename_callback): super().__init__(rows=1, cols=6, size_hint_y=None, height=40) self.model_id = model_id self.model_manager = model_manager self.open_callback = open_callback self.save_callback = save_callback self.delete_callback = delete_callback self.rename_callback = rename_callback background_color = (0.3, 0.3, 0.3, 1) if is_active: background_color = (0.3, 0.3, 0.6, 1) self.background = Label(padding_x=10) self.add_entry(self.background, position=(0, 0), shape=(1, 6), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=background_color) self.model_label = Label(text=model_id, halign="left", valign="middle", padding_x=10) self.model_label.bind(size=self.model_label.setter('text_size')) self.model_label.on_touch_down = self.on_label_press self.add_entry(self.model_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05)) if model_id in self.model_manager.unsaved_models: self.save_button = Button(text="Save") self.save_button.on_press = self.save_model self.add_entry(self.save_button, position=(0, 3), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10) self.open_button = Button(text="Open") self.open_button.on_press = self.open_model self.add_entry(self.open_button, position=(0, 4), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10) self.delete_button = Button(text="Delete") self.delete_button.on_press = self.delete_model self.add_entry(self.delete_button, position=(0, 5), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10) def open_model(self): self.update_color(self.background, (0.3, 0.3, 0.6, 1)) self.open_callback(self.model_id) def on_label_press(self, touch): if self.model_label.collide_point(*touch.pos): self.remove_entry(self.model_label) self.model_label = TextInput(text=self.model_id, multiline=False) self.model_label.bind(focus=self.rename_model) self.model_label.on_touch_down(touch) self.add_entry(self.model_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05)) def rename_model(self, instance, value): if not value: new_id = self.model_label.text self.remove_entry(self.model_label) if new_id != self.model_id: self.model_manager.rename_model(self.model_id, new_id) self.rename_callback(self.model_id, new_id) self.model_id = new_id self.model_label = Label(text=self.model_id, halign="left", valign="middle", padding_x=10) self.model_label.bind(size=self.model_label.setter('text_size')) self.model_label.on_touch_down = self.on_label_press self.add_entry(self.model_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05)) def save_model(self): self.model_manager.save_model(self.model_id) self.remove_widget(self.save_button) self.save_callback(self.model_id) def delete_model(self): self.model_manager.delete_model(self.model_id) self.parent.remove_widget(self) self.delete_callback(self.model_id) EventListener.trigger_event("refresh_training_models")
class ConvApp(App): try: #подключение к API RATES = { 'EUR': requests.get( 'https://api.exchangeratesapi.io/latest').json()["rates"], 'JPY': requests.get('https://api.exchangeratesapi.io/latest?base=JPY' ).json()["rates"], 'RUB': requests.get('https://api.exchangeratesapi.io/latest?base=RUB' ).json()["rates"], 'USD': requests.get('https://api.exchangeratesapi.io/latest?base=USD' ).json()["rates"], 'GBP': requests.get('https://api.exchangeratesapi.io/latest?base=GBP'). json()["rates"] } except: #при отсутствии доступа переход к фиксированным значениям text = 'Конвертация валют (Нет доступа к API)' RATES = { 'EUR': { 'RUB': 77.0563, 'JPY': 123.41, 'USD': 1.1285, 'GBP': 0.89173 }, 'JPY': { 'GBP': 0.0072257516, 'RUB': 0.6243926748, 'EUR': 0.0081030711, 'USD': 0.0091443157 }, 'RUB': { 'GBP': 0.0115724477, 'JPY': 1.6015562647, 'EUR': 0.0129775242, 'USD': 0.0146451361 }, 'USD': { 'GBP': 0.7901905184, 'RUB': 68.2820558263, 'JPY': 109.3575542756, 'EUR': 0.8861320337 }, 'GBP': { 'RUB': 86.4121426889, 'JPY': 138.3939084701, 'EUR': 1.1214156751, 'USD': 1.2655175894 } } else: text = 'Конвертация валют (Доступ к API)' def build(self): #обновление конфигураций при запуске приложения self.config.set('val', 'first', 'RUB') self.config.update_config('conv.ini') self.config.set('val', 'second', 'USD') self.config.update_config('conv.ini') self.sound = SoundLoader.load('sound.wav') #звук нажатия кнопок flt = FloatLayout(size_hint=(1, 1)) #основной виджет экрана #виджеты располагаются в порядке сверху вниз self.top_btn = Button(disabled=True, size_hint=(1, .07), background_color=(.42, .68, .87, 1), background_disabled_normal='', pos_hint={'top': 1}, text=self.text, font_size='14sp', font_name='arial.ttf') flt.add_widget(self.top_btn) #значения переводимой валюты и итог bxl_btn = Button(size_hint=(1, .15), pos_hint={'top': .90}, disabled=True, background_color=(.42, .68, .87, 1), background_disabled_normal='') bxl = GridLayout(size_hint=(1, .15), pos_hint={'top': .90}, cols=2, rows=2) x = Window.size[0] * 0.77 y = Window.size[1] * 0.066 self.lbl_1 = Label(text='0', color=(.8, .8, .8, 1), font_size='32sp', font_name='MilanoFont.ttf', size_hint=(.9, .5), halign='left', text_size=(x, y)) self.zn_1 = Label(text='₽', font_size='32sp', size_hint=(.1, .5)) self.lbl_2 = Label(text='0', color=(.8, .8, .8, 1), font_size='32sp', font_name='MilanoFont.ttf', size_hint=(.9, .5), halign='left', disabled=True, text_size=(x, y)) self.zn_2 = Label(text='$', font_size='32sp', size_hint=(.1, .5)) bxl.add_widget(self.lbl_1) bxl.add_widget(self.zn_1) bxl.add_widget(self.lbl_2) bxl.add_widget(self.zn_2) flt.add_widget(bxl_btn) flt.add_widget(bxl) #левая выезжающая кнопка выбора валюты self.l_btn = AnButt(size_hint=(1.01, .15), pos_hint={ 'top': .75, 'center_x': -.25 }, on_press=self.anim_l) self.bx_l = BoxLayout( size_hint=(1, .15), pos_hint={ 'top': .75, 'center_x': -.25 }) #виджет, содержащий в себе отдельные кнопки валют self.lb_1 = Label(size_hint=(.2, 1), text='€', color=(.9, .9, .9, 1), font_size='28sp') self.lb_2 = Label(size_hint=(.2, 1), text='$', color=(.9, .9, .9, 1), font_size='28sp') self.lb_3 = Label(size_hint=(.2, 1), text='¥', color=(.9, .9, .9, 1), font_size='28sp') self.lb_4 = Label(size_hint=(.2, 1), text='£', color=(.9, .9, .9, 1), font_size='28sp') self.lb_5 = Label(size_hint=(.2, 1), text='₽', font_size='28sp') n = [self.lb_1, self.lb_2, self.lb_3, self.lb_4, self.lb_5] for i in n: self.bx_l.add_widget(i) flt.add_widget(self.l_btn) flt.add_widget(self.bx_l) #правая выезжающая кнопка выбора валюты self.r_btn = NaButt(size_hint=(1.01, .15), pos_hint={ 'top': .75, 'center_x': 1.25 }, on_press=self.anim_r) self.bx_r = BoxLayout(size_hint=(1, .15), pos_hint={ 'top': .75, 'center_x': 1.25 }) self.rb_1 = Label(size_hint=(.2, 1), text='$', font_size='28sp') self.rb_2 = Label(size_hint=(.2, 1), text='₽', color=(.9, .9, .9, 1), font_size='28sp') self.rb_3 = Label(size_hint=(.2, 1), text='¥', color=(.9, .9, .9, 1), font_size='28sp') self.rb_4 = Label(size_hint=(.2, 1), text='£', color=(.9, .9, .9, 1), font_size='28sp') self.rb_5 = Label(size_hint=(.2, 1), text='€', color=(.9, .9, .9, 1), font_size='28sp') n = [self.rb_1, self.rb_2, self.rb_3, self.rb_4, self.rb_5] for i in n: self.bx_r.add_widget(i) flt.add_widget(self.r_btn) flt.add_widget(self.bx_r) #кнопка 'OK' self.ok = Number(num='ok', size_hint=(.2, .2), pos_hint={ 'center_x': 0.5, 'top': .67 }, on_press=self.ok_press) flt.add_widget(self.ok) #сетка калькулятора self.grl = GridLayout(size_hint=(1, .45), pos_hint={'top': .47}, cols=3, rows=4, spacing=10, padding=-5) self.grl.add_widget( Number(num=7, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=8, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=9, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=4, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=5, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=6, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=1, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=2, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=3, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num='p', size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num=0, size_hint=(.3, .4), on_press=self.numbers)) self.grl.add_widget( Number(num='b', size_hint=(.3, .4), on_press=self.numbers)) flt.add_widget(self.grl) return flt #создание файла конфигураций для определения конвертируемых валют def build_config(self, config): config.setdefaults('val', {'first': 'RUB', 'second': 'USD'}) Window.bind(on_touch_down=self.touch_down) dct = {'₽': 'RUB', '€': 'EUR', '$': 'USD', '¥': 'JPY', '£': 'GBP'} #словарь нужен, так как для конфигураций нельзя использовать символы обозначения валют def touch_down(self, obj, t): #работа левой кнопки выбора валют if self.bx_l.collide_point(*t.pos): if self.lb_1.collide_point(*t.pos): self.lb_1.text, self.lb_5.text = self.lb_5.text, self.lb_1.text elif self.lb_2.collide_point(*t.pos): self.lb_2.text, self.lb_5.text = self.lb_5.text, self.lb_2.text elif self.lb_3.collide_point(*t.pos): self.lb_3.text, self.lb_5.text = self.lb_5.text, self.lb_3.text elif self.lb_4.collide_point(*t.pos): self.lb_4.text, self.lb_5.text = self.lb_5.text, self.lb_4.text #изменение конфигураций после выбора валюты self.zn_1.text = self.lb_5.text self.config.set('val', 'first', self.dct[self.lb_5.text]) self.config.update_config('conv.ini') #работа правой кнопки выбора валют if self.bx_r.collide_point(*t.pos): if self.rb_2.collide_point(*t.pos): self.rb_1.text, self.rb_2.text = self.rb_2.text, self.rb_1.text elif self.rb_3.collide_point(*t.pos): self.rb_1.text, self.rb_3.text = self.rb_3.text, self.rb_1.text elif self.rb_4.collide_point(*t.pos): self.rb_1.text, self.rb_4.text = self.rb_4.text, self.rb_1.text elif self.rb_5.collide_point(*t.pos): self.rb_1.text, self.rb_5.text = self.rb_5.text, self.rb_1.text #изменение конфигураций после выбора валюты self.zn_2.text = self.rb_1.text self.config.set('val', 'second', self.dct[self.rb_1.text]) self.config.update_config('conv.ini') #нажатие кнопки 'OK' и подсчёт значения m = 0 #счётчик для изменения статуса работы в верхней части экрана def ok_press(self, btn): self.sound.play() #значения для конвертации берутся из конфигураций vl_1 = self.config.get('val', 'first') vl_2 = self.config.get('val', 'second') try: sm = float( self.lbl_1.text) #отлов исключений при некорректном вводе except: self.top_btn.text = 'Введите корректное число' self.m = 1 else: if self.m: self.top_btn.text = self.text self.m = 0 if vl_1 == vl_2: self.lbl_2.text = self.lbl_1.text else: if sm: self.lbl_2.text = '%.2f' % (self.RATES[vl_1][vl_2] * sm) self.lbl_2.color = (1, 1, 1, 1) else: self.lbl_2.text = '0' self.lbl_2.color = (.8, .8, .8, 1) #анимация левой кнопки валют k = 1 def anim_l(self, btn): self.sound.play() if self.k % 2 == 1: #сдвиг правой кнопки для освобождения места an = Animation(pos_hint={'center_x': 1.76}, duration=.2) an.start(self.r_btn) an.start(self.bx_r) an = Animation(pos_hint={'center_x': .49}, duration=.2) #сдвиг левой кнопки an.start(btn) an.start(self.bx_l) self.k += 1 else: an = Animation(pos_hint={'center_x': 1.25}, duration=.2) an.start(self.r_btn) an.start(self.bx_r) an = Animation(pos_hint={'center_x': -.25}, duration=.2) an.start(btn) an.start(self.bx_l) self.k += 1 #анимация правой кнопки валют n = 1 def anim_r(self, btn): self.sound.play() if self.n % 2 == 1: an = Animation(pos_hint={'center_x': -.51}, duration=.2) an.start(self.l_btn) an.start(self.bx_l) an = Animation(pos_hint={'center_x': .51}, duration=.2) an.start(btn) an.start(self.bx_r) self.n += 1 else: an = Animation(pos_hint={'center_x': -.25}, duration=.2) an.start(self.l_btn) an.start(self.bx_l) an = Animation(pos_hint={'center_x': 1.25}, duration=.2) an.start(btn) an.start(self.bx_r) self.n += 1 #калькулятор def numbers(self, btn): self.sound.play() if btn.num == 'p': if self.lbl_1.text == '0': self.lbl_1.color = (1, 1, 1, 1) self.lbl_1.text += '.' elif btn.num == 'b': self.lbl_1.text = self.lbl_1.text[:-1] if self.lbl_1.text == '': self.lbl_1.text = '0' self.lbl_1.color = (.8, .8, .8, 1) else: if self.lbl_1.text == '0': self.lbl_1.color = (1, 1, 1, 1) self.lbl_1.text = '' self.lbl_1.text += str(btn.num) else: self.lbl_1.text += str(btn.num)
class Item(GridLayout): def __init__(self, name, description, image_link, inventory: UserInventory, username, **kwargs): super(Item, self).__init__(**kwargs) try: os.makedirs('imgcache') except FileExistsError: Logger.warning("Image Cache Exists.") self.size_hint_y = None self.height = 50 self.cols = 3 self.inventory = inventory self.name = Label(text=name) self.name.bind(on_touch_down=self.on_item_pressed) self.add_widget(self.name) self.description = Label(text=description) self.image_link = image_link try: r = requests.get(image_link, timeout=(5, 20)) except requests.exceptions.MissingSchema: return r.raise_for_status() if r.ok: picname = os.path.basename(urllib.parse.urlparse(image_link).path) if picname is None: picname = "temp.jpg" f = open("imgcache/" + picname, mode="wb") f.write(r.content) f.close() self.image = AsyncImage(source="imgcache/" + picname, pos_hint={'left': 1}) self.image.bind(on_touch_down=self.open_image) self.owner_username = username delete_btn = Button(text="X", size_hint=[None, 1], width=60) delete_btn.bind(on_press=lambda x: self.delete_item()) self.add_widget(delete_btn) self.popup = None self.description.text_size = [ self.description.size[0] * 3, self.description.size[1] ] def clear_cache(self, instance): try: shutil.rmtree('imgcache/') os.makedirs( 'imgcache' ) #this is the exact same code used for the music cache except FileNotFoundError: #i disgust myself too. os.makedirs('imgcache') except PermissionError: Logger.warning( "Cannot clear inventory cache due to permission error.") except Exception as e: Logger.warning(traceback.format_exc()) def on_item_pressed(self, inst, touch): if self.name.collide_point(*touch.pos): self.open_popup() def get_name(self): return self.name.text def get_description(self): return self.description.text def get_image_link(self): return self.image def get_popup(self): return self.popup def set_name(self, name): self.name = name def set_description(self, description): self.description = description def set_image_link(self, image_link): self.image = image_link def open_image(self, inst, touch): if self.image.collide_point(*touch.pos): webbrowser.open(self.image_link) def delete_item(self): if self.inventory is not None: self.inventory.delete_item(self.name.text) def build_item_window(self): if self.popup is None: main_grid = GridLayout(cols=2) main_grid.add_widget(self.image) main_grid.add_widget(self.description) self.popup = Popup(title=self.name.text + " created by " + self.owner_username, content=main_grid, size_hint=(.5, .3), pos_hint={ 'left': .1, 'top': 1 }, background_color=[0, 0, 0, 0]) return self.popup def open_popup(self): try: popup = self.build_item_window() popup.bind(on_dismiss=self.clear_cache) popup.open() except AttributeError: Logger.warning(traceback.format_exc()) return # Encoded by: name#description#image_link#owner_name def encode(self): return self.name.text + '#' + self.description.text + '#' + self.image_link + '#' + self.owner_username
class AudioEntry(SparseGridLayout): def __init__(self, audio_id, audio_manager: AudioManager): super().__init__(rows=1, cols=6, size_hint_y=None, height=40) self.audio_id = audio_id self.audio_manager = audio_manager self.background = Label(padding_x=10) self.add_entry(self.background, position=(0, 0), shape=(1, 6), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=(0.3, 0.3, 0.3, 1)) self.audio_label = Label(text=audio_id, halign="left", valign="middle", padding_x=10) self.audio_label.bind(size=self.audio_label.setter('text_size')) self.audio_label.on_touch_down = self.on_label_press self.add_entry(self.audio_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05),) if audio_id in self.audio_manager.unsaved_audio: self.save_button = Button(text="Save") self.save_button.on_press = self.save_clip self.add_entry(self.save_button, position=(0, 3), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10) self.play_button = Button(text="Play") self.play_button.on_press = self.play_audio self.add_entry(self.play_button, position=(0, 4), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10) self.delete_button = Button(text="Delete") self.delete_button.on_press = self.delete_clip self.add_entry(self.delete_button, position=(0, 5), shape=(1, 1), padding_x=(0.01, 0.01), padding_y=(0.1, 0.1), index=10) def on_label_press(self, touch): if self.audio_label.collide_point(*touch.pos): self.remove_entry(self.audio_label) self.audio_label = TextInput(text=self.audio_id, multiline=False) self.audio_label.bind(focus=self.update_audio_label) self.audio_label.on_touch_down(touch) self.add_entry(self.audio_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=(0.3, 0.3, 0.3, 1)) def update_audio_label(self, instance, value): if not value: new_id = self.audio_label.text self.remove_entry(self.audio_label) if new_id != self.audio_id: self.audio_manager.rename_audio(self.audio_id, new_id) self.audio_id = new_id self.audio_label = Label(text=self.audio_id, halign="left", valign="middle", padding_x=10) self.audio_label.bind(size=self.audio_label.setter('text_size')) self.audio_label.on_touch_down = self.on_label_press self.add_entry(self.audio_label, position=(0, 0), shape=(1, 3), padding_x=(0.01, 0.01), padding_y=(0.05, 0.05), color=(0.3, 0.3, 0.3, 1)) def update_stop_to_play(self): self.play_button.text = "Play" self.play_button.on_press = self.play_audio def play_audio(self): self.audio_manager.play_audio(self.audio_id, on_complete=self.update_stop_to_play) self.play_button.text = "Stop" self.play_button.on_press = self.stop_audio def stop_audio(self): self.audio_manager.stop_audio() self.update_stop_to_play() def save_clip(self): self.audio_manager.save_audio(self.audio_id) self.remove_widget(self.save_button) def delete_clip(self): self.audio_manager.delete_audio(self.audio_id) self.parent.remove_widget(self) EventListener.trigger_event("update_audio_entries")
class Item(GridLayout): def __init__(self, name, description, image_link, inventory: UserInventory, username, **kwargs): super(Item, self).__init__(**kwargs) try: os.makedirs('imgcache') except FileExistsError: print("Image Cache Exists.") self.size_hint_y = None self.height = 50 self.cols = 3 self.inventory = inventory self.name = Label(text=name) self.name.bind(on_touch_down=self.on_item_pressed) self.add_widget(self.name) self.description = Label(text=description) self.image_link = image_link r = requests.get(image_link, timeout=(5, 20)) r.raise_for_status() if r.ok: picname = urllib.request.urlopen( urllib.request.Request(image_link, method='HEAD', headers={'User-Agent': 'Mozilla/5.0' })).info().get_filename() if picname is None: picname = "temp.jpg" f = open("imgcache/" + picname, mode="wb") f.write(r.content) f.close() self.image = AsyncImage(source="imgcache/" + picname, pos_hint={'left': 1}) self.image.bind(on_touch_down=self.open_image) self.owner_username = username delete_btn = Button(text="X", size_hint=[None, 1], width=60) delete_btn.bind(on_press=lambda x: self.delete_item()) self.add_widget(delete_btn) self.popup = None self.description.text_size = [ self.description.size[0] * 3, self.description.size[1] ] def on_item_pressed(self, inst, touch): if self.name.collide_point(*touch.pos): self.open_popup() def get_name(self): return self.name.text def get_description(self): return self.description.text def get_image_link(self): return self.image def get_popup(self): return self.popup def set_name(self, name): self.name = name def set_description(self, description): self.description = description def set_image_link(self, image_link): self.image = image_link def open_image(self, inst, touch): if self.image.collide_point(*touch.pos): webbrowser.open(self.image.source) def delete_item(self): if self.inventory is not None: self.inventory.delete_item(self.name.text) def build_item_window(self): if self.popup is None: main_grid = GridLayout(cols=2) main_grid.add_widget(self.image) main_grid.add_widget(self.description) self.popup = Popup(title=self.name.text + " created by " + self.owner_username, content=main_grid, size_hint=(.5, .3), pos_hint={ 'left': .1, 'top': 1 }, background_color=[0, 0, 0, 0]) return self.popup def open_popup(self): popup = self.build_item_window() popup.open() # Encoded by: name#description#image_link#owner_name def encode(self): return self.name.text + '#' + self.description.text + '#' + self.image_link + '#' + self.owner_username