Интерфейс PythonPython

Программы на Python
Гость
Интерфейс Python

Сообщение Гость »


У меня возникла проблема с реализацией интерфейса коктейль-бара. Со мной происходит следующее: когда я ищу название в поисковой системе, появляется пустой экран, а должны появиться названия и фотографии коктейлей с этим названием.

Если кто-нибудь увидит, какую ошибку я допустил при реализации, буду очень признателен

Вот мой код: я реализую шаблон MVP на Python

Класс view.py:
импортировать Ги gi.require_version("Gtk", "3.0") из gi.repository импортировать Gtk, GdkPixbuf запросы на импорт Класс Просмотр: защита __init__(сам): self.handler = Нет self.search_button = Нет self.search_entry = Нет self.window = Нет self.ingred_filter_active = False # Переменная для прерывания ингредиентов self.glass_filter_active = False # Переменная для прерывания типа сосуда защита construir_ventana (сам): self.window = Gtk.Window() self.window.set_title("Коктейль-бар") self.window.set_default_size(1000, 1000) self.window.connect("delete-event", self.on_window_closed) #Чтобы узнать интерфейс и не заметить ошибки # Главный принцип Caixa для организации элементов self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL) self.window.add(self.box) # Барра де бускеда и ботон де бускеда self.search_entry = Gtk.Entry() self.search_button = Gtk.Button(label="Поиск") self.search_button.connect("нажал", self.handler.on_search_button_clicked, self.search_entry) self.filter_button = Gtk.Button(label="Фильтры") self.filter_button.connect("нажал", self.open_filter_win) self.box.pack_start(self.search_entry, False, False, 10) self.box.pack_start(self.search_button, False, False, 10) self.box.pack_start(self.filter_button, False, False, 10) self.results_label = Gtk.Label() self.box.pack_start(self.results_label, False, False, 0) # Caixa para añadir как imaxes и barra de desplazamento image_scrolled_window = Gtk.ScrolledWindow() image_scrolled_window.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.box.pack_start(image_scrolled_window, True, True, 0) self.image_scrolled_window = Gtk.ScrolledWindow() self.image_scrolled_window.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) self.box.pack_start(self.image_scrolled_window, True, True, 0) self.image_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) self.image_scrolled_window.add(self.image_box) # Caixa для кинотеатров image_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL) image_scrolled_window.add(image_box) # Аньядир imaxes image_urls = ["https://www.thecocktaildb.com/images/me ... 770327.jpg", "https://www.thecocktaildb.com/images/me ... 252802.jpg", "https://www.thecocktaildb.com/images/me ... 770558.jpg", "https://www.thecocktaildb.com/images/me ... 574065.jpg"] для image_url в image_urls: изображение = self.load_image_from_url(image_url, ширина=200, высота=200) если изображение: image_box.pack_start(image, False, False, 40) # Разделение изображений def display_cocktail_images(self, name, image_urls): # Limpia la vista актуальные до того, как появятся новые изображения для виджета в self.box.get_children(): self.box.remove (виджет) для имени image_url в zip (имена, image_urls): # Создайте этикет, чтобы узнать имя коктеля метка = Gtk.Label(метка=имя) self.box.pack_start.a(метка, 0, 0, 10) если URL-адрес изображения: # Создайте виджет Gtk.Image с расширенным изображением и его настройкой изображение = self.load_image_from_url(image_url, 40, 40) если изображение: self.box.pack_start(изображение, Ложь, Ложь, 10) self.results_label.set_text(f"Мострандо {len(names)} cócteles:") def load_image_from_url(self, image_url, ширина, высота): если не image_url: возврат Нет загрузчик = GdkPixbuf.PixbufLoader() image_data = Requests.get(image_url).content loader.write(image_data) загрузчик.закрыть() pixbuf = loader.get_pixbuf() если пиксбуф: # Просмотр изображения в конкретных размерах pixbuf = pixbuf.scale_simple(ширина, высота, GdkPixbuf.InterpType.BILINEAR) # Создайте объект Gtk.Image и настройте изображение на компьютере изображение = Gtk.Image.new_from_pixbuf(pixbuf) вернуть изображение еще: возврат Нет защита open_filter_win(self, кнопка): self.filter_win= Gtk.Window() self.filter_win.set_border_width(10) self.filter_win.set_title("Коктейль-бар") self.filter_win.set_default_size(300, 300) self.ingred_switch = Gtk.Switch() #создание прерывателя self.ingred_switch.set_active(self.ingred_filter_active) #estado dos прерывания self.ingred_switch.set_size_request(1,1) self.ingred_switch.connect("notify::active", self.handler.on_filter_ingredients_clicked) self.glass_switch = Gtk.Switch() # создаём прерыватель self.glass_switch.set_active(self.glass_filter_active) #estado dos прерывания self.glass_switch.set_size_request(1,1) self.glass_switch.connect("notify::active", self.handler.on_filter_glass_clicked) label1 = Gtk.Label() label1.set_text("Поиск ингредиента по названию") label2 = Gtk.Label() label2.set_text("Фильтр по стеклу") vbox = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, интервал=20) vbox.pack_start(label1, True, True, 0) vbox.pack_start(self.ingred_switch, True, True, 0) vbox.pack_start(label2, True, True, 0) vbox.pack_start(self.glass_switch, True, True, 0) #Boton aplicar cambios apply_button = Gtk.Button(label="Применить") apply_button.connect("нажал", self.on_apply_button_clicked) vbox.pack_start(apply_button, True, True, 0) self.filter_win.add(vbox) self.filter_win.show_all() def on_apply_button_clicked(self, button): если сам.обработчик: self.ingred_filter_active = self.ingred_switch.get_active() #estado фактические прерывания загрузки self.glass_filter_active = self.glass_switch.get_active() self.handler.apply_filters(self.ingred_filter_active, self.glass_filter_active) #Применение фильтров self.hide_filter_window() #окультаза вентана self.update_main_view() #actualizamos главный элемент экрана, который содержит апликации для камбиосов defide_filter_window(self): #Давай, "примени" окультазу к вентане если self.filter_win: self.filter_win.hide() защита update_main_view (сам): # Восстановить основной элемент pantalla для виджета в self.box.get_children(): self.box.remove (виджет) # Barra de busqueda, boton de filtros self.box.pack_start(self.search_entry, False, False, 10) self.box.pack_start(self.search_button, False, False, 10) self.box.pack_start(self.filter_button, False, False, 10) self.results_label.set_text("") Защиту set_handler(сам, обработчик): self.handler= обработчик def on_window_closed(сам, виджет, событие): Gtk.main_quit()
Класс model.py:

