Код: Выделить всё
import pandas as pd
from shiny import App, reactive, ui, module, render
from abc import ABC, abstractmethod
class ShinyFormTemplate(ABC):
@abstractmethod
@module.ui
def ui_func(self):
pass
@abstractmethod
@module.server
def server_func(self, input, output, session, *args, **kwargs):
pass
class FruitForm(ShinyFormTemplate):
@module.ui
def ui_func(self):
return ui.row(
ui.input_text("fruits",'Select a Fruit',""),
ui.output_text("output_fruit"),
ui.input_text("qtys",'Quantity:',""),
ui.output_text("output_qty"),
)
@module.server
def server_func(self, input, output, session, *args, **kwargs):
@render.text
def output_fruits():
return input.fruits()
@render.text
def output_qty():
return input.qtys()
class VeggieForm(ShinyFormTemplate):
@module.ui
def ui_func(self):
return ui.row(
ui.input_radio_buttons("veggie","Select a Veggie:",{'Asparagus':'Asparagus','Spinach':'Spinach','Squash':'Squash','Lettuce':'Lettuce'},'Lettuce'),
ui.output_text("output_veggie"),
ui.input_text("qtys",'Quantity:',""),
ui.output_text("output_qty"),
)
@module.server
def server_func(self, input, output, session, *args, **kwargs):
@render.text
def output_veggie():
return input.veggie()
@render.text
def output_qty():
return input.qtys()
fruits = FruitForm()
veggies = VeggieForm()
app_ui = ui.page_fluid(
ui.page_navbar(
ui.nav_panel("New Fruit", "New Fruit - Input Form",
fruits.ui_func('fruit')
),
ui.nav_panel("New Veggie", "New Veggie - Input Form",
veggies.ui_func('veggie')
),
title="Sample App",
id="page",
),
title="Basic App"
)
def server(input, output, session):
fruits.server_func('fruits')
veggies.server_func('veggie')
app = App(app_ui, server)
Код: Выделить всё
Exception has occurred: ValueError
`id` must be a single string
File "C:\Users\this_user\OneDrive\Documents\Programming Projects\Python\example_class_module\app.py", line 66, in
fruits.ui_func('fruit')
ValueError: `id` must be a single string
Что я пробовал:[/b]
Я пытался определить объекты сервера и пользовательского интерфейса вне класса и передать их в качестве аргументов функции init() вместо определяя их как методы класса. Однако, работая таким образом, я не думаю, что смогу получить доступ к атрибутам экземпляра класса из функции модуля с помощью self.attribute.
Можно ли определить методы класса как блестящий модуль (серверные и пользовательские) компоненты?
Подробнее здесь: https://stackoverflow.com/questions/790 ... on-modules