class FinishPage(GridLayout): account_type = None def __init__(self, **kwargs): super().__init__(**kwargs) self.snackbar = None def start(self): self.tsc = SmartCardBehavior( self.name, card_insert_callback=None, card_remove_callback=None, card_reinsert_callback=None, card_remove_forever_callback=self.card_remove_forever_callback, card_removable=True) #self.tsc.monitor(4) def card_remove_forever_callback(self): pass def snackbar_show(self, text, duration=8): if self.snackbar: self.snackbar = None self.snackbar = Snackbar(text=text, duration=duration) self.snackbar.show() #Clock.schedule_once(self.snackbar_hide, wait) def snackbar_hide(self, instance=None): if self.snackbar: self.snackbar.hide() self.snackbar = None
def on_pre_enter(self, *args): """La función se ejecuta antes de ingresar a la clase Mapa Comercios, la función actualiza el nombre del modulo correspondiente""" self.app.title = "Mapa Comercios" snackbar = Snackbar(text="Utiliza el mapa de comercios para encontrar la localizacion de algun Chedraui, La Comer, Soriana o HEB") snackbar.show()
class KivMobDemoUI(FloatLayout): def switch_to_screen(self, name, title): self.ids.toolbar.title = title self.ids.toolbar.left_action_items = [ ["chevron-left", lambda x: self.back_to_menu()] ] self.ids.scr_mngr.transition.direction = "left" self.ids.scr_mngr.current = name self.interstitial_snack = Snackbar( text="Interstitial has not yet loaded." ) def back_to_menu(self): self.ids.scr_mngr.transition.direction = "right" self.ids.scr_mngr.current = "menu" self.ids.toolbar.title = "KivMob 2.0" self.ids.toolbar.left_action_items = [] def show_interstitial_msg(self): self.interstitial_snack.show() def hide_interstitial_msg(self): self.interstitial_snack.hide() def open_dialog(self): pass
def MuestraNotificacionComparador(self): """Se muestra las notificaciones que se anexaron al modulo del comparador de precios""" self.a = randint(1, 6) print(self.a) if self.a == 1: notification.notify( title='Como Actualizar los precios', message= 'Puedes actualizar los precios de los productos pulsando el boton de Actualizar que se encuentra en' 'la parte superior', timeout=20) snackbar = Snackbar( text= "Puedes actualizar los precios de los productos pulsando el boton de Actualizar que se encuentra en la parte superior" ) snackbar.show() if self.a == 2: notification.notify( title='Visualización de los Precios', message= 'Los precios pueden ser consultados deslizando la tabla que se muestra al consultar alguna categoría', timeout=20) snackbar = Snackbar( text= "Los precios pueden ser consultados deslizando la tabla que se muestra al consultar alguna categoría" ) snackbar.show() pass
class Test(MDApp): def __init__(self, **kwargs): super().__init__(**kwargs) self.screen = Builder.load_string(KV) self.snackbar = None self._interval = 0 def build(self): return self.screen def wait_interval(self, interval): self._interval += interval if self._interval > self.snackbar.duration: anim = Animation(y=dp(10), d=.2) anim.start(self.screen.ids.button) Clock.unschedule(self.wait_interval) self._interval = 0 self.snackbar = None def snackbar_show(self): if not self.snackbar: self.snackbar = Snackbar(text="This is a snackbar!") self.snackbar.show() anim = Animation(y=dp(72), d=.2) anim.bind(on_complete=lambda *args: Clock.schedule_interval( self.wait_interval, 0)) anim.start(self.screen.ids.button)
class KitchenSinkSnackBar(Screen): snackbar = None _interval = 0 def show_example_snackbar(self, snack_type): """Create and show instance Snackbar.""" def callback(instance): from kivymd.toast import toast toast(instance.text) def wait_interval(interval): self._interval += interval if self._interval > self.snackbar.duration: anim = Animation(y=dp(10), d=0.2) anim.start(self.ids.button) Clock.unschedule(wait_interval) self._interval = 0 self.snackbar = None from kivymd.uix.snackbar import Snackbar if snack_type == "simple": Snackbar(text="This is a snackbar!").show() elif snack_type == "button": Snackbar( text="This is a snackbar", button_text="WITH A BUTTON", button_callback=callback, ).show() elif snack_type == "verylong": Snackbar( text="This is a very very very very very very very " "long snackbar!" ).show() elif snack_type == "padding": Snackbar( text="This is a snackbar!", padding="20dp", button_text="ACTION", button_color=(1, 0, 1, 1), ).show() elif snack_type == "float": if not self.snackbar: self.snackbar = Snackbar( text="This is a snackbar!", button_text="BUTTON", duration=3, button_callback=callback, ) self.snackbar.show() anim = Animation(y=dp(72), d=0.2) anim.bind( on_complete=lambda *args: Clock.schedule_interval( wait_interval, 0 ) ) anim.start(self.ids.button)
def hitung(self): toast("Counting..........") try: from rajaOngkirApi import rajaongkirApi api = rajaongkirApi(key='23930140f7b47aaebf5318262ee5d0f1', accountType='starter') self.id_origin = self.data_tables[ self.ids.ongkirscreen.ids.province.text][ self.ids.ongkirscreen.ids.kota.text] self.id_destinasi = self.data_tables[ self.ids.ongkirscreen.ids.province_tujuan.text][ self.ids.ongkirscreen.ids.kota_tujuan.text] print(self.id_origin, self.id_destinasi) if bool(self.ids.ongkirscreen.ids.weight.text) == False: from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Harap Isi Semuanya", duration=0.5) snackbar.show() else: harga = api.requestApi( origin=self.id_origin, destination=self.id_destinasi, weight=str(self.ids.ongkirscreen.ids.weight.text), courier=self.ids.ongkirscreen.ids.kurir.text.lower()) harga = harga.decode('utf-8') harga = json.loads(harga) deskripsi = '' for i in ((harga['rajaongkir']['results'][0]['costs'])): if 'HARI' in i["cost"][0]["etd"]: deskripsi += f' {i["service"]} : Rp {i["cost"][0]["value"]} \n Perkiraan {i["cost"][0]["etd"]}\n' else: print(f'{i["cost"][0]["etd"]}') deskripsi += f' {i["service"]} : Rp {i["cost"][0]["value"]} \n Perkiraan {i["cost"][0]["etd"]} hari\n' if self.ids.ongkirscreen.ids.kurir.text.lower() == 'jne': self.ids.ongkirscreen.ids.image.ii = self.images[0] if self.ids.ongkirscreen.ids.kurir.text.lower() == 'tiki': self.ids.ongkirscreen.ids.image.ii = self.images[1] if self.ids.ongkirscreen.ids.kurir.text.lower() == 'pos': self.ids.ongkirscreen.ids.image.ii = self.images[2] if deskripsi == '': self.ids.ongkirscreen.ids.label.text = 'tidak ada kurir yang tersedia' if deskripsi != '': self.ids.ongkirscreen.ids.label.text = deskripsi except: from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Harap Isi Semuanya", duration=0.5) snackbar.show()
class AddResourcesWindow(Screen): def load_page(self): ContentNavigationDrawer.populateNavDrawerValues(self) self.rsrcmenu = MDDropdownMenu(caller=self.ids['name'], width_mult=5, callback=self.set_item, position="center") items = [ "Medicine", "Biscuit", "Salt", "Tarpaulin", "Rice", "Daal", "Baby Food", "Sugar" ] for i in items: self.rsrcmenu.items.append({"text": str(i)}) def create_resource(self, name, desc, units, amount): rname = name.current_item rdesc = desc.text runits = units.text ramount = amount.text valid_str = "" if rname == "": valid_str = "Select an Item" elif runits == "": valid_str = "Units is blank" elif ramount == "": valid_str = "Cost is blank" if valid_str != "": ok_button = MDFlatButton(text='OK', on_release=self.dialog_close) self.dialog = MDDialog(title='Alert !', text=valid_str, size_hint=(0.7, 1), buttons=[ok_button]) self.dialog.open() else: query1 = f'''INSERT INTO RESOURCES(CONTACT_ID, ACTIVITY_ID, NAME, DESC, UNITS, AMOUNT, DATE) VALUES ({globalvariables.var_userid}, {globalvariables.var_act_id}, '{rname}', '{rdesc}', {runits}, {ramount}, SYSDATE)''' # run direct SQL stmt = ibm_db.exec_immediate(connection.conn, query1) if ibm_db.num_rows(stmt) > 0: #self.ids['name'].text="" self.ids['desc'].text = "" self.ids['units'].text = "" self.ids['amount'].text = "" self.snackbar = Snackbar(text="Item Added!") self.snackbar.show() def dialog_close(self, obj): self.dialog.dismiss() def set_item(self, instance): self.ids['name'].set_item(instance.text) self.rsrcmenu.dismiss() def cancel_resource_creation(self): self.manager.transition.direction = 'right' self.manager.current = 'activity_detail_window' self.manager.get_screen('activity_detail_window').load_page()
def imuPlotExcept(self, *args): self.cancelPlot() imuExceptionBar = Snackbar( text= f'Connection with IMU not established, connect Swe device first and retry', button_text="ConnectionScreen", button_callback=self.switchToConnection) imuExceptionBar.show()
def borrar_archivo(self): print("borrando") gauth = GoogleAuth() # Try to load saved client credentials gauth.LoadCredentialsFile("mycreds.txt") if gauth.credentials is None: # Authenticate if they're not there gauth.LocalWebserverAuth() elif gauth.access_token_expired: # Refresh them if expired gauth.Refresh() else: # Initialize the saved creds gauth.Authorize() # Save the current credentials to a file gauth.SaveCredentialsFile("mycreds.txt") drive = GoogleDrive(gauth) folderName = "App Inventario" folder_id = '' # creacion archivo en un folder específico folders = drive.ListFile({ 'q': "title='" + folderName + "' and mimeType='application/vnd.google-apps.folder' and trashed=false" }).GetList() file_list = drive.ListFile({ 'q': "'root' in parents and trashed=false" }).GetList() for file in file_list: if (file['title'] == folderName): folder_id = file['id'] break # 3) Build string dynamically (need to use escape characters to support single quote syntax) str = "\'" + folder_id + "\'" + " in parents and trashed=false" # 4) Starting iterating over files file_list = drive.ListFile({'q': str}).GetList() for file in file_list: print('title: %s, id: %s' % (file['title'], file['id'])) if file['title'] == "ReporteGastos.pdf": file.Delete() if file['title'] == "database.db": file.Delete() # Informar que se ha borrado el archivo snackbar = Snackbar( text="Los datos contenidos en Google Drive han sido borrados") snackbar.show()
def on_pre_enter(self, *args): """La función se ejecuta antes de ingresar a la clase Reporte de Gastos, la función actualiza el nombre del modulo correspondiente""" self.app.title = "Reporte de Gastos" #Muestra notificación de escaso print("Estoy en pre enter") APP_PATH = os.getcwd() DB_PATH = APP_PATH + '/prueba.db' # SE DEBE CAMBIAR EL NOMBRE AL NOMBRE DE LA BD FINAL con = sqlite3.connect(DB_PATH) # CONEXION A LA BD cursor = con.cursor() # CURSOR PARA EJECUTAR QUERYS cantidades = [] cantidadfinal = [] nomproductos = [] nomproductofinal = [] cursor.execute("""SELECT CANTIDAD FROM PRODUCTOS """) for a in cursor: cantidades.append(list(a)) for cantidad in cantidades: for elemento in cantidad: cantidadfinal.append(int(elemento)) cursor.execute("""SELECT NOMBRE FROM PRODUCTOS """) for a in cursor: nomproductos.append(list(a)) for nomprod in nomproductos: for elemento in nomprod: nomproductofinal.append(elemento) # print((cantidadfinal[1])>5) # print(nomproductofinal[1]) print(nomproductofinal) a = 0 cadena_escaso = 'Se te esta acabando: ' for c in cantidadfinal: # print(c > 4) if c < 2: print( f"Producto: {nomproductofinal[a]} con {cantidadfinal[a]}") cadena_escaso += str(nomproductofinal[a]) + ' tienes:' + str( cantidadfinal[a]) + ' ' continue a += 1 snackbar = Snackbar(text=cadena_escaso) snackbar.show()
def snack_open(msg, btn_text, btn_callback): col = App.get_running_app().theme_cls.primary_color sn = Snackbar( text=msg, button_text=btn_text, button_callback=btn_callback, ) for x in sn.ids.box.children: if isinstance(x, MDFlatButton): x.theme_text_color = "Custom" x.text_color = col break sn.show()
def _export_csv(self, *args): """Callback for export dialog popup button""" try: ## try exporting data into .csv file self.export.export_data() except lib.utils.NotAbleToWriteFile: toast('Não foi possível criar o arquivo!') else: ## shows snackbar with path to new .csv file self.export_dialog.dismiss() snackbar = Snackbar( text=f'PCD exportado para {self.export.path_to_file}', duration=10 ) snackbar.show()
def change_spinn(self): try: if self.ids.ongkirscreen.ids.search_provinsi.text in list( self.data_tables.keys()): self.ids.ongkirscreen.ids.province.text = self.ids.ongkirscreen.ids.search_provinsi.text from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Provinsi Ditemukan", duration=1) snackbar.show() if self.ids.ongkirscreen.ids.search_provinsi.text not in list( self.data_tables.keys()): from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Provinsi Tidak Ditemukan", duration=1) snackbar.show() except: pass
class Root(BoxLayout): Builder.load_file('My.kv') def calculate_result(self): self.snackbar_zero_error = Snackbar(text="Division by zero") calc_entry = self.math_space.text try: result = eval(str(calc_entry)) except ZeroDivisionError: self.snackbar_zero_error.show() self.math_space.text = '' except SyntaxError: self.math_space.text = '' else: if type(result) == type(.5): self.math_space.text = str(round(result, 3)) elif type(result) == type(9): self.math_space.text = str(result)
def create_new_goal(self): """Creates goals in database""" create_try = data_base.create_goal( self.goal_name, self.icon, self.start_value, self.end_value, self.iteration_towards_goal, self.intensity, ) if create_try: print("create new goal") self.reset_goal() else: error_bar = Snackbar( text="Goal creation failed, needs unique name") error_bar.show() print("goal failed")
def on_pre_enter(self, *args): """"Funcion que se ejecuta al iniciar la aplicacion, se incluyen diferentes parametros que se desean que apararezcan cuando se ejecuta la aplicacion, se cambia el titulo de la aplicacion y se crean las notificaciones iniciales que se le mostrarán al usuario""" self.app.title = "Convertidor Unidades" #Se cambia el nombre de la pantalla self.MuestraNotificacionInicial() snackbar = Snackbar( text= "Utiliza esta sección para convertir diferentes tipos de unidades") snackbar.show() if path.exists("conf.txt"): print("Existe el archivo de configuracion") else: lineasm = ["Green\n", "Light\n", "Normal\n"] print("No existe el archivo de configuraciones") open("conf.txt", "w").close() # crea un archivo# código print("Antes de dormir") sleep(1) print("Ejecutando despues de dormir") archivo = open("conf.txt", "w") for l in lineasm: archivo.write(l) archivo.close() with open("conf.txt", "r") as archivo: lista = [linea.rstrip() for linea in archivo] self.app.theme_cls.primary_palette = lista[0] self.app.theme_cls.theme_style = lista[1] if lista[2] == "Baja": self.app.theme_cls.primary_hue = "200" elif lista[2] == "Media": self.app.theme_cls.primary_hue = "500" elif lista[2] == "Alta": self.app.theme_cls.primary_hue = "900"
class Challenge(Screen): click_color = ColorProperty() unclick_color = ColorProperty() user_answer = StringProperty() last_color = ColorProperty() win = None def __init__(self, **kwargs): super().__init__(**kwargs) self.max_len = int(config_dict["difficulty"]) * 4 + 1 print("Challenge: ", self.max_len) self.answer = "" self.flag = True self.contents = dict() self.last_click = [] self.pos_list = [] self.snackbar = Snackbar(duration=0.8) #提示窗 while len(self.answer) < self.max_len: appdata.ChangeSheet("user_" + config_dict["all_category"][randint( 0, len(config_dict["all_category"]) - 1)]) contents = appdata.MergeData(appdata.SelectIndex(1), appdata.SelectRand(1)) for index, content in contents.items(): if content["内容"] not in self.contents: content["has_answer"] = 1 self.contents[content["内容"]] = content self.answer += content["内容"] self.map, self.true_way = Map().CreateMaze(self.answer, 9) print(self.true_way) self.Refresh() def CheckAnswer(self, btn): #回答按钮点击事件,btn为产生事件的按钮对象 if self.flag: self.flag = False else: return if len(self.last_click): if self.last_click[-1].mypos == btn.mypos: #点击的是最后一个按钮 self.last_click.pop() self.pos_list.remove(btn.mypos) if len(self.last_click): self.last_click[-1].bg_color = self.last_color btn.bg_color = self.unclick_color self.user_answer = self.user_answer[:-1] elif btn.mypos in self.pos_list: if not self.snackbar.parent: self.snackbar.text = "已经点击过该按钮" self.snackbar.show() elif abs(self.last_click[-1].mypos[0] - btn.mypos[0]) + abs(self.last_click[-1].mypos[1] - btn.mypos[1]) == 1: #点击的是周围的按钮 new_color = [] t = len(self.last_click) for i in range(3): new_color.append(self.click_color[i] - 0.005 * t) new_color.append(1) self.last_click[-1].bg_color = new_color self.last_click.append(btn) self.pos_list.append(btn.mypos) btn.bg_color = self.last_color self.user_answer += btn.text else: if not self.snackbar.parent: self.snackbar.text = "请点击上一个点击周围的按钮" self.snackbar.show() else: self.last_click.append(btn) self.pos_list.append(btn.mypos) btn.bg_color = self.last_color self.user_answer += btn.text if len(self.user_answer) < len(self.answer): #未回答完 pass elif self.answer == self.user_answer: #回答正确 print("righr") self.ids.righr_answer_btn.text = "点此查看相关信息" self.snackbar.text = "回答正确" self.snackbar.show() return else: #回答错误 if not self.snackbar.parent: self.snackbar.text = "回答错误" self.snackbar.show() self.flag = True def Refresh(self): #self.ids.grid.clear_widgets() i = 0 for line in self.map: j = 0 for word in line: self.ids["pos_{}_{}".format(i, j)].text = word self.ids["pos_{}_{}".format(i, j)].bg_color = self.unclick_color #btn = ClickButton(text = word, size_hint = (0.1, 0.1), on_release = self.CheckAnswer)#这里是动态生成的控件 #btn.mypos = [i, j] #self.ids.grid.add_widget(btn) j += 1 i += 1 self.pos_list.clear() self.last_click.clear() self.last_click.clear() self.user_answer = "" self.ids.righr_answer_btn.text = "查看正确答案" self.flag = True def ShowTrueWay(self): if self.flag: self.Refresh() for pos in self.true_way: self.CheckAnswer(self.ids["pos_{}_{}".format(pos[0], pos[1])]) else: self.win()
def show_message(self, text): snackbar = Snackbar( text=f"{text}", ) return snackbar.show()
class KitchenSink(App, Screens): theme_cls = ThemeManager() theme_cls.primary_palette = "BlueGray" theme_cls.accent_palette = "Gray" previous_date = ObjectProperty() title = "Kitchen Sink" def __init__(self, **kwargs): super().__init__(**kwargs) self.menu_items = [{ "viewclass": "MDMenuItem", "text": "Example item %d" % i, "callback": self.callback_for_menu_items, } for i in range(15)] self.Window = Window # Default class instances. self.manager = None self.md_app_bar = None self.instance_menu_demo_apps = None self.instance_menu_source_code = None self.md_theme_picker = None self.long_dialog = None self.input_dialog = None self.alert_dialog = None self.ok_cancel_dialog = None self.long_dialog = None self.dialog = None self.user_card = None self.bs_menu_1 = None self.bs_menu_2 = None self.popup_screen = None self.my_snackbar = None self.dialog_load_kv_files = None self.create_stack_floating_buttons = False self.manager_open = False self.cards_created = False self._interval = 0 self.tick = 0 self.x = 0 self.y = 25 self.file_source_code = "" self.hex_primary_color = get_hex_from_color( self.theme_cls.primary_color) self.previous_text = ( f"Welcome to the application [b][color={self.hex_primary_color}]" f"Kitchen Sink[/color][/b].\nTo see [b]" f"[color={self.hex_primary_color}]KivyMD[/color][/b] " f"examples, open the menu and select from the list the desired " f"example or") self.previous_text_end = ( f"for show example apps\n\n" f"Author - [b][color={self.hex_primary_color}]" f"Andrés Rodríguez[/color][/b]\n" f"[u][b][color={self.hex_primary_color}]" f"[email protected][/color][/b][/u]\n\n\n" f"Authors this Fork:\n\n" f"[b][color={self.hex_primary_color}]" f"Ivanov Yuri[/color][/b]\n" f"[u][b][color={self.hex_primary_color}]" f"[email protected][/color][/b][/u]\n\n" f"[b][color={self.hex_primary_color}]Artem S. Bulgakov[/color][/b]\n" f"[u][b][color={self.hex_primary_color}]" f"[email protected][/color][/b][/u]\n\n" f"and contributors...") self.names_contacts = ( "Alexandr Taylor", "Yuri Ivanov", "Robert Patric", "Bob Marley", "Magnus Carlsen", "Jon Romero", "Anna Bell", "Maxim Kramerer", "Sasha Gray", "Vladimir Ivanenko", ) self.demo_apps_list = [ "Shop Window", "Coffee Menu", "Fitness Club", "Registration", "Account Page", ] self.list_name_icons = list(md_icons.keys())[0:15] Window.bind(on_keyboard=self.events) crop_image( (Window.width, int(dp(Window.height * 35 // 100))), f"{demos_assets_path}guitar-1139397_1280.png", f"{demos_assets_path}guitar-1139397_1280_crop.png", ) def set_list_for_refresh_layout(self): async def set_list_for_refresh_layout(): names_icons_list = list(md_icons.keys())[self.x:self.y] for name_icon in names_icons_list: await asynckivy.sleep(0) self.data["Refresh Layout"]["object"].ids.box.add_widget( ItemForListRefreshLayout(icon=name_icon, text=name_icon)) self.data["Refresh Layout"][ "object"].ids.refresh_layout.refresh_done() asynckivy.start(set_list_for_refresh_layout()) def refresh_callback(self, *args): """A method that updates the state of your application while the spinner remains on the screen.""" def refresh_callback(interval): self.data["Refresh Layout"]["object"].ids.box.clear_widgets() if self.x == 0: self.x, self.y = 25, 50 else: self.x, self.y = 0, 25 self.set_list_for_refresh_layout() self.tick = 0 Clock.schedule_once(refresh_callback, 1) def build_tabs(self): for name_tab in self.list_name_icons: tab = Factory.MyTab(text=name_tab) self.data["Tabs"]["object"].ids.android_tabs.add_widget(tab) def switch_tabs_to_icon(self, istance_android_tabs): for i, instance_tab in enumerate( istance_android_tabs.ids.scrollview.children[0].children): istance_android_tabs.ids.scrollview.children[0].remove_widget( instance_tab) istance_android_tabs.add_widget( Factory.MyTab(text=self.list_name_icons[i])) def switch_tabs_to_text(self, istance_android_tabs): for instance_tab in istance_android_tabs.ids.scrollview.children[ 0].children: for k, v in md_icons.items(): if v == instance_tab.text: istance_android_tabs.ids.scrollview.children[ 0].remove_widget(instance_tab) istance_android_tabs.add_widget( Factory.MyTab( text=" ".join(k.split("-")).capitalize())) break def crop_image_for_tile(self, instance, size, path_to_crop_image): """Crop images for Grid screen.""" if not os.path.exists(os.path.join(self.directory, path_to_crop_image)): size = (int(size[0]), int(size[1])) path_to_origin_image = path_to_crop_image.replace("_tile_crop", "") crop_image(size, path_to_origin_image, path_to_crop_image) instance.source = path_to_crop_image def theme_picker_open(self): if not self.md_theme_picker: from kivymd.uix.picker import MDThemePicker self.md_theme_picker = MDThemePicker() self.md_theme_picker.open() def example_add_stack_floating_buttons(self): from kivymd.uix.stackfloatingbutton import MDStackFloatingButtons def set_my_language(instance_button): toast(instance_button.icon) if not self.create_stack_floating_buttons: screen = self.main_widget.ids.scr_mngr.get_screen("stack buttons") screen.add_widget( MDStackFloatingButtons( icon="lead-pencil", floating_data={ "Python": "language-python", "Php": "language-php", "C++": "language-cpp", }, callback=set_my_language, )) self.create_stack_floating_buttons = True def set_expansion_panel(self): from kivymd.uix.expansionpanel import MDExpansionPanel def callback(text): toast(f"{text} to {content.name_item}") content = ContentForAnimCard(callback=callback) for name_contact in self.names_contacts: self.data["Expansion Panel"]["object"].ids.anim_list.add_widget( MDExpansionPanel( content=content, icon="assets/kivy-logo-white-512.png", title=name_contact, )) def set_chevron_back_screen(self): """Sets the return chevron to the previous screen in ToolBar.""" self.main_widget.ids.toolbar.right_action_items = [[ "dots-vertical", lambda x: self.root.toggle_nav_drawer() ]] def download_progress_hide(self, instance_progress, value): """Hides progress progress.""" self.main_widget.ids.toolbar.right_action_items = [[ "download", lambda x: self.download_progress_show(instance_progress), ]] def download_progress_show(self, instance_progress): self.set_chevron_back_screen() instance_progress.open() instance_progress.animation_progress_from_fade() def show_example_download_file(self, interval): from kivymd.uix.progressloader import MDProgressLoader def get_connect(host="8.8.8.8", port=53, timeout=3): import socket try: socket.setdefaulttimeout(timeout) socket.socket(socket.AF_INET, socket.SOCK_STREAM).connect( (host, port)) return True except (TimeoutError, ConnectionError, OSError): return False if get_connect(): link = ("https://www.python.org/ftp/python/3.5.1/" "python-3.5.1-embed-win32.zip") progress = MDProgressLoader( url_on_image=link, path_to_file=os.path.join(self.directory, "python-3.5.1.zip"), download_complete=self.download_complete, download_hide=self.download_progress_hide, ) progress.start(self.data["Download File"]["object"].ids.box_flt) else: toast("Connect error!") def download_complete(self): self.set_chevron_back_screen() toast("Done") def file_manager_open(self): from kivymd.uix.filemanager import MDFileManager from kivymd.uix.dialog import MDDialog def open_file_manager(text_item, dialog): previous = False if text_item == "List" else True self.manager = ModalView(size_hint=(1, 1), auto_dismiss=False) self.file_manager = MDFileManager( exit_manager=self.exit_manager, select_path=self.select_path, previous=previous, ) self.manager.add_widget(self.file_manager) self.file_manager.show(self.user_data_dir) self.manager_open = True self.manager.open() MDDialog( title="Title", size_hint=(0.8, 0.4), text_button_ok="List", text="Open manager with 'list' or 'previous' mode?", text_button_cancel="Previous", events_callback=open_file_manager, ).open() def select_path(self, path): """It will be called when you click on the file name or the catalog selection button. :type path: str; :param path: path to the selected directory or file; """ self.exit_manager() toast(path) def exit_manager(self, *args): """Called when the user reaches the root of the directory tree.""" self.manager.dismiss() self.manager_open = False self.set_chevron_menu() def set_chevron_menu(self): self.main_widget.ids.toolbar.left_action_items = [[ "menu", lambda x: self.root.toggle_nav_drawer() ]] def events(self, instance, keyboard, keycode, text, modifiers): """Called when buttons are pressed on the mobile device.""" if keyboard in (1001, 27): if self.manager_open: self.file_manager.back() return True def callback_for_menu_items(self, *args): toast(args[0]) def add_cards(self, instance_grid_card): """Adds MDCardPost objects to the screen Cards when the screen is open.""" from kivymd.uix.card import MDCardPost def callback(instance, value): if value is None: toast("Delete post %s" % str(instance)) elif isinstance(value, int): toast("Set like in %d stars" % value) elif isinstance(value, str): toast("Repost with %s " % value) elif isinstance(value, list): toast(value[1]) if not self.cards_created: self.cards_created = True menu_items = [{ "viewclass": "MDMenuItem", "text": "Example item %d" % i, "callback": self.callback_for_menu_items, } for i in range(2)] buttons = ["facebook", "vk", "twitter"] instance_grid_card.add_widget( MDCardPost(text_post="Card with text", swipe=True, callback=callback)) instance_grid_card.add_widget( MDCardPost( right_menu=menu_items, swipe=True, text_post="Card with a button to open the menu MDDropDown", callback=callback, )) instance_grid_card.add_widget( MDCardPost( likes_stars=True, callback=callback, swipe=True, text_post="Card with asterisks for voting.", )) image_for_card = ( f"{demos_assets_path}kitten-for_card-1049129_1280-crop.png") if not os.path.exists(image_for_card): crop_image( (int(Window.width), int(dp(200))), f"{demos_assets_path}kitten-1049129_1280.png", image_for_card, ) instance_grid_card.add_widget( MDCardPost( source=image_for_card, tile_text="Little Baby", tile_font_style="H5", text_post="This is my favorite cat. He's only six months " "old. He loves milk and steals sausages :) " "And he likes to play in the garden.", with_image=True, swipe=True, callback=callback, buttons=buttons, )) def update_screen(self, instance): """Set new label on the screen UpdateSpinner.""" def update_screen(interval): self.tick += 1 if self.tick > 2: instance.update = True self.tick = 0 self.data["Update Screen Widget"][ "object"].ids.upd_lbl.text = "New string" Clock.unschedule(update_screen) Clock.schedule_interval(update_screen, 1) main_widget = None def build(self): self.main_widget = Builder.load_string(main_widget_kv) return self.main_widget def show_popup_screen(self): if not self.popup_screen: self.popup_screen = self.data["Popup Screen"]["object"].ids.popup content_screen = ContentForPopupScreen() self.popup_screen.screen = content_screen self.popup_screen.padding = dp(10) self.popup_screen.background_color = self.theme_cls.primary_color self.popup_screen.show() def show_user_example_animation_card(self): """Create and open instance MDUserAnimationCard for the screen UserCard.""" from kivymd.uix.useranimationcard import MDUserAnimationCard def main_back_callback(): toast("Close card") if not self.user_card: image_for_user_card = ( f"{demos_assets_path}guitar-for-user-card1139397_1280-crop.png" ) if not os.path.exists(image_for_user_card): crop_image( (int(Window.width), int(dp(Window.height * 40 // 100))), f"{demos_assets_path}guitar-1139397_1280.png", image_for_user_card, ) self.user_card = MDUserAnimationCard( user_name="Lion Lion", path_to_avatar=image_for_user_card, callback=main_back_callback, ) self.user_card.box_content.add_widget(ContentForAnimCard()) self.user_card.open() def show_example_snackbar(self, snack_type): """Create and show instance Snackbar for the screen MySnackBar.""" def callback(instance): toast(instance.text) def wait_interval(interval): self._interval += interval if self._interval > self.my_snackbar.duration: anim = Animation(y=dp(10), d=0.2) anim.start(self.data["Snackbars"]["object"].ids.button) Clock.unschedule(wait_interval) self._interval = 0 self.my_snackbar = None from kivymd.uix.snackbar import Snackbar if snack_type == "simple": Snackbar(text="This is a snackbar!").show() elif snack_type == "button": Snackbar( text="This is a snackbar", button_text="WITH A BUTTON", button_callback=callback, ).show() elif snack_type == "verylong": Snackbar(text="This is a very very very very very very very " "long snackbar!").show() elif snack_type == "float": if not self.my_snackbar: self.my_snackbar = Snackbar( text="This is a snackbar!", button_text="Button", duration=3, button_callback=callback, ) self.my_snackbar.show() anim = Animation(y=dp(72), d=0.2) anim.bind(on_complete=lambda *args: Clock.schedule_interval( wait_interval, 0)) anim.start(self.data["Snackbars"]["object"].ids.button) def show_example_input_dialog(self): """Creates an instance of the dialog box and displays it on the screen for the screen Dialogs.""" def result(text_button, instance): toast(instance.text_field.text) if not self.input_dialog: from kivymd.uix.dialog import MDInputDialog self.input_dialog = MDInputDialog( title="Title", hint_text="Hint text", size_hint=(0.8, 0.4), text_button_ok="Ok", events_callback=result, ) self.input_dialog.open() def show_example_alert_dialog(self): if not self.alert_dialog: from kivymd.uix.dialog import MDDialog self.alert_dialog = MDDialog( title="Title", size_hint=(0.8, 0.4), text_button_ok="Ok", text="This is Alert dialog", events_callback=self.callback_for_menu_items, ) self.alert_dialog.open() def show_example_ok_cancel_dialog(self): if not self.ok_cancel_dialog: from kivymd.uix.dialog import MDDialog self.ok_cancel_dialog = MDDialog( title="Title", size_hint=(0.8, 0.4), text_button_ok="Ok", text="This is Ok Cancel dialog", text_button_cancel="Cancel", events_callback=self.callback_for_menu_items, ) self.ok_cancel_dialog.open() def show_example_long_dialog(self): if not self.long_dialog: from kivymd.uix.dialog import MDDialog self.long_dialog = MDDialog( text="Lorem ipsum dolor sit amet, consectetur adipiscing " "elit, sed do eiusmod tempor incididunt ut labore et " "dolore magna aliqua. Ut enim ad minim veniam, quis " "nostrud exercitation ullamco laboris nisi ut aliquip " "ex ea commodo consequat. Duis aute irure dolor in " "reprehenderit in voluptate velit esse cillum dolore eu " "fugiat nulla pariatur. Excepteur sint occaecat " "cupidatat non proident, sunt in culpa qui officia " "deserunt mollit anim id est laborum.", title="Title", size_hint=(0.8, 0.4), text_button_ok="Yes", events_callback=self.callback_for_menu_items, ) self.long_dialog.open() def get_time_picker_date(self, time): """Get date for MDTimePicker from the screen Pickers.""" self.data["Pickers"]["object"].ids.time_picker_label.text = str(time) self.previous_time = time def show_example_time_picker(self): """Show MDTimePicker from the screen Pickers.""" from kivymd.uix.picker import MDTimePicker time_dialog = MDTimePicker(self.get_time_picker_date) if self.data["Pickers"][ "object"].ids.time_picker_use_previous_time.active: try: time_dialog.set_time(self.previous_time) except AttributeError: pass time_dialog.open() def set_previous_date(self, date_obj): """Set previous date for MDDatePicker from the screen Pickers.""" self.previous_date = date_obj self.data["Pickers"]["object"].ids.date_picker_label.text = str( date_obj) def show_example_date_picker(self): """Show MDDatePicker from the screen Pickers.""" from kivymd.uix.picker import MDDatePicker if self.data["Pickers"][ "object"].ids.date_picker_use_previous_date.active: pd = self.previous_date try: MDDatePicker(self.set_previous_date, pd.year, pd.month, pd.day).open() except AttributeError: MDDatePicker(self.set_previous_date).open() else: MDDatePicker(self.set_previous_date).open() def show_example_bottom_sheet(self): """Show menu from the screen BottomSheet.""" from kivymd.uix.bottomsheet import MDListBottomSheet if not self.bs_menu_1: self.bs_menu_1 = MDListBottomSheet() self.bs_menu_1.add_item( "Here's an item with text only", lambda x: self.callback_for_menu_items( "Here's an item with text only"), ) self.bs_menu_1.add_item( "Here's an item with an icon", lambda x: self.callback_for_menu_items( "Here's an item with an icon"), icon="clipboard-account", ) self.bs_menu_1.add_item( "Here's another!", lambda x: self.callback_for_menu_items("Here's another!"), icon="nfc", ) self.bs_menu_1.open() def show_example_grid_bottom_sheet(self): """Show menu from the screen BottomSheet.""" if not self.bs_menu_2: from kivymd.uix.bottomsheet import MDGridBottomSheet self.bs_menu_2 = MDGridBottomSheet() self.bs_menu_2.add_item( "Facebook", lambda x: self.callback_for_menu_items("Facebook"), icon_src="./assets/facebook-box.png", ) self.bs_menu_2.add_item( "YouTube", lambda x: self.callback_for_menu_items("YouTube"), icon_src="./assets/youtube-play.png", ) self.bs_menu_2.add_item( "Twitter", lambda x: self.callback_for_menu_items("Twitter"), icon_src="./assets/twitter.png", ) self.bs_menu_2.add_item( "Da Cloud", lambda x: self.callback_for_menu_items("Da Cloud"), icon_src="./assets/cloud-upload.png", ) self.bs_menu_2.add_item( "Camera", lambda x: self.callback_for_menu_items("Camera"), icon_src="./assets/camera.png", ) self.bs_menu_2.open() def set_title_toolbar(self, title): """Set string title in MDToolbar for the whole application.""" self.main_widget.ids.toolbar.title = title def set_appbar(self): """Create MDBottomAppBar for the screen BottomAppBar.""" from kivymd.uix.toolbar import MDBottomAppBar def press_button(inctance): toast("Press Button") self.md_app_bar = MDBottomAppBar( md_bg_color=self.theme_cls.primary_color, left_action_items=[ ["menu", lambda x: x], ["clock", lambda x: x], ["dots-vertical", lambda x: x], ], anchor="right", callback=press_button, ) def move_item_menu(self, anchor): """Sets icons in MDBottomAppBar for the screen BottomAppBar.""" md_app_bar = self.md_app_bar if md_app_bar.anchor != anchor: if len(md_app_bar.right_action_items): md_app_bar.left_action_items.append( md_app_bar.right_action_items[0]) md_app_bar.right_action_items = [] else: left_action_items = md_app_bar.left_action_items action_items = left_action_items[0:2] md_app_bar.right_action_items = [left_action_items[-1]] md_app_bar.left_action_items = action_items def show_password(self, field, button): """ Called when you press the right button in the password field for the screen TextFields. instance_field: kivy.uix.textinput.TextInput; instance_button: kivymd.button.MDIconButton; """ # Show or hide text of password, set focus field # and set icon of right button. field.password = not field.password field.focus = True button.icon = "eye" if button.icon == "eye-off" else "eye-off" def set_error_message(self, *args): """Checks text of TextField with type "on_error" for the screen TextFields.""" text_field_error = args[0] if len(text_field_error.text) == 2: text_field_error.error = True else: text_field_error.error = False def set_list_md_icons(self, text="", search=False): """Builds a list of icons for the screen MDIcons.""" def add_icon_item(name_icon): self.main_widget.ids.scr_mngr.get_screen( "md icons").ids.rv.data.append({ "viewclass": "MDIconItemForMdIconsList", "icon": name_icon, "text": name_icon, "callback": self.callback_for_menu_items, }) self.main_widget.ids.scr_mngr.get_screen("md icons").ids.rv.data = [] for name_icon in md_icons.keys(): if search: if text in name_icon: add_icon_item(name_icon) else: add_icon_item(name_icon) def set_source_code_file(self): """Assigns the file_source_code attribute the file name with example code for the current screen.""" if self.main_widget.ids.scr_mngr.current == "code viewer": return has_screen = False for name_item_drawer in self.data.keys(): if (self.data[name_item_drawer]["name_screen"] == self.main_widget.ids.scr_mngr.current): self.file_source_code = self.data[name_item_drawer].get( "source_code", None) has_screen = True break if not has_screen: self.file_source_code = None def open_context_menu_source_code(self, instance): def callback_context_menu(icon): context_menu.dismiss() if not self.file_source_code: from kivymd.uix.snackbar import Snackbar Snackbar(text="No source code for this example").show() return if icon == "source-repository": if platform in ("win", "linux", "macosx"): webbrowser.open( f"https://github.com/HeaTTheatR/KivyMD/wiki/" f"{os.path.splitext(self.file_source_code)[0]}") return elif icon == "language-python": self.main_widget.ids.scr_mngr.current = "code viewer" if self.file_source_code: with open( f"{self.directory}/KivyMD.wiki/{self.file_source_code}" ) as source_code: self.data["Source code"][ "object"].ids.code_input.text = source_code.read() menu_for_context_menu_source_code = [] data = { "Source code": "language-python", "Open in Wiki": "source-repository", } if self.main_widget.ids.scr_mngr.current == "code viewer": data = {"Open in Wiki": "source-repository"} for name_item in data.keys(): menu_for_context_menu_source_code.append({ "viewclass": "MDIconItemForMdIconsList", "text": name_item, "icon": data[name_item], "text_color": [1, 1, 1, 1], "callback": lambda x=name_item: callback_context_menu(x), }) context_menu = MDDropdownMenu( items=menu_for_context_menu_source_code, max_height=dp(260), width_mult=3, ) context_menu.open(instance.ids.right_actions.children[0]) def open_menu_for_demo_apps(self, instance): """ Called when you click the "Click me" button on the start screen. Creates and opens a list of demo applications. :type instance: <kivymd.uix.button.MDRaisedButton object> """ if not self.instance_menu_demo_apps: menu_for_demo_apps = [] for name_item in self.demo_apps_list: menu_for_demo_apps.append({ "viewclass": "OneLineListItem", "text": name_item, "on_release": lambda x=name_item: self.show_demo_apps(x), }) self.instance_menu_demo_apps = MDDropdownMenu( items=menu_for_demo_apps, max_height=dp(260), width_mult=4, _center=True, ) self.instance_menu_demo_apps.open(instance) def show_demo_apps(self, name_item): self.show_screens_demo(name_item) self.main_widget.ids.scr_mngr.current = name_item.lower() self.instance_menu_demo_apps.dismiss() def on_pause(self): return True def on_start(self): def _load_kv_for_demo(name_screen): from demo_apps.formone import FormOne from demo_apps.shopwindow import ShopWindow from demo_apps.coffeemenu import CoffeeMenu from demo_apps.fitnessclub import FitnessClub from demo_apps.accountpage import AccountPage Builder.load_string(self.data_for_demo[name_screen]["kv_string"]) self.data_for_demo[name_screen]["object"] = eval( self.data_for_demo[name_screen]["class"]) self.main_widget.ids.scr_mngr.add_widget( self.data_for_demo[name_screen]["object"]) async def load_all_kv_files(): for name_screen in self.data.keys(): await asynckivy.sleep(0) self.dialog_load_kv_files.name_kv_file = name_screen Builder.load_string(self.data[name_screen]["kv_string"]) self.data[name_screen]["object"] = eval( self.data[name_screen]["Factory"]) if name_screen == "Bottom App Bar": self.set_appbar() self.data[name_screen]["object"].add_widget( self.md_app_bar) self.main_widget.ids.scr_mngr.add_widget( self.data[name_screen]["object"]) if name_screen == "Text fields": self.data[name_screen]["object"].ids.text_field_error.bind( on_text_validate=self.set_error_message, on_focus=self.set_error_message, ) elif name_screen == "MD Icons": self.set_list_md_icons() elif name_screen == "Tabs": self.build_tabs() elif name_screen == "Refresh Layout": self.set_list_for_refresh_layout() from demo_apps.formone import registration_form_one from demo_apps.shopwindow import screen_shop_window from demo_apps.coffeemenu import screen_coffee_menu from demo_apps.fitnessclub import screen_fitness_club from demo_apps.accountpage import screen_account_page data = { "Registration": registration_form_one, "Shop Window": screen_shop_window, "Coffee Menu": screen_coffee_menu, "Fitness Club": screen_fitness_club, "Account Page": screen_account_page, } for name_screen in data.keys(): await asynckivy.sleep(0) self.dialog_load_kv_files.name_kv_file = name_screen self.data_for_demo[name_screen]["kv_string"] = data[ name_screen] _load_kv_for_demo(name_screen) self.dialog_load_kv_files.dismiss() self.dialog_load_kv_files = DialogLoadKvFiles() self.dialog_load_kv_files.open() asynckivy.start(load_all_kv_files()) def on_stop(self): pass def open_settings(self, *args): return False
class SettingsWindow(Screen): def load_settings_page(self): ContentNavigationDrawer.populateNavDrawerValues(self) query = f'''SELECT CONTACT_ID, EMAIL FROM CONTACT WHERE CONTACT_ID={globalvariables.var_userid} ''' # run direct SQL stmt = ibm_db.exec_immediate(connection.conn, query) contact = ibm_db.fetch_both(stmt) print(globalvariables.var_email) self.ids['uname'].text = globalvariables.var_email def update_settings(self, uname, pwd1, pwd2): email = uname.text pwd1 = pwd1.text pwd2 = pwd2.text regex = '^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$' valid_str = "" if globalvariables.var_email != email: if email == "": valid_str = "Email is blank" if re.search(regex, email) is None: valid_str = "Email is not valid" if pwd1 != None: if pwd1 != pwd2: valid_str = "Passwords not matching" if valid_str != "": ok_button = MDFlatButton(text='OK', on_release=self.dialog_close) self.dialog = MDDialog(title='Alert !', text=valid_str, size_hint=(0.7, 1), buttons=[ok_button]) self.dialog.open() else: if globalvariables.var_email != email: query = f'''UPDATE CONTACT SET EMAIL='{email}' WHERE CONTACT_ID={globalvariables.var_userid} ''' # run direct SQL stmt = ibm_db.exec_immediate(connection.conn, query) email_change_mail(globalvariables.var_email, globalvariables.var_fname) globalvariables.var_email = email self.ids['uname'].text = globalvariables.var_email if pwd1 != "": encrypted_pwd = encrypt_pwd(pwd1) query = f'''UPDATE CONTACT SET PASSCODE={repr(encrypted_pwd)} WHERE CONTACT_ID={globalvariables.var_userid} ''' # run direct SQL stmt = ibm_db.exec_immediate(connection.conn, query) password_change_mail(globalvariables.var_email, globalvariables.var_fname) self.ids['pwd1'].text = "" self.ids['pwd2'].text = "" if globalvariables.var_img_path != "": img_path = globalvariables.var_img_path img_tgt_name = str(globalvariables.var_userid) + ".png" upload_contact_image(img_path, img_tgt_name) globalvariables.var_img_path = "" ContentNavigationDrawer.populateNavDrawerValues(self) self.snackbar = Snackbar(text="Profile Updated!") self.snackbar.show() def dialog_close(self, obj): self.dialog.dismiss()
class MyPaintWidget(Widget): drawing_mode_select_btn = ObjectProperty() down_current_color_label = ObjectProperty() down_current_line_width = ObjectProperty() down_current_nums_of_lines = ObjectProperty() down_current_icon = ObjectProperty() top_toolbox = ObjectProperty() down_toolbox = ObjectProperty() minimize_btn = ObjectProperty() undolist = [] # list of cancelled lines lineslist = [] # list of drawing lines drawing = False # settings DRAWING_MODE = 'radian' NUMBER_OF_LINES = 15 LINE_WIDTH = 1 COLOR = (.32, .5, 1, 1) BACKGROUND_COLOR = ListProperty([0, 0, 0, 1]) CENTER_COLOR = ListProperty([.5, .5, .5, 1]) IS_LINE_CLOSE = False TEXTURE = GRADIENT_DATA_BRIGHTER BLUUR_SIZE = NumericProperty(0.1) PIXEL_SIZE = NumericProperty(1) def __init__(self, **kwargs): super().__init__(**kwargs) self.size = Window.size self.size_hint = None, None self.create_color_popup() self.create_settings_popup() self.create_number_of_lines_dropdown() self.create_drawing_mode_dropdown() self.create_lines_width_dropdown() self.init_animations() self.create_snackbars() self.init_texture() def init_texture(self): '''create texture for lines''' self.tex = Texture.create(size=(1, 64), colorfmt='rgb', bufferfmt='ubyte') self.tex.blit_buffer(self.TEXTURE, colorfmt='rgb') def create_snackbars(self): '''Snackbars with saving info''' self.snackbar_success = Snackbar(text='Successful saving!') self.snackbar_error = Snackbar() def init_animations(self): '''create tollbox minimize animations''' self.minimize_btn_anim = Animation(pos_hint={ 'x': .85, 'y': .01 }, t='in_out_back', duration=.15) self.maximize_btn_anim = Animation(pos_hint={ 'x': .85, 'y': .06 }, t='in_out_back', duration=.15) self.maximize_top_toolbox_anim = Animation(pos_hint={ 'x': 0, 'y': 0.9 }, t='in_circ', duration=.1) self.minimize_top_tollbox_anim = Animation(pos_hint={ 'x': 0, 'y': 1 }, t='in_circ', duration=.1) self.maximize_down_tollbox_anim = Animation(pos_hint={ 'x': 0, 'y': 0 }, t='in_circ', duration=.1) self.minimize_down_tollbox_anim = Animation(pos_hint={ 'x': 0, 'y': -0.1 }, t='in_circ', duration=.1) def minimize_maximize_toolboxes(self, current): if current == 'arrow-down': # minimize self.minimize_top_tollbox_anim.start(self.top_toolbox) self.minimize_down_tollbox_anim.start(self.down_toolbox) self.minimize_btn.icon = 'arrow-up' self.minimize_btn_anim.start(self.minimize_btn) elif current == 'arrow-up': # maximize self.maximize_top_toolbox_anim.start(self.top_toolbox) self.maximize_down_tollbox_anim.start(self.down_toolbox) self.minimize_btn.icon = 'arrow-down' self.maximize_btn_anim.start(self.minimize_btn) #-----------------------# #-Settings Popup window-# #-----------------------# def create_settings_popup(self): '''Creating a drawing settings window''' self.settings_popup = SettingsPopup(self) def open_settings_popup(self): '''open popup window''' self.settings_popup.open() #---------------------# #------DropDowns------# #---------------------# def create_drawing_mode_dropdown(self): '''creating a menu for switching drawing modes''' self.dropdown_drawing_mode = CustomDropDownDrawingMode() self.dropdown_drawing_mode.bind( on_select=lambda instance, x: self.drawing_mode_custom_setattr( x[0], x[1])) def create_number_of_lines_dropdown(self): self.number_of_lines_dropdown = CustomDropDownNumberOfLines( self.NUMBER_OF_LINES, self) def create_lines_width_dropdown(self): self.line_width_dropdown = CustomDropDownLineWidth( self.LINE_WIDTH, self) # set down values def set_line_width(self, value): self.LINE_WIDTH = value self.down_current_line_width.text = f'Width\n{value}' def set_number_of_lines(self, value): self.NUMBER_OF_LINES = value self.down_current_nums_of_lines.text = f'Lines\n{value}' def drawing_mode_custom_setattr(self, mode, icon): '''setting the current drawing mode and icon''' setattr(self.down_current_icon, 'icon', icon) self.DRAWING_MODE = mode #--------------------# #-Color Popup window-# #--------------------# def create_color_popup(self): self.color_popup = MyPopup() self.color_popup.title = 'Colors' bxl = BoxLayout(orientation='vertical', padding=25) clr_picker = ColorPicker(color=self.COLOR) clr_picker.bind(color=self.on_color) bxl.add_widget(clr_picker) self.random_color_select = MDSwitch() radmcolrbx = BoxLayout(size_hint=(1, .15)) radmcolrbx.add_widget(Label(text='Use random colors:')) radmcolrbx.add_widget(self.random_color_select) bxl.add_widget(radmcolrbx) bxl.add_widget( MDRectangleFlatButton( text="Close", size_hint=(1, .1), on_release=lambda btn: self.color_popup.dismiss())) self.color_popup.add_widget(bxl) def open_color_popup(self): self.color_popup.open() def on_color(self, instance, value): self.COLOR = value self.down_current_color_label.canvas.children[3] = Color(*value) #-------------------# #-DRAWING FUNCTIONS-# #-------------------# def on_touch_up(self, touch): '''disabling drawing''' self.drawing = False # protection against memory overuse if len(self.undolist) > 5: self.undolist = self.undolist[len(self.undolist) - 5:] if len(self.lineslist) > 5: self.lineslist = self.lineslist[len(self.lineslist) - 5:] def on_touch_move(self, touch): '''drawing''' def vector_length(coords, center): return math.sqrt((coords[0] - center[0])**2 + (coords[1] - center[1])**2) if self.drawing: # Continue drawing line if self.DRAWING_MODE == 'simple': self.obj.children[-1].points += touch.pos elif self.DRAWING_MODE == 'symmetric': self.obj.children[-1].points += touch.pos self.obj.children[-3].points += (Window.size[0] - touch.pos[0], touch.pos[1]) elif self.DRAWING_MODE == 'square': self.obj.children[-1].points += touch.pos self.obj.children[-3].points += (touch.pos[0], Window.size[1] - touch.pos[1]) self.obj.children[-5].points += (Window.size[0] - touch.pos[0], touch.pos[1]) self.obj.children[-7].points += (Window.size[0] - touch.pos[0], Window.size[1] - touch.pos[1]) elif self.DRAWING_MODE == 'radian' or self.DRAWING_MODE == 'radian-symmetric': center = (Window.size[0] // 2, Window.size[1] // 2) dx = touch.pos[0] - center[0] dy = touch.pos[1] - center[1] vector = vector_length(touch.pos, center) if dx != 0: angle = 360 / self.NUMBER_OF_LINES alpha_radian = math.atan(dy / dx) alpha_degree = alpha_radian * 180 / math.pi if dx < 0: alpha_degree = 180 + alpha_degree self.obj.children[-1].points += touch.pos line_number = -3 for i in range(1, self.NUMBER_OF_LINES): self.obj.children[line_number].points += ( center[0] + vector * math.cos(math.radians(alpha_degree + (angle * i))), center[1] + vector * math.sin(math.radians(alpha_degree + (angle * i)))) line_number -= 2 if self.DRAWING_MODE == 'radian-symmetric': for i in range(0, self.NUMBER_OF_LINES): self.obj.children[line_number].points += ( center[0] - vector * math.cos( math.radians(alpha_degree + (angle * i - 45))), center[1] + vector * math.sin( math.radians(alpha_degree + (angle * i - 45)))) line_number -= 2 else: # Start drawing line self.drawing = True self.obj = InstructionGroup() if self.random_color_select.active: self.on_color( None, (random.random(), random.random(), random.random(), 1)) self.obj.add(Color(*self.COLOR)) lines = { 'simple': 1, 'symmetric': 2, 'square': 4, 'radian': self.NUMBER_OF_LINES, 'radian-symmetric': self.NUMBER_OF_LINES * 2 } for _ in range(lines[self.DRAWING_MODE]): self.obj.add( Line(width=self.LINE_WIDTH, close=self.IS_LINE_CLOSE, texture=self.tex)) self.lineslist.append(self.obj) self.canvas.add(self.obj) #------------------# #-SYSTEM FUNCTIONS-# #------------------# def undo(self): '''delete last line''' if self.lineslist: item = self.lineslist.pop(-1) self.undolist.append(item) self.canvas.remove(item) def redo(self): '''return last line''' if self.undolist: item = self.undolist.pop(-1) self.lineslist.append(item) self.canvas.add(item) def clear_canvas(self): self.canvas.clear() self.undolist = [] self.lineslist = [] def save_canvas(self): name = f'Art{datetime.date.today()}-{random.randint(1,100000)}.png' try: if ANDROID: directory = os.path.join('/sdcard', 'RadianMirrorApp') if not os.path.exists(directory): os.makedirs(directory) self.parent.export_to_png(os.path.join(directory, name)) else: self.parent.export_to_png(name) self.snackbar_success.show() except Exception as err: self.snackbar_error.text = f'Error: "{err}"' self.snackbar_error.show()
class Application(MDApp): def __init__(self, **kwargs): super().__init__(**kwargs) # Läd .kv Datei # https://kivy.org/doc/stable/api-kivy.lang.builder.html?highlight=builder# für mehr Info self.kv = Builder.load_file("KV.kv") self.filtered = True self.running_processes, self.stopped_processes = self.get_processes(False) self.tracking = False # Snackbar Objekt # https://kivymd.readthedocs.io/en/0.104.0/components/snackbar/index.html für mehr Info self.snack1 = Snackbar(text="Select applications to track") self.snack2 = Snackbar(text="Turn off tracking to select/deselect applications") self.processes_objs_list = [] self.processes_names_dict = {} # build() wird nach __init__() zum Programmstart ausgeführt def build(self): # Icons werden nicht angezeigt # Das Popup Menu ist hässlig formatiert, ich kriegs aber einfach nicht besser hin :( menu_items = [ { "viewclass": "OneLineListItem", "icon": "filter-outline", "text": "Filtered" }, { "viewclass": "OneLineListItem", "icon": "format-list-bulleted", "text": "Everything" }] # Position des Symbols in Toolbar wird nicht aktualisiert, wenn die Fenstergröße verstellt wird --> fix # Dropdown Menü Objekt # https://kivymd.readthedocs.io/en/0.104.0/components/dropdown-item/index.html für mehr Info self.filter_menu = MDDropdownMenu(items=menu_items, width_mult=3.5, caller=self.kv.ids.toolbar.children[0], callback=self.filter_menu_close) return self.kv # on_start wird nach build() zum Programmstart ausgeführt def on_start(self): self.create_list() # Für jeden laufenden Process wird ein Listenobjekt erstellt def create_list(self) -> None: self.processes_objs_list = [] for c, i in enumerate(self.running_processes): # Läd String im .kv Format item = Builder.load_string(LIST_ITEM) item.text = i self.processes_objs_list.append(item) self.processes_names_dict[i] = False # Objekt wird mit ID gesucht und zum Renderer hinzugefügt self.root.ids.processes.add_widget(self.processes_objs_list[c]) # Gibt zwei Dictionaries zurück, die alle zur Zeit laufenden und gestoppten Prozesse beinhalten # key --> name # value --> pid def get_processes(self, force_unfiltered_processes) -> dict: # Das hier muss weg! if force_unfiltered_processes: self.filtered = False running_processes = {} stopped_processes = {} # Geht hier bitte nochmal drüber. Ich hab lediglich geschätzt was Windows sein könnte und was nicht # Liste an Prozessen die rausgefiltert werden windows_processes = ["System Idle Process", "System", "RuntimeBroker.exe", "Registry", "svchost.exe", "smss.exe", "lsass.exe", "services.exe", "csrss.exe", "fontdrvhost.exe", "wininit.exe", "AppVShNotify.exe", "MemCompression", "powershell.exe", "UserOOBEBroker.exe", "spoolsv.exe", "RtkAudUService64.exe", "MoUsoCoreWorker.exe", "nvcontainer.exe", "SafeConnect.ServiceHost.exe", "MsMpEng.exe", "SgrmBroker.exe", "dasHost.exe", "sihost.exe", "NisSrv.exe", "CompPkgSrv.exe", "GoogleCrashHandler.exe", "GoogleCrashHandler64.exe", "taskhostw.exe", "YourPhoneServer.exe", "dllhost.exe", "conhost.exe", "SearchIndexer.exe", "dwm.exe", "McCSPServiceHost.exe", "SecurityHealthService.exe", "SettingSyncHost.exe", "ctfmon.exe", "StartMenuExperienceHost.exe", "nvsphelper64.exe", "SearchProtocolHost.exe", "SearchFilterHost.exe", "winlogon.exe", "audiodg.exe", "SecurityHealthSystray.exe", "SystemSettingsBroker.exe", "ApplicationFrameHost.exe", "TextInputHost.exe", "WmiPrvSE.exe"] # Iteriert durch alle laufenden Prozesse # Wenn self.filter == True --> werden nur die Prozesse angezeigt, die nicht in windows_processes sind # self.filter wird in __init__() deklariert und in filter_menu_close() verändert for process in psu.process_iter(): if not self.filtered or not process.name() in windows_processes: if process.status() == "running": # unnötige .exe Endung wird vom Anwendungsnamen entfernen name = process.name().split(".exe")[0] running_processes[name] = process.pid elif process.status() == "stopped": name = process.name().split(".exe")[0] stopped_processes[name] = process.pid return running_processes, stopped_processes # Der For-Loop hier funktioniert, ist aber ziemlich ineffizient --> bessere Lösung? # Vielleicht sollte dieses System auch generell nochmal überholt werden # Wird aufgerufen wenn ein Listenobjekt gedrückt wird # Ändert Symbol des Listenobjekts und setzt ausgewählten Prozess in Dict auf True def select_item(self, instance, position) -> None: # Schaut ob Tracking bereits läuft if not self.tracking: # Überprüft durch extra Parameter welches Objekt die Funktion aufgerufen hat # Je nach instance wird entweder Eltern Objekt oder Kind Objekt für Symbol oder Text Änderungen verwendet if position == "IconLeftWidget": for i in self.processes_objs_list: if i.text == instance.parent.parent.text: if instance.icon == "checkbox-blank-outline": instance.icon = "checkbox-marked-outline" self.processes_names_dict[i.text] = True elif instance.icon == "checkbox-marked-outline": instance.icon = "checkbox-blank-outline" self.processes_names_dict[i.text] = False elif position == "OneLineIconListItem": for i in self.processes_objs_list: if i.text == instance.text: if instance.children[0].children[0].icon == "checkbox-blank-outline": instance.children[0].children[0].icon = "checkbox-marked-outline" self.processes_names_dict[i.text] = True elif instance.children[0].children[0].icon == "checkbox-marked-outline": instance.children[0].children[0].icon = "checkbox-blank-outline" self.processes_names_dict[i.text] = False # Wenn Tracking läuft, wird Fehlermeldung über Snackbar angezeigt # https://kivymd.readthedocs.io/en/0.104.0/components/snackbar/index.html für mehr Info else: try: self.snack2.show() # Bringt Ausnahme hervor, wenn die Snackbar bereits angezeigt wird except WidgetException: pass # Wird ausgeführt wenn der Start Knopf gedrückt wird # Ändert Symbol und Farbe des Knopfes, sowie eine boolean def activate_tracking(self, instance): block_action = True # Wenn keins der Listenobjekte ausgewählt wurde, wird eine Snackbar mit Warnung angezeigt, # Sowie die weiteren Änderungen übersprungen for i in self.processes_names_dict: if self.processes_names_dict[i]: block_action = False break else: block_action = True # Snackbar # https://kivymd.readthedocs.io/en/0.104.0/components/snackbar/index.html für mehr Info try: self.snack1.show() # Bringt Ausnahme hervor, wenn die Snackbar bereits angezeigt wird except WidgetException: pass if not block_action: # Überprüft anhand der Farbe des Knopfes, ob Tracking läuft oder nicht # Das ist etwas gay, funktioniert aber if instance.md_bg_color == self.theme_cls.primary_color: # boolean = True self.tracking = True # Symbol des Knopfes ändern instance.icon = "stop" # Farbe des Knopfes ändern (prozentualer rbga Wert als Dezimalzahl) instance.md_bg_color = (.79, .22, .29, 1) # --> Rot else: # boolean = False self.tracking = False # Symbol des Knopfes ändern instance.icon = "play" # Farbe des Knopfes ändern (standard Farbe) instance.md_bg_color = self.theme_cls.primary_color # --> Blau # Läd die Liste an Prozessen neu def refresh_processes_list(self): self.root.ids.processes.clear_widgets() self.running_processes, self.stopped_processes = self.get_processes(False) self.create_list() # Schließt Dropdown Menü und setzt eine bool auf True oder False def filter_menu_close(self, instance): if instance.text == "Filtered": self.filtered = True self.refresh_processes_list() elif instance.text == "Everything": self.filtered = False self.refresh_processes_list() # MDDropdownMenu.dismiss() schließt das Dropdown Menü # https://kivymd.readthedocs.io/en/0.104.0/components/dropdown-item/index.html für mehr Info self.filter_menu.dismiss()
def exportarPDF(self): # SE DEBE BUSCAR LA FORMA DE HACERLO GENÉRICO """ import json import requests headers = { "Authorization": "Bearer ya29.a0AfH6SMDhLxJscYf1Cm4vYtjbKSPdHHIeNH3kuelzz6BgQtDk-sobO5Dzw7FwYrGf17vaKIR_qoKChEYXzc9In5lJVoTTAY5yfXdZdFxZdQ6jkZ2lcr2B6N36s5kihOV5xKjZUR5Kdsk39beA0vx7yTisCP3ulOf8fquyUugdXt0"} para = { "name": "ReporteGastos.pdf", } files = { 'data': ('metadata', json.dumps(para), 'application/json; charset=UTF-8'), 'file': open("./ReporteGastos.pdf", "rb") } r = requests.post( "https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart", headers=headers, files=files ) print(r.text) """ gauth = GoogleAuth() # Try to load saved client credentials gauth.LoadCredentialsFile("mycreds.txt") if gauth.credentials is None: # Authenticate if they're not there gauth.LocalWebserverAuth() elif gauth.access_token_expired: # Refresh them if expired gauth.Refresh() else: # Initialize the saved creds gauth.Authorize() # Save the current credentials to a file gauth.SaveCredentialsFile("mycreds.txt") drive = GoogleDrive(gauth) folderName = "App Inventario" # folder = drive.CreateFile({'title' : folderName, 'mimeType' : 'application/vnd.google-apps.folder'}) # folder.Upload() fileList = drive.ListFile({ 'q': "'root' in parents and trashed=false" }).GetList() contador = 0 if len(fileList) == 0: # No hay archivos print("No hay ningun archivo, creando el folder") folder = drive.CreateFile({ 'title': folderName, 'mimeType': 'application/vnd.google-apps.folder' }) folder.Upload() contador = -1 for file in fileList: # haciendo un for para comprobar los archivos # print('Title: %s, ID: %s' % (file['title'], file['id'])) # Get the folder ID that you want if file['title'] == folderName: print("Existe el folder necesario") contador = -1 break elif file['title'] != folderName: print("Archivo sin coincidencia") print('Title: %s, ID: %s' % (file['title'], file['id'])) contador = contador + 1 if contador == len( fileList ): # si son iguales significa que no existe carpeta de la App print("Se debe crear el archivo") folder = drive.CreateFile({ 'title': folderName, 'mimeType': 'application/vnd.google-apps.folder' }) folder.Upload() #-------Parte de actualizar arc folderName = "App Inventario" folder_id = '' # creacion archivo en un folder específico # folders = drive.ListFile( # {'q': "title='" + folderName + "' and mimeType='application/vnd.google-apps.folder' and trashed=false"}).GetList() file_list = drive.ListFile({ 'q': "'root' in parents and trashed=false" }).GetList() for file in file_list: if (file['title'] == folderName): folder_id = file['id'] break # 3) Build string dynamically (need to use escape characters to support single quote syntax) str = "\'" + folder_id + "\'" + " in parents and trashed=false" # 4) Starting iterating over files file_list = drive.ListFile({'q': str}).GetList() for file in file_list: print('title: %s, id: %s' % (file['title'], file['id'])) if file['title'] == "ReporteGastos.pdf": file.Delete() file2 = drive.CreateFile({'parents': [{'id': folder_id}]}) file2.SetContentFile('ReporteGastos.pdf') file2.Upload() # Informar que se ha subido el archivo snackbar = Snackbar( text="Se ha realizado el respaldo del Reporte en Google Drive") snackbar.show()
def show_speech_fail_snackbar(self): """ Shows snackbar that indicates the user failed to speak a word. """ snackbar = Snackbar(text="Try Saying The Word Again") snackbar.show()
class TypeToWriteScreen(Screen): try: #Data Integration selection = ListProperty([]) images = ListProperty(['img/jne.jpg', 'img/tiki.jpg', 'img/pos.jpg']) kurirs = ListProperty([ 'img/jne.jpg', 'img/tiki.jpg', 'img/pos.jpg', 'img/anteraja.png', 'img/sicepat.jpg', 'img/wahana.jpg', 'img/lion.jpg', 'img/ninja.png', 'img/jnt.jpg' ]) with open('data/date.json', 'r') as f: attempts = json.load(f) with open('data/easyversion.json', 'r') as f: data_tables = json.load(f) with open('data/data.json', 'r') as fp: data = json.load(fp) #Add Item To The List def change_image_resi(self, args): if args.lower() == 'jne': self.ids.addscreen.ids.image.ii = self.kurirs[0] if args.lower() == 'tiki': self.ids.addscreen.ids.image.ii = self.kurirs[1] if args.lower() == 'pos': self.ids.addscreen.ids.image.ii = self.kurirs[2] if args.lower() == 'jnt': self.ids.addscreen.ids.image.ii = self.kurirs[8] if args.lower() == 'ninja': self.ids.addscreen.ids.image.ii = self.kurirs[7] if args.lower() == 'lion': self.ids.addscreen.ids.image.ii = self.kurirs[6] if args.lower() == 'anteraja': self.ids.addscreen.ids.image.ii = self.kurirs[3] if args.lower() == 'wahana': self.ids.addscreen.ids.image.ii = self.kurirs[5] if args.lower() == 'sicepat': self.ids.addscreen.ids.image.ii = self.kurirs[4] def visualize_json(self): self.ids.friendscreen.ids.container.clear_widgets() for i in self.data.keys(): if self.data[i]['kurir'] == 'jne': image = ImageLeftWidget(source=self.kurirs[0]) if self.data[i]['kurir'] == 'tiki': image = ImageLeftWidget(source=self.kurirs[1]) if self.data[i]['kurir'] == 'pos': image = ImageLeftWidget(source=self.kurirs[2]) if self.data[i]['kurir'] == 'jnt': image = ImageLeftWidget(source=self.kurirs[8]) if self.data[i]['kurir'] == 'ninja': image = ImageLeftWidget(source=self.kurirs[7]) if self.data[i]['kurir'] == 'lion': image = ImageLeftWidget(source=self.kurirs[6]) if self.data[i]['kurir'] == 'anteraja': image = ImageLeftWidget(source=self.kurirs[3]) if self.data[i]['kurir'] == 'wahana': image = ImageLeftWidget(source=self.kurirs[5]) if self.data[i]['kurir'] == 'sicepat': image = ImageLeftWidget(source=self.kurirs[4]) isi = TwoLineAvatarListItem( text=self.data[i]['kurir'].upper(), on_press=lambda x, item=i: self.show_dialog5(text=item), secondary_text=i) isi.add_widget(image) self.ids.friendscreen.ids.container.add_widget(isi) def setup(self): self.ids.ongkirscreen.ids.province_tujuan.values = list( self.data_tables.keys()) self.ids.ongkirscreen.ids.province.values = list( self.data_tables.keys()) def show_kota(self, text): try: self.ids.ongkirscreen.ids.kota_tujuan.text = 'Kota Tujuan' self.ids.ongkirscreen.ids.kota_tujuan.values = list( self.data_tables[text].keys()) except: pass def show_kota1(self, text): try: self.ids.ongkirscreen.ids.kota.text = 'Kota' self.ids.ongkirscreen.ids.kota.values = list( self.data_tables[text].keys()) except: pass def hitung(self): toast("Counting..........") try: from rajaOngkirApi import rajaongkirApi api = rajaongkirApi(key='23930140f7b47aaebf5318262ee5d0f1', accountType='starter') self.id_origin = self.data_tables[ self.ids.ongkirscreen.ids.province.text][ self.ids.ongkirscreen.ids.kota.text] self.id_destinasi = self.data_tables[ self.ids.ongkirscreen.ids.province_tujuan.text][ self.ids.ongkirscreen.ids.kota_tujuan.text] print(self.id_origin, self.id_destinasi) if bool(self.ids.ongkirscreen.ids.weight.text) == False: from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Harap Isi Semuanya", duration=0.5) snackbar.show() else: harga = api.requestApi( origin=self.id_origin, destination=self.id_destinasi, weight=str(self.ids.ongkirscreen.ids.weight.text), courier=self.ids.ongkirscreen.ids.kurir.text.lower()) harga = harga.decode('utf-8') harga = json.loads(harga) deskripsi = '' for i in ((harga['rajaongkir']['results'][0]['costs'])): if 'HARI' in i["cost"][0]["etd"]: deskripsi += f' {i["service"]} : Rp {i["cost"][0]["value"]} \n Perkiraan {i["cost"][0]["etd"]}\n' else: print(f'{i["cost"][0]["etd"]}') deskripsi += f' {i["service"]} : Rp {i["cost"][0]["value"]} \n Perkiraan {i["cost"][0]["etd"]} hari\n' if self.ids.ongkirscreen.ids.kurir.text.lower() == 'jne': self.ids.ongkirscreen.ids.image.ii = self.images[0] if self.ids.ongkirscreen.ids.kurir.text.lower() == 'tiki': self.ids.ongkirscreen.ids.image.ii = self.images[1] if self.ids.ongkirscreen.ids.kurir.text.lower() == 'pos': self.ids.ongkirscreen.ids.image.ii = self.images[2] if deskripsi == '': self.ids.ongkirscreen.ids.label.text = 'tidak ada kurir yang tersedia' if deskripsi != '': self.ids.ongkirscreen.ids.label.text = deskripsi except: from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Harap Isi Semuanya", duration=0.5) snackbar.show() def update_dict(self): currentMonth = datetime.datetime.now().month currentYear = datetime.datetime.now().year new = self.get_datetime_range(currentYear, currentMonth) new = [str(i) for i in new] with open('data/date.json', 'r') as fppp: self.attempts = json.load(fppp) try: for i in self.attempts.copy().keys(): if i not in new: del self.attempts[i] except: pass with open('data/date.json', 'w') as fppppp: json.dump(self.attempts, fppppp) def get_datetime_range(self, year, month): nb_days = monthrange(year, month)[1] return [ datetime.date(year, month, day) for day in range(1, nb_days + 1) ] def copy_details(self, details): Clipboard.copy(details) def set_label(self): mydate = datetime.datetime.now() self.ids.piechart.label.text = f'Total Usages In {(mydate.strftime("%B"))}' def change_screen(self, screen, *args): self.ids.screen_manager.current = screen def make_json(self): from tes import check_resi try: if self.ids.addscreen.ids.no_resi.text in self.data: from kivymd.uix.snackbar import Snackbar self.snackbar = Snackbar(text="Sudah Ad Resi Yg Sama", duration=0.5) self.snackbar.show() else: if check_resi(self.ids.addscreen.ids.kurir.text.lower( ), self.ids.addscreen.ids.no_resi.text)['error'] == True: from kivymd.uix.snackbar import Snackbar self.snackbar = Snackbar( text="Salah Resi Atau Salah Kurir", duration=0.5) self.snackbar.show() except KeyError: if self.ids.addscreen.ids.no_resi.text in self.data: from kivymd.uix.snackbar import Snackbar self.snackbar = Snackbar(text="Sudah Ad Resi Yg Sama", duration=0.5) self.snackbar.show() else: with open('data/data.json', 'w') as f: from kivymd.uix.snackbar import Snackbar self.snackbar = Snackbar(text="Details Saved", duration=1.0) self.snackbar.show() self.data[self.ids.addscreen.ids.no_resi.text] = {} self.data[self.ids.addscreen.ids.no_resi.text][ 'kurir'] = self.ids.addscreen.ids.kurir.text.lower( ) print(self.data) json.dump(self.data, f) self.visualize_json() self.ids.addscreen.go_friend() def show_dialog5(self, *args, text): from tes import check_resi deskripsi = check_resi(self.data[text]['kurir'], text) self.deskripsi = deskripsi["data"]["detail"] self.dialog = MDDialog( title='DETAILS', text=f'PENERIMA: {self.deskripsi["receiver"]}\n' f'STATUS: {self.deskripsi["status"]}\n' f'DIKIRIM: {self.deskripsi["date_shipment"]}\n' f'DITERIMA: {self.deskripsi["date_received"]}\n', size_hint=(0.8, 1), buttons=[ MDFlatButton(text='Close', on_release=self.close_dialog), MDFlatButton( text='Delete', on_release=lambda x, item=text: self.delete(item)), MDRaisedButton(text='See Details', on_release=lambda x, item=text: self. change_name(text=item)) ]) self.dialog.open() def delete(self, *name): try: name = name[0] toast('Delete Success') del self.data[name] with open('data/data.json', 'w') as f: json.dump(self.data, f) self.visualize_json() self.close_dialog() except: pass def change_name(self, *args, text): print(text) self.change_screen('editscreen') self.dialog.dismiss() self.deskripsi['history'].reverse() self.ids.editscreen.ids.container.clear_widgets() for i in self.deskripsi['history']: isi = ThreeLineListItem(text=i["position"], secondary_text=i["time"], tertiary_text=i["desc"], on_press=lambda x, item=i: self. copy_details(f'{i["position"]}\n' f'{i["time"]}\n' f'{i["desc"]}')) self.ids.editscreen.ids.container.add_widget(isi) def default(self, *args): self.ids.screen1.spinn.text = '1' #Make Value To Default self.ids.screen1.spinn1.text = '1' #Make Value To Default self.dialog2.dismiss() #Close The Dialog def grammar_check(self): import os, certifi os.environ['SSL_CERT_FILE'] = certifi.where() try: toast('Wait Indexing Grammar....') from .grammar_check import grammar self.ids.screen1.isi.text = grammar(self.ids.screen1.isi.text) except: pass def change_spinn(self): try: if self.ids.ongkirscreen.ids.search_provinsi.text in list( self.data_tables.keys()): self.ids.ongkirscreen.ids.province.text = self.ids.ongkirscreen.ids.search_provinsi.text from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Provinsi Ditemukan", duration=1) snackbar.show() if self.ids.ongkirscreen.ids.search_provinsi.text not in list( self.data_tables.keys()): from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Provinsi Tidak Ditemukan", duration=1) snackbar.show() except: pass def change_spinn1(self): try: if self.ids.ongkirscreen.ids.search_provinsi_tujuan.text in list( self.data_tables.keys()): self.ids.ongkirscreen.ids.province_tujuan.text = self.ids.ongkirscreen.ids.search_provinsi_tujuan.text from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Provinsi Ditemukan", duration=1) snackbar.show() if self.ids.ongkirscreen.ids.search_provinsi_tujuan.text not in list( self.data_tables.keys()): from kivymd.uix.snackbar import Snackbar snackbar = Snackbar(text="Provinsi Tidak Terjangkau", duration=1) snackbar.show() except: pass def change_values(self, output): self.ids.screen1.isi.text = output def check_data_login(self): self.get_permission() toast('Load Module....') try: nama = self.ids.screen1.username.text self.ids.screen1.username.text = '' kelas = self.ids.screen1.kelas.text self.ids.screen1.kelas.text = '' font = self.ids.screen1.spinn.text self.ids.screen1.spinn.text = 'Font' kertas = self.ids.screen1.spinn1.text self.ids.screen1.spinn1.text = 'Paper' isi = self.ids.screen1.isi.text self.ids.screen1.isi.text = '' with open('data/date.json', 'r') as f: self.attempts = json.load(f) try: pass except KeyError: with open('data/date.json', 'w') as fpp: self.attempts[str(date.today())] = 0 json.dump(self.attempts, fpp) with open('data/date.json', 'w') as f: try: self.attempts[str(date.today())] += 1 json.dump(self.attempts, f) except KeyError: with open('data/date.json', 'w') as fpp: self.attempts[str(date.today())] = 0 json.dump(self.attempts, fpp) self.attempts[str(date.today())] += 1 json.dump(self.attempts, f) prs = nulis.Fung(isi, kertas, font, nama, kelas) prs.textNulis() self.ids.screen2.image1.source = prs.return_location() self.change_screen('screen2') print(self.ids.screen_manager.current) except: self.dialog2 = MDDialog( title='No Input ', text='Fill Out The Font and Paper Section', size_hint=(0.5, 1), buttons=[ MDFlatButton(text='Close', on_release=self.close_dialog2), MDRaisedButton(text='Default', on_release=self.default) ]) self.dialog2.open() def go_piechart(self): #Making and Updating Chart self.update_dict() self.set_label() self.ids.piechart.make_piechart() self.ids.piechart.update_chart() def translation(self): try: self.get_permission() try: from .translation_google import translating toast("Translating...") self.ids.screen1.isi.text = translating( self.ids.screen1.isi.text) except: pass except: pass def see_recent_images(self): try: from kivymd.toast import toast toast("Load Image........") self.get_permission() from .check_recent import check_recent self.ids.screen2.image1.source = check_recent() self.ids.screen1.go_picture() except: pass def close_dialog2(self, *obj): try: self.dialog2.dismiss() except: pass def get_permission(self): from .permission import check_permission check_permission() def close_dialog(self, *obj): try: self.dialog.dismiss() except: pass except: pass
class AirControlApp(MDApp): def build(self): self.root = Builder.load_string(KV) return self.root def show_aqi(self): """It is looking through API for the air quality index coresponding to the user input. If the name city is found another function is called to show the index, else a snackbar will show a message explaining that the city has not been found.""" try: self.city_name = self.root.get_screen("menu").ids.user_input.text self.source_aqi = requests.get( f'https://api.waqi.info/feed/{self.city_name.lower()}\ /?token=f37fe96b9bf9deafacdb2edc057908fd0b0e2e71') self.api_aqi = json.loads(self.source_aqi.content) self.aqi = self.api_aqi['data']['aqi'] self.aqi_info_button() except Exception: self.root.get_screen("menu").ids.info_button.text = "" self.root.get_screen( "menu").ids.info_button.md_bg_color = 1, 1, 1, 1 self.root.get_screen( "menu").ids.info_button.on_release = self.no_action self.snackbar = Snackbar( text="There are no results for your search!") self.snackbar.show() def aqi_info_button(self): """It shows the index together with a small description in a button which is coloured depending on the air quality.""" info = f"Air quality index: {self.aqi}\n" if self.aqi < 51: self.root.get_screen("menu").ids.info_button.text = f"{info} Good" self.root.get_screen( "menu").ids.info_button.md_bg_color = 0, 193 / 255.0, 0, 1 elif 50 < self.aqi < 101: self.root.get_screen( "menu").ids.info_button.text = f"{info}Moderate" self.root.get_screen( "menu").ids.info_button.md_bg_color = 244/255.0,\ 238/255.0, 0, 1 elif 100 < self.aqi < 151: self.root.get_screen( "menu").ids.info_button.text = f"{info}Unhealthy for\ Sensitive Groups" self.root.get_screen( "menu").ids.info_button.md_bg_color = 245/255.0,\ 130/255.0, 0, 1 elif 150 < self.aqi < 201: self.root.get_screen( "menu").ids.info_button.text = f"{info}Unhealthy" self.root.get_screen( "menu").ids.info_button.md_bg_color = 230/255.0,\ 50/255.0, 99/255.0, 1 elif 200 < self.aqi < 301: self.root.get_screen( "menu").ids.info_button.text = f"{info}Very Unhealthy" self.root.get_screen( "menu").ids.info_button.md_bg_color = 135/255/0, 0,\ 170/255.0, 1 elif self.aqi > 300: self.root.get_screen( "menu").ids.info_button.text = f"{info}Hazardous" self.root.get_screen( "menu").ids.info_button.md_bg_color = 133/255.0,\ 0, 29/255.0, 1 self.root.get_screen( "menu").ids.info_button.on_release = self.show_dialog def show_dialog(self): """It shows more information in a dialog box about the air quality considering its index.""" self.dialog = MDDialog(text="", type="alert", size_hint=(0.6, 0.5), buttons=[ MDFlatButton( text="OK", text_color=self.theme_cls.primary_color, on_release=self.close_dialog) ]) if self.aqi < 51: self.dialog.text = pollution_levels.good elif 50 < self.aqi < 101: self.dialog.text = pollution_levels.moderate elif 100 < self.aqi < 151: self.dialog.text = pollution_levels.unhealthy_sensitive elif 150 < self.aqi < 201: self.dialog.text = pollution_levels.unhealthy elif 200 < self.aqi < 301: self.dialog.text = pollution_levels.very_unhealthy elif self.aqi > 300: self.dialog.text = pollution_levels.hazardous self.dialog.open() def close_dialog(self, instance): """It closes the dialog box containing further information about the air quality.""" self.dialog.dismiss() def clear_info(self): """ It clears all the information found on the 'menu' screen and the button containing the air quality index is disabled.""" self.root.get_screen("menu").ids.user_input.text = "" self.root.get_screen("menu").ids.info_button.text = "" self.root.get_screen("menu").ids.info_button.md_bg_color = 1, 1, 1, 1 self.root.get_screen( "menu").ids.info_button.on_release = self.no_action def no_action(self): """ The function is used to disable the air quality index button.""" pass def show_weather_screen(self): """ It searches the weather for the user input through API. If the name city is found another function is called to show additional information and the screen is changed, else a snackbar will show a message explaining the city has not been found.""" try: self.city_name = self.root.get_screen("menu").ids.user_input.text self.source_weather = requests.get( f'http://api.openweathermap.org/data/2.5/weather?q={self.city_name.lower()}&appid=d55be5a2ffa2717965723f2fd1d5ca7f' ) self.api_weather = json.loads(self.source_weather.content) self.weather_info_button() self.root.current = "weather" except Exception: self.snackbar = Snackbar( text="There are no results for your search!") self.snackbar.show() def weather_info_button(self): """It shows the information about the weather (city name, icon, temperature, small description)""" self.root.get_screen("weather").ids.city.text = self.city_name.upper() self.icon_name = self.api_weather['weather'][0]['icon'] self.root.get_screen( "weather" ).ids.icon_label.icon = f'Icons\{self.icon_name}@2x.png' #don't forget to write the path for the directory where the Icons file is stored self.temp_kelvin = self.api_weather['main']['temp'] self.temp_celsius = int(self.temp_kelvin - 273.15) self.root.get_screen( "weather").ids.temp.text = f'{str(self.temp_celsius)} °C' self.root.get_screen( "weather").ids.main_description.text =\ self.api_weather['weather'][0]['main'] self.root.get_screen( "weather").ids.add_description.text =\ self.api_weather['weather'][0]['description'] def nav_drawer_info(self): """ When the plus button from the navigation drawer is pressed a dialog box contain additional information will be displayed on the screen.""" info = "Data obtained from openweathermap.org and aqicn.org/api." self.dialog_nav_drawer = MDDialog( text=info, size_hint=(0.6, 0.5), buttons=[ MDFlatButton(text="OK", text_color=self.theme_cls.primary_color, on_release=self.close_dialog_nav_drawer) ]) self.dialog_nav_drawer.open() def close_dialog_nav_drawer(self, instance): """It closes the dialog box from the navigation drawer containing further information.""" self.dialog_nav_drawer.dismiss()
class RegisterPolicyPage(GridLayout): registration_policy = ObjectProperty(None) account_type = None citizen = None campus = None code = None def __init__(self, **kwargs): super().__init__(**kwargs) self.snackbar = None def start(self, account_type, citizen, campus, code=None): self.tsc = SmartCardBehavior( self.name, card_insert_callback=None, card_remove_callback=None, card_reinsert_callback=None, card_remove_forever_callback=self.card_remove_forever_callback) self.account_type = account_type.lower() self.citizen = citizen self.campus = campus self.code = code #self.tsc.monitor(4, self.citizen) f = open("lib\\Policy.txt", "r", encoding="utf8") policy = f.read() self.ids.registration_policy.text = policy self.ids.account_policy_refuse.size_hint = [.8, None] self.ids.account_policy_accept.size_hint = [.8, None] def account_creation_not_accept_click_callback(self): Logger.info( 'RegisterPolicyPage: Not accept policy, then return to Home screen' ) CPECafe.tsc.reject() def account_creation_accept_click_callback(self): Logger.info( 'RegisterPolicyPage: Register a new Account and then open Set Password screen' ) self.snackbar_show( text= f'กรุณารอสักครู่ - กำลังสมัครบัญชีสมาชิกใหม่กับระบบจัดการข้อมูลและบริการอินเทอร์เน็ต' ) self.tsc = SmartCardBehavior(self) self.citizen = self.tsc.citizen # fail = False # print(self.citizen) # # # Insert data to database # # self.snackbar_hide() if self.citizen: Logger.info('RegisterPolicyPage: Open SetPassword screen') #self.snackbar_show('We are register your information as RMUTi internet account. Please wait...') CPECafe.screen_manager.transition = SlideTransition( direction='left') CPECafe.screen_manager.current = 'Finish' #CPECafe.tsc.smart_card_removable = False CPECafe.finish_page.start() #self.tsc.unmonitor() return CPECafe.tsc.dialog( title='เกิดข้อผิดพลาด...', size=('380dp', '180dp'), size_hint=(None, None), #text='The RMUTI Internet Accounting Service is down', text='ขออภัย.. เราไม่สามารถให้บริการได้', text_button_ok='OK') return def card_remove_forever_callback(self): if self.account_type != None: self.account_type_select.add_widget(self.ids.account_type_text) self.account_type = None def snackbar_show(self, text, duration=8): if self.snackbar: self.snackbar = None self.snackbar = Snackbar(text=text, duration=duration) self.snackbar.show() #Clock.schedule_once(self.snackbar_hide, wait) def snackbar_hide(self, instance=None): if self.snackbar: self.snackbar.hide() self.snackbar = None
class User(ScreenManager): color = StringProperty() accent_palette = StringProperty() radius = NumericProperty() refresh_home = None username = config_dict["username"] def __init__(self, **kwargs): super().__init__(**kwargs) self.username = config_dict["username"] self.snackbar = Snackbar(duration=1.5) # 提示窗 self.dialog = MDDialog( size_hint_x=0.8, text="确定清除全部由学习记录?", buttons=[ MDFlatButton( text="取消", text_color=config.theme_cls.primary_color, on_release=lambda x: (self.dialog.dismiss()), ), MDFlatButton( text="确定", text_color=config.theme_cls.primary_color, on_release=lambda x: ( self.ClearStudyProcess(), self.dialog.dismiss(), ), ), ], ) self.dialog.set_normal_height() self.studynum = StudyNum(max=999, min=5, step=5, now=config_dict["max_learn"]) self.study_num_dialog = MDDialog( size_hint_x=0.9, title="每日学习数量", type="custom", content_cls=self.studynum, buttons=[ MDFlatButton( text="取消", text_color=config.theme_cls.primary_color, on_release=lambda x: (self.study_num_dialog.dismiss()), ), MDFlatButton( text="确定", text_color=config.theme_cls.primary_color, on_release=lambda x: (self.ChangeStudyNum(), ), ), ], ) self.study_num_dialog.set_normal_height() self.difficulty = StudyNum(step=1, max=6, min=1, now=config_dict["difficulty"]) self.difficulty_dialog = MDDialog( size_hint_x=0.9, title="挑战难度", type="custom", content_cls=self.difficulty, buttons=[ MDFlatButton( text="取消", text_color=config.theme_cls.primary_color, on_release=lambda x: (self.difficulty_dialog.dismiss()), ), MDFlatButton( text="确定", text_color=config.theme_cls.primary_color, on_release=lambda x: (self.ChangeDifficulty(), ), ), ], ) self.difficulty_dialog.set_normal_height() """ self.theme_dialog = MDThemePicker() self.theme_dialog.ids.title.text = "主题颜色搭配" self.theme_dialog.ids.theme_tab.text = "主题色" self.theme_dialog.ids.accent_tab.text = "选中色" self.theme_dialog.ids.close_button.text = "保存" self.theme_dialog.ids.close_button.on_release = lambda :(self.theme_dialog.dismiss(), self.SaveThemeColor()) """ """ # 移除色调选择 self.theme_dialog.ids.tab_panel.tab_bar.layout.remove_widget( self.theme_dialog.ids.style_tab.tab_label ) self.theme_dialog.ids.tab_panel.carousel.remove_widget( self.theme_dialog.ids.style_tab ) """ def ChangeDifficulty(self): num = self.difficulty.num print("ChangeDifficulty", num) config_dict["difficulty"] = int(num) config.SaveConfig() self.difficulty_dialog.dismiss() self.snackbar.text = "修改挑战难度成功" self.snackbar.show() def ChangeStudyNum(self): text = self.studynum.num print("ChangeStudyNum", text) if text > 0: config_dict["max_learn"] = int(text) config.SaveConfig() self.refresh_home() self.study_num_dialog.dismiss() self.snackbar.text = "修改每日学习数量成功" self.snackbar.show() else: self.studynum.ids.input.hint_text = "每日学习个数必须大于0!" self.studynum.ids.input.text = "" self.studynum.ids.input.error = True """ def ChangeThemeColor(self): self.theme_dialog.open() """ def SaveThemeColor(self): #保存主题颜色设置 config_dict["theme_cls_primary_palette"] = self.color config_dict["theme_cls_accent_palette"] = self.accent_palette config.SaveConfig() def ClearStudyProcess(self): def __clear(): appdata.IsInit(True) config.record.clear() config.SaveRecord() self.snackbar.text = "清除成功" self.snackbar.show() threading.Thread(target=__clear).start()
class CPECafeApp(MDApp): title = 'CPE Cafe WiFi' #title = 'ระบบบริการบัญชีสมาชิกอินเทอร์เน็ต มทร.อีสาน' font_thin = APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-Text.ttf' font_regular = APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-Medium.ttf' font_bold = APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-SemiBold.ttf' font_name = 'SukhumvitSet' smart_card = None citizen = None account = None menu = None def __init__(self, **kwargs): LabelBase.register(name='SukhumvitSet', fn_regular=APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-Medium.ttf', fn_italic=APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-Medium.ttf', fn_bold=APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-Bold.ttf', fn_bolditalic=APP_FOLDER_NAME + '\\lib\\resources\\SukhumvitSet-Bold.ttf') theme_font_styles.append('SukhumvitSet') self.theme_cls.font_styles['SukhumvitSet'] = [ 'SukhumvitSet', 16, False, 0.15, ] self.theme_cls.primary_palette = 'Blue' super().__init__(**kwargs) #self.dialog_change_theme = None #self.toolbar = None self.snackbar = None def build(self): self.screen_manager = ScreenManager(transition=NoTransition()) self.tsc = SmartCardBehavior( 'Home', reader_added_callback=self.smart_card_reader_added_callback, reader_removed_callback=self.smart_card_reader_removed_callback, card_insert_callback=self.smart_card_inserted_callback, #card_remove_callback=self.smart_card_remove_callback, card_reinsert_callback=None, card_remove_forever_callback=None) with open(f'lib\\Loading.kv', encoding='utf8') as f: Builder.load_string(f.read()) self.loading_page = LoadingPage() screen = Screen(name='Loading') screen.on_enter = self.loading_page.load_pages screen.add_widget(self.loading_page) self.screen_manager.add_widget(screen) return self.screen_manager def smart_card_reader_added_callback(self, added_readers): #CPECafe.home_page.smartcard_text.text = f'Citizen Card was inserted' #CPECafe.home_page.smartcard_text.text = f'มีการต่ออุปกรณ์อ่านบัตรประจำตัวประชาชน' Logger.info('CPECafeApp: SmartCard reader added') def smart_card_reader_removed_callback(self, removed_readers): #CPECafe.home_page.smartcard_text.text = f'Citizen Card was inserted' #CPECafe.home_page.smartcard_text.text = f'มีการถอดอุปกรณ์อ่านบัตรประจำตัวประชาชน' Logger.info('CPECafeApp: SmartCard reader removed') def smart_card_inserted_callback(self, **kwargs): Logger.info('CPECafeApp: SmartCard inserted') #CPECafe.home_page.smartcard_text.text = f'Citizen Card was inserted' CPECafe.home_page.smartcard_text.text = f'มีการเสียบบัตรประจำตัวประชาชน' #CPECafe.home_page.smartcard_image.source = f'lib\\resources\\card_in_use_512px.png' # Read Citizen ID if self.tsc.citizen != None: self.citizen = self.tsc.citizen #self.citizen = '0409000609020' self.account = None Logger.info('CPECafeApp: Open Register screen') CPECafe.screen_manager.transition = SlideTransition( direction='left') CPECafe.screen_manager.current = 'RegisterPolicy' self.tsc.smart_card_removable = True CPECafe.register_policy_page.start() return def smart_card_remove_callback(self, **kwargs): Logger.info('CPECafeApp: SmartCard removed') def snackbar_show(self, text, duration=8): if self.snackbar: self.snackbar = None self.snackbar = Snackbar(text=text, duration=duration) self.snackbar.show() def snackbar_hide(self, instance=None): if self.snackbar: self.snackbar.hide() self.snackbar = None def callback_earthe(self): print('callback_earthe') menu = 1 return menu def callback_wifi(self): hostname = "www.google.com" response = os.system("ping " + hostname) # and then check the response... if response == 0: pingstatus = "Network Active" else: pingstatus = "Network Error" return pingstatus # def check_ping(): # hostname = "taylor" # response = os.system("ping -c 1 " + hostname) # # and then check the response... # if response == 0: # pingstatus = "Network Active" # else: # pingstatus = "Network Error" # return pingstatus def callback_key(self): print('callback_key') menu = 3 return menu def callback_setting(self): print('callback_setting') menu = 4 CPECafe.screen_manager.transition = SlideTransition(direction='left') CPECafe.screen_manager.current = 'Setting' return menu def callback_login(self, menu): pass # setting screen menu def callback_home(self): CPECafe.screen_manager.current = 'Home' CPECafe.screen_manager.transition = SlideTransition(direction='right') def callback_save(self): # save to database print('callback_save')