def event_demo(): wp = jp.WebPage() button_div = jp.Div(classes='flex m-4 flex-wrap', a=wp) w_button_classes = 'bg-red-500 hover:bg-red-700 text-white font-bold py-2 px-4 border border-blue-700 rounded ' \ 'mr-2 ' r_button_classes = 'bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 border border-blue-700 ' \ 'rounded mr-2 ' w_message = jp.Div(text='Click ↑ button to get weather condition', classes='text-xl my-4', a=wp) r_message = jp.Div(text='Click ↑ button to get currency', classes='text-xl my-4', a=wp) bw = jp.Button(text='Weather', a=button_div, classes=w_button_classes, click=weather_click) bw.message = w_message br = jp.Button(text='Currency', a=button_div, classes=r_button_classes, click=rate_click) br.message = r_message return wp
def show_demo(): wp = jp.WebPage() b = jp.Button(text="Click to toggle show", a=wp, classes=button_classes) d = jp.Div(text="Toggled by show", classes="m-2 p-2 text-2x1 border w-48", a=wp) b.d = d jp.Div(text="Will always show", classes="m-2", a=wp) def toggle_show(self, msg): self.d.show = not self.d.show b.on("click", toggle_show) b = jp.Button(text="Click to toggle visibility", a=wp, classes=button_classes) d = jp.Div(text="Toggled by visible", classes="m-2 p-2 text-2x1 border w-48", a=wp) d.visibility_state = "visible" b.d = d jp.Div(text="Will always show", classes="m-2", a=wp) def toggle_visible(self, msg): if self.d.visibility_state == "visible": self.d.set_class("invisible") self.d.visibility_state = "invisible" else: self.d.set_class("visible") self.d.visibility_state = "visible" b.on("click", toggle_visible) return wp
def serve(cls, req): # Build the web page add layout and place this page in container wp = jp.QuasarPage(tailwind=True) lay = layout.DefaultLayout(a=wp) container = jp.QPageContainer(a=lay) # classes for input boxes and labels input_class = "m-2 bg-gray-200 border-2 border-gray-200 rounded py-2 px-4 " \ "focus:outline-none focus:border-purple-500 focus:bg-white" label_class = "m-2 py-2 px-4" # create container box for the app con = jp.Div(a=container, classes="bg-purple-300 p-10 m-10 rounded") # two lines of titles jp.Div(a=con, text="Flatmates Bill", classes="text-4xl m-2") jp.Div(a=con, text="Get the amount of a bill two flatmates owe based on days in the house", classes="text-lg") # four lines for the input boxes and button l_fm1 = jp.Div(a=con, classes="grid grid-cols-4") l_fm2 = jp.Div(a=con, classes="grid grid-cols-4") l_bill = jp.Div(a=con, classes="grid grid-cols-4") # div for output output_div = jp.Div(a=con, classes="m-2 p-2 text-lg border-2 h-10") l_btn = jp.Div(a=con, classes="grid grid-cols-2") # boxes where input is typed jp.Div(a=l_fm1, text="1st Flatmate's name", classes=label_class) i_fm1_name = jp.Input(a=l_fm1, value="Martin", classes=input_class) jp.Div(a=l_fm1, text="days in the house", classes=label_class) i_fm1_days = jp.Input(a=l_fm1, value="28", classes=input_class) jp.Div(a=l_fm2, text="2nd Flatmate's name", classes=label_class) i_fm2_name = jp.Input(a=l_fm2, value="Will", classes=input_class) jp.Div(a=l_fm2, text="days in the house", classes=label_class) i_fm2_days = jp.Input(a=l_fm2, value="25", classes=input_class) jp.Div(a=l_bill, text="Bill amount", classes=label_class) i_bill_amt = jp.Input(a=l_bill, value="120", classes=input_class) jp.Div(a=l_bill, text="Bill period", classes=label_class) i_bill_period = jp.Input(a=l_bill, placeholder="e.g.: February 2021", classes=input_class) jp.Button(a=l_btn, text="calculate", click=cls.get_results, classes="bg-purple-700 rounded p-2 m-2", fm1_name=i_fm1_name, fm2_name=i_fm2_name, fm1_days=i_fm1_days, fm2_days=i_fm2_days, bill_amt=i_bill_amt, bill_period=i_bill_period, outputdiv=output_div) jp.Button(a=l_btn, text="generate PDF", click=cls.get_results, classes="bg-purple-700 rounded p-2 m-2", fm1_name=i_fm1_name, fm2_name=i_fm2_name, fm1_days=i_fm1_days, fm2_days=i_fm2_days, bill_amt=i_bill_amt, bill_period=i_bill_period, outputdiv=output_div) return wp
async def blackjack(): wp = jp.WebPage() wp.outer_div = jp.Div( classes='container mx-auto px-4 sm:px-6 lg:px-8 space-y-5', a=wp) wp.deck_id = await create_deck() # Deal initial four cards cards = jp.Dict(await deal(wp.deck_id, 4)) wp.player_hand = [cards.cards[0], cards.cards[2]] wp.dealer_hand = [cards.cards[1], cards.cards[3]] jp.Div( text='Blackjack Demo', a=wp.outer_div, classes= 'm-2 p-4 text-3xl font-bold leading-7 text-gray-900 sm:leading-9 sm:truncate' ) wp.dealer_div = jp.Div(classes='flex flex-wrap m-2', a=wp.outer_div) # Image of back of card wp.card_back = Card( src= 'https://raw.githubusercontent.com/elimintz/elimintz.github.io/master/card_back.png', a=wp.dealer_div) wp.down_card = Card(src=wp.dealer_hand[0].image, a=wp.dealer_div, classes='hidden') Card(src=wp.dealer_hand[1].image, a=wp.dealer_div, style='transition-delay: 1000ms') wp.player_div = jp.Div(classes='flex flex-wrap m-2', a=wp.outer_div) for card in wp.player_hand: Card(src=card.image, a=wp.player_div, style='transition-delay: 2000ms') button_div = jp.Div(classes='flex m-2 space-x-6', a=wp.outer_div) wp.stand_btn = jp.Button(text='Stand', a=button_div, classes=button_classes, click=stand) wp.hit_btn = jp.Button(text='Hit', a=button_div, classes=button_classes, click=hit) wp.play_again_btn = jp.Button(text='Play Again', a=button_div, classes=button_classes, click=play_again) wp.play_again_btn.set_class('hidden') wp.hand_value_div = jp.Div( text=f'Hand value: {hand_value(wp.player_hand)}', a=wp.outer_div, classes='text-2xl') return wp
def rot_img(): wp = jp.WebPage() image = jp.Img(src='https://i.ibb.co/Pjh1cJ6/caveman.jpg', a=wp) image.classes = 'm-4 p-4 inline-block border border-blue-500 rounded' image.style = f'transform: rotate(0deg)' image.height = 400 image.width = 400 button_div = jp.Div(classes='flex m-4 flex-wrap', a=wp) button_classes = 'bg-blue-500 hover:bg-blue-700 text-white py-1 px-2 border border-blue-700 rounded items-center' def rotate(self, msg): if self.image.style == f'transform: rotate(0deg)': self.image.style = f'transform: rotate(90deg)' elif self.image.style == f'transform: rotate(90deg)': self.image.style = f'transform: rotate(180deg)' elif self.image.style == f'transform: rotate(180deg)': self.image.style = f'transform: rotate(270deg)' elif self.image.style == f'transform: rotate(270deg)': self.image.style = f'transform: rotate(0deg)' br = jp.Button(text='Rotate', a=button_div, classes=button_classes, click=rotate) br.image = image return wp
def plot_test(): wp = jp.WebPage() f = plt.figure() plt.plot([0, 1, 4, 9], marker='*', markersize=20, markeredgecolor='red') plt.title('Matplotlib Example') plt.xlabel('x data') plt.ylabel('y data') chart = jp.Matplotlib(a=wp) chart.num_points = 4 plt.close(f) b = jp.Button(text='Add Point', a=wp, classes='m-2 bg-transparent hover:bg-blue-500 text-blue-700 font-semibold hover:text-white py-2 px-4 border border-blue-500 hover:border-transparent rounded') b.chart = chart def add_point(self, msg): self.chart.num_points += 1 np = self.chart.num_points f = plt.figure() plt.plot([i*i for i in range(np)], marker='*', markersize=20, markeredgecolor='red') plt.title(f'This chart has {np} points') plt.xlabel('x data') plt.ylabel('y data') self.chart.set_figure(f) plt.close(f) b.on('click', add_point) return wp
async def main_screen(): main = jp.WebPage(websockets=False) main += title main += subtitle def pdf_input(self,msg): print("event") sesspath = msg.session_id print(msg.session_id) if not os.path.isdir(sesspath): os.mkdir(sesspath) print(f"path made for {msg.session_id}") for i,v in enumerate(msg.form_data.files): print("getting file "+str(i)) with open(f'{sesspath}/{v.name}','wb') as f: f.write(base64.b64decode(v.file_content)) file_list = os.listdir(sesspath) print(f"> got {file_list}") if file_list: session_data[msg.session_id] = file_list msg.page.redirect = 'text_confirm' print(f"> got {file_list}") jp.P(text="Upload a pdf to get started",a=main,classes='w-full flex-none text-sm') form = jp.Form(a=main,enctype='multipart/form-data',submit=pdf_input) jp.Input(type='file',classes=jp.Styles.input_classes,a=form,accept='application/pdf',multiple=True) jp.Button(type='submit',text='Upload',classes=jp.Styles.button_simple,a=form) return main
async def index(request): wp = jp.WebPage(data={'symbols': ','.join(symbols), 'q': None}) in1 = jp.Input(a=wp, classes=input_classes, placeholder='Please type here', model=[wp, 'symbols']) b = jp.Button(text='Read', click=read, a=wp, classes=button_classes) return wp
def count_test(request): start_num = int(request.query_params.get('num', 10)) animation = request.query_params.get('animation', 'flip') wp = jp.WebPage() count_button = jp.Button(text='Start Countdown', classes=button_classes, a=wp, click=count_down) count_button.start_num = start_num count_button.count_animation = animation return wp
async def input_demo(request): wp = jp.WebPage(data={'text':'Initial text'}) button_classes = 'w-32 m-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded' b = jp.Button(text='Reset', click=reset_all, a=wp, classes=button_classes) jp.Hr(a=wp) input_classes = "m-2 bg-gray-200 appearance-none border-2 border-gray-200 rounded xtw-64 py-2 px-4 text-gray-700 focus:outline-none focus:bg-white focus:border-purple-500" for _ in range(5): jp.Input(a=wp, classes=input_classes, placeholder='Please type here', model=[wp, 'text']) for _ in range(3): jp.Div(model=[wp, 'text'], classes='m-2 p-2 h-32 text-xl border-2 overflow-auto', a=wp) return wp
async def web_ui(self): wp = jp.WebPage() wp.title = 'Calcuador de jornada de Filmación' wp.favicon = "/CucardaVFXsup_fdoNegro.png" main_div = jp.Div( a=wp, classes= 'bg-black py-2 px-2 rounded-lg shadow-xl lg:max-w-3xl sm:max-w-2xl container min-width transform lg:scale-100 sm:scale-150 origin-top-left' ) # overflow-auto flex content-center flex-shrink-0 m-auto max-w-xl text-base sm:text-4xl lg:text-base main_div.add(head_div) app_box = jp.Div( a=main_div, classes='flex-col text-white content-center m-2 flex-grow ' ) # flex-shrink-0 d1_organizer = jp.Div(a=app_box, classes='flex border-gray-900 border-2') labels_for_data = jp.Div(a=d1_organizer, classes='text-align-left ' + cell_style) data_input_column = jp.Div(a=d1_organizer, classes=cell_style) labels_for_data.add(fee_label, factor_mult_extras_label, start_workday_label, end_workday_label, hs_por_jornada_label, night_hs_label) data_input_column.add(fee_inbox, factor_mult_extras_inbox, start_workday_inbox, end_workday_inbox, hs_por_jornada_inbox, night_check) pre_info_area = jp.Div(a=app_box, classes='py-2 flex flex-no-wrap') # result_box = jp.Div(a=app_box, classes='flex content-start') # btn_div = jp.Div(a=result_box) jp.P(text='Cobrarás en Total = ', a=result_box, classes='m-4') result_box.add(jp.Space(num=2), result_display) calc_bton = jp.Button( text='Calcular Total', name='Calcular Total', a=btn_div, click=result, classes=boton_style ) # TO-DO activar la funcionalidad del horario nocturno cuando se checkee. pre_info_area.add(info_area) end_workday_inbox.on('change', dates_non_overlap) fee_inbox.on('change', result) # calc_bton.on('before', info_area_fn) info_link.on('mouseover', change) info_link.on('mouseleave', change) night_check.on('change', result) return wp
def event_demo(): number_of_buttons = 25 wp = jp.WebPage() button_div = jp.Div(classes='flex m-4 flex-wrap', a=wp) button_classes = 'w-32 mr-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full' message = jp.Div(classes='text-lg border m-2 p-2 overflow-auto h-64', a=wp) message.add(jp.P(text='No button clicked yet')) button_list = [] for i in range(1, number_of_buttons + 1): b = jp.Button(text=f'Button {i}', a=button_div, classes=button_classes, click=button_click) b.message = message b.num_clicked = 0 button_list.append(b) wp.button_list = button_list # The list will now be referenced by the WebPage instance attribute return wp
def event_demo(): number_of_buttons = 25 wp = jp.WebPage() button_div = jp.Div(classes='flex m-4 flex-wrap', a=wp) button_classes = 'w-32 mr-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full' message = jp.Div(text='No button clicked yet', classes='text-2xl border m-4 p-2', a=wp) for i in range(1, number_of_buttons + 1): b = jp.Button(text=f'Button {i}', a=button_div, classes=button_classes, click=button_click) b.message = message b.num_clicked = 0 return wp
def __init__(self, values, **kwargs): self.values = values super().__init__(**kwargs) self.cards = [] self.total_clicks = 0 self.stats = jp.Div(a=self, classes="q-pa-sm bg-grey-3") self.number_to_find = jp.Div(a=self.stats, classes="q-ml-sm q-mb-sm") self.nb_clicked = jp.Div(a=self.stats, classes="q-ml-sm ") self.btn_reset = jp.Button(a=self.stats, classes="bg-primary q-pa-sm q-ma-md text-white", text="Réinitialiser") self.btn_reset.on("click", self.reset_clicked) self.card_container = None self.reset()
def list_demo(): wp = jp.WebPage() button_list = [] my_list = jp.Ul(a=wp, classes="m-2 p-2 list-disc") for i in range(1, 11): li = jp.Li(a=my_list) b = jp.Button( text=f"Button {i}", a=li, classes=button_classes, click=button_click ) button_list.append(b) my_list = jp.Ul(a=wp, classes="m-2 p-2 list-disc list-inside") for i in range(1, 11): jp.Li(text=f"List two item {i}", a=my_list, classes="hover:bg-gray-200") my_list = jp.Ul(a=wp, classes="m-2 p-2 list-decimal list-inside") for i in range(1, 11): jp.Li(text=f"List three item {i}", a=my_list) wp.button_list = button_list return wp
def __init__(self, **kwargs): super().__init__(**kwargs) self.value = 0 self.tape = jp.Input( classes='block p-2 m-2 border text-right text-sm bg-gray-200', a=self, readonly=True, value=' ', style='width: 90%') self.result = jp.Input( classes='block p-2 m-2 border text-2xl text-right', a=self, readonly=True, value='0', style='width: 90%') d = jp.Div(classes='flex w-auto m-2', a=self) b = jp.Input(text='type', a=d) b1 = jp.Button(text='cal!', a=d, click=self.cal_click) b1.calc = self
def home(): wp = jp.QuasarPage(tailwind=True) div = jp.Div(a=wp, classes="bg-gray-200 h-screen") div1 = jp.Div(a=div, classes="grid grid-cols-3 gap-4 p-4") in_1 = jp.Input(a=div1, placeholder="Enter first value", classes="form-input") in_2 = jp.Input(a=div1, placeholder="Enter second value", classes="form-input") d_output = jp.Div(a=div1, text="Result goes here...", classes="text-gray-600") jp.Div(a=div1, text="Just another div...", classes="text-gray-600") jp.Div(a=div1, text="Yet another div", classes="text-gray-600") div2 = jp.Div(a=div, classes="grid grid-cols-2 gap-4") jp.Button(a=div2, text="Calculate", click = sum_up, in1=in_1, in2=in_2, d = d_output, classes="border border-blue-500 m-2 py-1 px-4 rounded " "text-blue-600 hover:bg-red-500 hover:text-white") jp.Div(a=div2, text="I am a cool interactive div!", mouseenter=mouse_enter, mouseleave=mouse_leave, classes = "hover:bg-red-500") return wp
def photo_browser(): all_container_classes = 'm-1 p-4' small_img_container_classes = 'm-1 p-1 bg-gray-700' default_combobox_classes = 'block bg-gray-200 border border-gray-200 text-gray-700 ' \ 'py-3 px-4 pr-8 rounded leading-tight focus:outline-none ' \ 'focus:bg-white focus:border-gray-500 w-full' settings_button_classes = 'm-2 p-2' dropdown_menu_classes = 'm-2 p-2 bg-gray-400' settings_div_classes = 'w-full' input_classes = "bg-gray-200 border border-gray-200 rounded py-3 px-4 pr-8 text-gray-700 " \ "focus:outline-none focus:bg-white focus:border-purple-500 w-full" main_container_style = 'position: absolute; top: 500px; width: 100%; margin: 0;' images_container_style = 'display:flex; justify-content:center; flex-wrap: wrap;' main_img_style = 'width: 800px; display: block; margin-left: auto; margin-right: auto;' \ 'z-index: 2; left: 0; right: 0; margin: 2% auto;' small_img_style = 'width: 200px;' settings_button_style = 'position: absolute;' dropdown_menu_style = 'position: absolute; top: 55px; z-index: 3;' settings_div_style = 'position: absolute;' def small_container_mouseenter(self, msg): msg.page.main_img.src = self.child.src self.child.style += ' transform: scale(.85);' def small_container_mouseleave(self, msg): if not isinstance(self.child, jp.P): self.child.style = small_img_style else: self.child.style = '' msg.page.main_img.src = msg.page.main_img_src def select_default_img(self, msg): msg.page.main_img_src = self.child.src for img_cont in msg.page.all_image_containers: img_cont.set_class('bg-gray-700') self.set_class('bg-red-700') def change_images(self, msg): msg.page.images_container.delete_components() msg.page.small_images = glob(self.value + '*.*') msg.page.small_images = natsorted(msg.page.small_images) msg.page.main_img.src = 'static/' + msg.page.small_images[0] msg.page.main_img_src = msg.page.main_img.src msg.page.other_settings_container.show = True if msg.page.small_images_content_display_combobox.value == "text": if msg.page.pattern_recognize_checkbox.checked and msg.page.pattern_recognize_input.value: load_images(mode=2, pattern=msg.page.pattern_recognize_input.value) else: load_images(mode=2) else: load_images() if msg.page.main_img_position_checkbox.checked: msg.page.main_img.style = main_img_style msg.page.main_img.style += ' position: fixed;' def toggle_show(self, msg): self.dropdown_menu.show = not self.dropdown_menu.show def set_main_img_position(self, msg): msg.page.main_img.style = main_img_style if self.checked: msg.page.main_img.style += ' position: fixed;' else: msg.page.main_img.style += ' position: absolute;' def change_small_images_content_display(self, msg): msg.page.images_container.delete_components() if self.value == "photo": load_images(mode=1) elif self.value == "text": load_images(mode=2) def set_pattern_recognize(self, msg): msg.page.pattern_recognize_input.show = not msg.page.pattern_recognize_input.show msg.page.pattern_refresh_button.show = not msg.page.pattern_refresh_button.show msg.page.pattern_recognize_input.value = '' pattern_refresh(self, msg) def pattern_refresh(self, msg): msg.page.images_container.delete_components() if wp.small_images_content_display_combobox.value == "text": load_images(mode=2, pattern=msg.page.pattern_recognize_input.value) else: load_images(mode=1) wp = jp.WebPage() wp.body_classes = 'bg-gray-600' small_images_folders = glob('photos/*/') try: wp.small_images = glob(small_images_folders[0] + '*.*') wp.small_images = natsorted(wp.small_images) main_img_src = 'static/' + wp.small_images[0] except IndexError: jp.P(text='Directory photos/ is empty', a=wp, classes='text-5xl m-2 p-2') return wp main_img = jp.Img(src='', a=wp, style=main_img_style) main_img.show = False main_container = jp.Div(a=wp, style=main_container_style) settings_div = jp.Div(a=wp, style=settings_div_style, classes=settings_div_classes) dropdown_menu = jp.Div(a=settings_div, classes=dropdown_menu_classes, style=dropdown_menu_style) images_dir_location_combobox_container = jp.Div(a=dropdown_menu) jp.Label(a=images_dir_location_combobox_container, text='Dir for image src*') images_dir_location_combobox = jp.Select(a=images_dir_location_combobox_container, classes=default_combobox_classes) other_settings_container = jp.Div(a=dropdown_menu) other_settings_container.show = False jp.Label(a=other_settings_container, text='Main img pos fixed?') main_img_position_checkbox = jp.Input(a=other_settings_container, type='checkbox', classes='m-1 form-checkbox') main_img_position_checkbox.on("change", set_main_img_position) jp.Br(a=other_settings_container) jp.Label(a=other_settings_container, text='Small images content display') small_images_content_display_combobox = jp.Select(a=other_settings_container, classes=default_combobox_classes) jp.Option(a=small_images_content_display_combobox, value="photo", text='Photo') jp.Option(a=small_images_content_display_combobox, value="text", text='Image name') small_images_content_display_combobox.on('change', change_small_images_content_display) small_images_content_display_combobox.value = "photo" jp.Label(a=other_settings_container, text="Pattern recognize?") pattern_recognize_checkbox = jp.Input(a=other_settings_container, type='checkbox', classes='m-1 form-checkbox') pattern_recognize_checkbox.on("change", set_pattern_recognize) pattern_refresh_button = jp.Button(a=other_settings_container) jp.I(a=pattern_refresh_button, classes='fas fa-sync') pattern_refresh_button.on('click', pattern_refresh) pattern_refresh_button.show = False jp.Br(a=other_settings_container) pattern_recognize_input = jp.Input(a=other_settings_container, classes=input_classes, placeholder='Type pattern ' 'here') pattern_recognize_input.show = False pattern_refresh_button.pattern_recognize_input = pattern_recognize_input settings_button = jp.Button(a=settings_div, classes=settings_button_classes, style=settings_button_style) settings_button.dropdown_menu = dropdown_menu jp.I(a=settings_button, classes='fas fa-cogs fa-2x') settings_button.on('click', toggle_show) for image_folder in small_images_folders: jp.Option(value=image_folder, text=image_folder, a=images_dir_location_combobox) images_dir_location_combobox.on('change', change_images) images_container = jp.Div(a=main_container, classes='m-1', style=images_container_style) wp.main_img = main_img wp.main_img_src = main_img_src wp.images_container = images_container wp.pattern_recognize_input = pattern_recognize_input wp.pattern_refresh_button = pattern_refresh_button wp.small_images_content_display_combobox = small_images_content_display_combobox wp.pattern_recognize_checkbox = pattern_recognize_checkbox wp.main_img_position_checkbox = main_img_position_checkbox wp.other_settings_container = other_settings_container def load_images(mode=1, pattern=''): wp.all_image_containers = [] small_img = '' for i in range(len(wp.small_images)): small_img_container = jp.Div(a=images_container, classes=small_img_container_classes, click=select_default_img, mouseenter=small_container_mouseenter, mouseleave=small_container_mouseleave, ) if mode == 1: small_img = jp.Img(src=f'/static/{wp.small_images[i]}', a=small_img_container, style=small_img_style, ) elif mode == 2: if pattern: filename_text = basename(wp.small_images[i]).replace(pattern, '') filename_text = filename_text.replace(filename_text[filename_text.find('.'):], '') small_img = jp.P(src=f'/static/{wp.small_images[i]}', a=small_img_container, text=filename_text) else: small_img = jp.P(src=f'/static/{wp.small_images[i]}', a=small_img_container, text=basename(wp.small_images[i])) small_img_container.child = small_img wp.all_image_containers.append(small_img_container) wp.main_img.style = main_img_style wp.main_img.style += 'position: absolute;' wp.all_image_containers[0].set_class('bg-red-700') main_img.show = True # load_images() # uncomment it if you want to image load automatically return wp
def create_empty_button(div, text, classes=button_menu): button = jp.Button(a=div, classes=classes) button.label = jp.P(a=button, text=text) return button
def list_movies(self): # genera la lista dei film del genere scelto def view_genre(self, msg): conn = sqlite3.connect('movies.db') c = conn.cursor() genre = (self.text,) for row in c.execute('SELECT * FROM films WHERE genre=?', genre): li.text = f'Genere selezionato: {self.text}' body_table = jp.Tbody(style='overflow:auto;', a=movie_table) row_table = jp.Tr(style='') div_table1 = jp.Td(style='width: 447px;', a=row_table) div_title_film = jp.Div(style='cursor: pointer;', text=row[0], a=div_table1, click=open_film) div_table2 = jp.Td(style='width: 183px;', a=row_table) div_director_film = jp.Div(style='cursor: pointer;', text=row[8], a=div_table2, click=open_film) div_table3 = jp.Td(style='width: 100px;', a=row_table) div_date_film = jp.Div(style='cursor: pointer;', text=row[3], a=div_table3, click=open_film) div_title_film.additional_properties = row div_director_film.additional_properties = row div_date_film.additional_properties = row row_table.additional_properties = {'Titolo': row[0], 'Regista': row[8], 'Data di uscita': row[3]} body_table.add(row_table) conn.commit() conn.close() button_sort_director.additional_properties = [self.text, 'Regista'] button_sort_title.additional_properties = [self.text, 'Titolo'] li2.set_classes('block') div1.remove_component(div2) movie_table.add(body_table) div1.add(div_sort_buttons) div1.add(movie_table) #genera la lista ordinata in base al titolo def sort_by_title(self, msg): movie_table.delete_components() body_table_title_sorted = jp.Tbody(style='overflow:auto;') conn = sqlite3.connect('movies.db') c = conn.cursor() for row in c.execute('SELECT * FROM films ORDER BY title'): if row[7] == self.additional_properties[0]: li.text = f'Genere selezionato: {self.additional_properties[0]}' row_table = jp.Tr(style='') div_table1 = jp.Td(style='width: 447px;', a=row_table) div_title_film = jp.Div(style='cursor: pointer;', text=row[0], a=div_table1, click=open_film) div_table2 = jp.Td(style='width: 183px;', a=row_table) div_director_film = jp.Div(style='cursor: pointer;', text=row[8], a=div_table2, click=open_film) div_table3 = jp.Td(style='width: 100px;', a=row_table) div_date_film = jp.Div(style='cursor: pointer;', text=row[3], a=div_table3, click=open_film) div_title_film.additional_properties = row div_director_film.additional_properties = row div_date_film.additional_properties = row body_table_title_sorted.add(row_table) movie_table.add(body_table_title_sorted) #genera la lista ordinata in base al regista def sort_by_director(self, msg): movie_table.delete_components() body_table_sorted = jp.Tbody(style='overflow:auto;') conn = sqlite3.connect('movies.db') c = conn.cursor() for row in c.execute('SELECT * FROM films ORDER BY director'): if row[7] == self.additional_properties[0]: li.text = f'Genere selezionato: {self.additional_properties[0]}' row_table = jp.Tr(style='') div_table1 = jp.Td(style='width: 447px;', a=row_table) div_title_film = jp.Div(style='cursor: pointer;', text=row[0], a=div_table1, click=open_film) div_table2 = jp.Td(style='width: 183px;', a=row_table) div_director_film = jp.Div(style='cursor: pointer;', text=row[8], a=div_table2, click=open_film) div_table3 = jp.Td(style='width: 100px;', a=row_table) div_date_film = jp.Div(style='cursor: pointer;', text=row[3], a=div_table3, click=open_film) div_title_film.additional_properties = row div_director_film.additional_properties = row div_date_film.additional_properties = row body_table_sorted.add(row_table) movie_table.add(body_table_sorted) #dalla visualizzazione del singolo film, torna alla lista def return_to_list(self, msg): div_sort_buttons.set_class('block') p_title.set_classes('hidden') p_director.set_classes('hidden') p_date.set_classes('hidden') p_gross.set_classes('hidden') p_budget.set_classes('hidden') p_rating.set_classes('hidden') p_distributor.set_classes('hidden') p_imdb_rating.set_classes('hidden') p_time.set_classes('hidden') tasto_indietro_lista_film.set_classes('hidden') tasto_indietro.set_classes('block') movie_table.set_classes("block") li.set_classes('block') button_sort_director.on('click', sort_by_director) #apre la pagina di visualizzazione di un singolo film def open_film(self, msg): div_sort_buttons.set_class('hidden') tasto_indietro_lista_film.set_classes('block') tasto_indietro.set_classes('hidden') movie_table.set_classes("hidden") li.set_classes("hidden") p_title.set_classes('block') p_director.set_classes('block') p_date.set_classes('block') p_gross.set_classes('block') p_budget.set_classes('block') p_rating.set_classes('block') p_distributor.set_classes('block') p_imdb_rating.set_classes('block') p_time.set_classes('block') p_title.text = 'Titolo: ' + self.additional_properties[0] p_director.text = 'Regista: ' + self.additional_properties[8] p_date.text = 'Data di uscita: ' + self.additional_properties[3] p_gross.text = 'Incasso totale: ' + str(self.additional_properties[1]) p_budget.text = 'Budget: ' + str(self.additional_properties[2]) p_rating.text = 'Rating: ' + self.additional_properties[4] p_distributor.text = 'Distributore: ' + self.additional_properties[6] p_imdb_rating.text = 'Punteggio su IMDB: ' + str(self.additional_properties[9]) if (self.additional_properties[5] != None): p_time.text = 'Durata: ' + str(self.additional_properties[5]) + ' minuti' # cProfile.run('view_genre') profile.runctx('view_genre', None, locals()) #torna alla selezione del genere def remove_genre(self, msg): li.text='Benvenuto su MovieDatabase, scegli un genere:' div1.add(div2) li2.set_classes('hidden') movie_table.delete_components() div1.remove_component(div_sort_buttons) div1.remove_component(movie_table) button_sort_director.on('click', sort_by_director) body_table.set_classes('block') # istanze di classi di JustPy wp = jp.WebPage() ul = jp.Ul( style='margin-bottom: 0px;overflow: hidden;background-color: #C3C3C3;border-top-right-radius:.225rem;border-top-left-radius:.225rem', a=wp, classes='shadow-md m-2 p-2') li = jp.Li(style='margin-left: 1%;text-decoration: none;float: left;color: black;font-size:20px', text='Benvenuto su MovieDatabase, scegli un genere:', a=ul) div1 = jp.Div( style='overflow:auto;height: 520px;padding:4%;padding-top:0%;margin-top: 0px;background-color: #DCDCDC;border-bottom-right-radius:.225rem;border-bottom-left-radius:.225rem', a=wp, classes='shadow-md m-2') div2 = jp.Div(style='margin-top:46px; position:absolute', a=div1) div_sort_buttons = jp.Div(style='padding-top: 19px;width: 1080px;height: 73px;position:absolute;background-color: #DCDCDC;') button_sort_title = jp.Button(a=div_sort_buttons, style='width: 27rem; border-radius: 2px;', classes='mr-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4', text='Ordina per titolo', click=sort_by_title) button_sort_director = jp.Button(a=div_sort_buttons, style='width: 11rem; border-radius: 2px;', classes='w-32 mr-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4', text='Ordina per regista', click=sort_by_director) movie_table = jp.Table(style='margin-top: 95px; color:black;width:59%') p_title = jp.P(a=div1, style='margin-top: 82px;color: black;font-size:20px', classes='hidden') p_director = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_date = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_gross = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_budget = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_rating = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_distributor = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_imdb_rating = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') p_time = jp.P(a=div1, style='color: black;font-size:20px', classes='hidden') body_table = jp.Tbody(style='overflow:auto;', a=movie_table) body_table_sorted = jp.Tbody(style='overflow:auto;') body_table_title_sorted = jp.Tbody(style='overflow:auto;') li2 = jp.Li(style='margin-left: 1%;text-decoration: none;float: left;color: black;font-size:20px', a=ul) li2.set_classes('hidden') tasto_indietro = jp.Button(a=li2,text='Clicca qui per tornare indietro', style='width: 263px;color:red;', click=remove_genre) tasto_indietro_lista_film = jp.Button(a=li2, text='Clicca qui per tornare alla lista',style='width: 265px;color:red;',classes='hidden', click=return_to_list) genres = ['Avventura','Azione','Commedia','Musical','Horror','Romantico','Thriller','Drammatico','Documentario','Altro'] for i in genres: jp.Button(text=i, a=div2,click=view_genre,style=f'border-radius: .125rem;font-weight: 700;height: 12rem;margin: .5rem;margin-right: .5rem;margin-bottom: .5rem;padding-bottom: .5rem;padding-top: .5rem;padding-right: 1rem;padding-left: 1rem;color: #fff;width: 14rem;background-image: url("/static/images/{i}.jpg");') return wp
wp.title = 'EMCAL LV' header_div = jp.Div( text='EMCAL LV Burnin', a=wp, classes='text-5xl text-white bg-blue-500 hover:bg-blue-700 m-1') time_div = jp.Div( a=wp, classes='text-1xl text-white bg-blue-500 hover:bg-blue-700 m-1') the_time = jp.P(a=time_div) on_button_div = jp.Div(a=wp) off_button_div = jp.Div(a=wp) button_classes = 'w-32 mr-2 mb-2 bg-blue-500 hover:bg-blue-700 text-white font-bold py-2 px-4 rounded-full' for i in range(nslots): b = jp.Button(text=f'ON {i+1}', a=on_button_div, classes=button_classes, click=button_click) b.slot = i + 1 b.onoff = 1 for i in range(nslots): b = jp.Button(text=f'OFF {i+1}', a=off_button_div, classes=button_classes, click=button_click) b.slot = i + 1 b.onoff = 0 data_div = jp.Div(a=wp) gridv = jp.AgGrid(a=data_div) gridv.options.pagination = True