импортировать json из перечисления импортировать Enum запросы на импорт класс api_search_flags(Enum): SEARCH_COCKTAIL = 1 SEARCH_INGREDIENT = 2 ПОИСК_СТЕКЛО = 3 """при необходимости мы можем это перечислять столько, сколько захотим """ Модель класса: команда: ул = "" ср: api_search_flags = 1 защита __init__(сам): self.url = "https://www.thecocktaildb.com/api/json/ ... rch.php?s=" defchange_search_target(self,int)-> Нет: self.sr=int def Tell_search_target(self) -> Нет: распечатать(self.sr) защита get_cocktail_images (я, запрос): адрес = self.url + запрос данные = запросы.получить (адрес) если data.status_code == 200: lis_drinks = data.json() вернуть lis_drinks еще: print(f"Ошибка: {data.status_code}") возврат Нет def apply_filters(self, ingred_filter_active, glass_filter_active): # Получение данных без фильтра unfiltered_data = self.get_cocktail_images(self.command) если unfiltered_data имеет значение Нет: возврат Нет напитки = unfiltered_data.get('напитки') # Применение следующих фильтров или значений прерываний filtered_drinks = [] если напитки не Нет: для питья в напитках: # Проверка наличия применяемых фильтров if (ingred_filter_active и 'strIngredient1' в Drink and Drink['strIngredient1']) или \ (glass_filter_active и 'strGlass' в Drink and Drink['strGlass']): filtered_drinks.append(напиток) # Передача фильтров данных filtered_data = {'drinks': filtered_drinks} вернуть фильтрованные_данные защита do_search(self) -> список: return [[1, «Элемент 1», «Описание 1»], [2, «Элемент 2», «Описание 2»], [3, «Элемент 3», «Описание 3»], [4, «Элемент 4», «Описание 4»], [5, «Элемент 5», «Описание 5»]] Класс Presenter.py:
импортировать Ги из представления импорта просмотра из модели импорта модели gi.require_version('Gtk', '3.0') из gi.repository импортировать Gtk Ведущий класса: def __init__(self, model: Model, view: View): self.model = модель self.view = просмотр self.view.set_handler(сам) def on_activate(self) -> Нет: self.view.construir_ventana() def on_search_button_clicked(self, button, input): #Deberia Mostras as imaxes e os nomes dos cocteles имя = input.get_text() данные = self.model.get_cocktail_images(имя) напитки = data.get('напитки') списокИмена = [] списокИзображения = [] если напитки не Нет: для питья в напитках: listNames.append(drink['strDrink']) listImages.append(drink['strDrinkThumb']) self.view.display_cocktail_images(listNames, listImages) def on_filter_ingredients_clicked(self, button, label): is_active = button.get_active() если is_active: print("Поиск по ингредиентам включен") self.model.change_search_target(2) self.model.tell_search_target() еще: print("Поиск по ингредиентам отключен") self.model.change_search_target(1) def on_filter_glass_clicked(self, button, label): is_active = button.get_active() если is_active: print("Поиск по стеклу включен") self.model.change_search_target(3) self.model.tell_search_target() еще: print("Поиск по стеклу отключен") self.model.change_search_target(1) def apply_filters(self, ingred_filter_active, glass_filter_active): #Deberia Mostrar imaxes e nombres filtered_data = self.model.apply_filters(ingred_filter_active, glass_filter_active) # Луэго, актуализируйте вид с фильтрациями результатов напитки = filtered_data.get('напитки') списокИмена = [] списокИзображения = [] если напитки не Нет: для питья в напитках: listNames.append(drink['strDrink']) listImages.append(drink['strDrinkThumb']) self.view.display_cocktail_images(listNames, listImages) def on_filter_display_clicked(self) -> Нет: самовидение def on_return_clicked(self) -> Нет: самовидение def on_drink_clicked(self) -> Нет: самовидение если __name__ == "__main__": вист = Просмотр () мод=Модель() pr = Ведущий (мод, вист) pr.on_activate() pr.view.window.show_all() Gtk.main()
Оставляю несколько изображений интерфейса до поиска и после:

1 -> введите здесь описание изображения

2 -> введите здесь описание изображения

Вернуться в «Python»