def __init__(self, retour_selection, titre, parent_scm, dict_eleves_par_groupe, **kwargs): self.titre = titre self.retour_selection = retour_selection self.parent_scm = parent_scm self.dict_eleves = dict_eleves_par_groupe self.dict_panneau_groupe = dict() super(Formation, self).__init__(**kwargs) for nom_groupe in self.dict_eleves.keys(): tb = TabbedPanelItem(text=nom_groupe) panneaugr = PanneauGroupe(self.dict_eleves[nom_groupe], nom_cours=titre) self.dict_panneau_groupe[nom_groupe] = panneaugr tb.add_widget(panneaugr) self.nb.add_widget(tb) fin = TabbedPanelItem(text='Terminer') self.panfin = PanneauFinFormation(self.terminaison, self.recapitulatif) fin.add_widget(self.panfin) fin.bind(on_release=self.panfin.update) self.nb.add_widget(fin) self.panneau_fin = fin retour = TabbedPanelHeader(text='Retour') retour.bind(on_release=self.retour) self.nb.add_widget(retour) self.panneau_retour = retour
def button_options(self): print("options pressed") app = App.get_running_app() cont = GridLayout(cols=1) # retrieve audio outputs / soundcards from audioengine class out_list = app.root.ae.get_outputs() print(out_list) # combine out_list, add to output selector for x, y in zip(*out_list): # intentional error to remember where left off b = Button(id="{}".format(y), text="{} {}".format(x, y)) b.bind(on_press=self.audio_opts_button_callback) cont.add_widget(b) for x in self.children: print(x) tp = TabbedPanel(do_default_tab=False) # audio tab th_audio = TabbedPanelItem(text="Audio") th_audio.content = GridLayout() th_audio.add_widget(cont) # files tab th_files = TabbedPanelItem(text="Files") th_files.add_widget(Button(text="files tab content")) tp.add_widget(th_audio) tp.add_widget(th_files) popup = Popup(title='Options', content=tp, size_hint=(None, None), size=(800, 800)) popup.open()
def finalize(self, *args): assert not hasattr(self, '_finalized') if not ( self.engine and self.toggle and self.character ): Clock.schedule_once(self.finalize, 0) return self._tabs = TabbedPanel(do_default_tab=False) for rb, txt in ( ('character', 'character'), ('avatar', 'avatar'), ('character_thing', 'thing'), ('character_place', 'place'), ('character_portal', 'portal') ): tab = TabbedPanelItem(text=txt) setattr(self, '_{}_tab'.format(rb), tab) box = RulesBox( engine=self.engine, rulebook=self._get_rulebook(rb), entity=self.character, toggle=self.toggle ) tab.add_widget(box) self._tabs.add_widget(tab) self.add_widget(self._tabs) self._finalized = True
def build(self): root = BoxLayout() root = TabbedPanel(do_default_tab=False) root.tab_width = 200 self.load("default.xml") self.wips_container = WipContainer(self, self.wips, orientation="vertical", size_hint_y=None, height=1200, minimum_height=200) queue_scroll = ScrollView(bar_width=20) queue_scroll.add_widget(self.wips_container) tab = TabbedPanelItem(text="queue") tab.add_widget(queue_scroll) root.add_widget(tab) tab = TabbedPanelItem(text="settings") self.setting_container = SettingContainer(self) tab.add_widget(self.setting_container) self.setting_container.update_widgets() root.add_widget(tab) self.check_for_projects() self.load_xml_files() Clock.schedule_interval(lambda x: self.check_for_projects(), 10) return root
def __init__(self, **kwargs): super(PythonConsole, self).__init__(**kwargs) self.console = ConsoleWidget(self) tab1 = TabbedPanelItem(text="Console") tab1.add_widget(self.console) self.add_widget(tab1)
def tabProbabilityTesting(self): ''' tab containing plot of probability distributions from various user-specificed pools of dice ''' self.plotColorMap = [ [1,0,0,1], [0,1,0,1], [0,0,1,1], [1,1,0,1], [1,0,1,1], [0,1,1,1], [1,1,1,1], [0.75,0.75,0.75,1]] tabProb = TabbedPanelItem(text = 'Prob. Plots') self.statsMainLayout = BoxLayout(orientation = 'vertical') self.entryLayout = BoxLayout(orientation = 'vertical',size_hint = (1,0.45)) buttonLayout = BoxLayout(size_hint = (1,0.05)) self.graphLayout = BoxLayout(size_hint = (1,0.5)) self.graph = Graph(xlabel='Value', ylabel='Counts', x_ticks_minor=1,x_ticks_major=2, y_ticks_minor = 100, y_ticks_major=500, y_grid_label=True, x_grid_label=True, padding=5, x_grid=True, y_grid=True, xmin=-0, xmax=15, ymin=0,ymax = 5000) self.graphLayout.add_widget(self.graph) self.plotList = [] self.statsMainLayout.add_widget(self.entryLayout) self.statsMainLayout.add_widget(buttonLayout) self.statsMainLayout.add_widget(self.graphLayout) self.testList = [] self.appendNewTest(self.entryLayout,readOnly = True) self.testList.append(self.appendNewTest(self.entryLayout)) buttonList = [['Add New Test','Plot Results','Reset']] buttonFunctionList = [[self.fireNewTestButton,self.firePlotButton,self.fireResetTestsButton]] self.addButtons(buttonList,buttonFunctionList,buttonLayout) tabProb.add_widget(self.statsMainLayout) return tabProb
def addTab(self, name, obj): th = TabbedPanelItem(text=name) self.add_widget(th) th.add_widget(obj) th.background_down = "blue.jpeg" print dir(th) return th
def change_data_set(self, new_dic): liste_groupe = [{'text': nom_groupe} for nom_groupe in new_dic.keys()] print('tododo:', liste_groupe) current_groupes = self.dict_panneau_groupe.keys() self.deja_enregistre = False print('tadada:', new_dic.keys()) print(current_groupes) for nom_groupe in current_groupes: # Si le groupe n'est plus dans la liste # il faut retirer le panneau if nom_groupe not in new_dic: # Mais d'abord il faut le retrouver ! tabbed = [ tb for tb in self.nb.get_tab_list() if tb.text == nom_groupe ] try: del self.dict_panneau_groupe[nom_groupe] except KeyError: pass if tabbed: self.nb.remove_widget(tabbed[0]) for groupe in liste_groupe: nom_groupe = groupe['text'] if not new_dic[nom_groupe]: # Si c'est vide continue # Si le groupe n'existe pas, on crée le panneau et le rajoute if not nom_groupe in current_groupes: tb = TabbedPanelItem(text=nom_groupe) panneaugr = PanneauGroupe(new_dic[nom_groupe], nom_cours=self.titre) self.dict_panneau_groupe[nom_groupe] = panneaugr tb.add_widget(panneaugr) # Parce qu'à la SNSM, on aime quand c'est bien fait! self.nb.remove_widget(self.panneau_fin) self.nb.remove_widget(self.panneau_retour) self.nb.add_widget(tb) self.nb.add_widget(self.panneau_fin) self.nb.add_widget(self.panneau_retour) else: # Maintenant on gère les nouveaux élèves nouveaux_eleves = [ eleve for eleve in new_dic[nom_groupe] if not eleve in self.dict_eleves[nom_groupe] ] rejetes = [ eleve for eleve in self.dict_eleves[nom_groupe] if not eleve in new_dic[nom_groupe] ] self.dict_eleves = dict(new_dic) panneaugr = self.dict_panneau_groupe[nom_groupe] for ne in nouveaux_eleves: panneaugr.ajoute_nouvel_eleve(ne) # Et on vire les autres for mm in rejetes: panneaugr.supprime_eleve(mm)
def populate_tabs(self): new_manager_tab = TabbedPanelItem(text='Tasks') new_manager_tab.add_widget(self.new_manager) # self.ids.tp.add_widget(events_tab) self.ids.tp.add_widget(new_manager_tab) # self.ids.tp.add_widget(stats_tab) self.ids.tp.default_tab = new_manager_tab
def getTabLayout(self, command): tabItem = None for child in self.root.tab_list: if child.text == command.tabName: return child.content tabItem = TabbedPanelItem(text=command.tabName) self.root.add_widget(tabItem) tabItem.add_widget(BoxLayout(orientation='vertical', size_hint=(1, 1))) return tabItem.content
def make_new_category(self, category_name, index=0): components_categories = self.ids.components_categories new_tab = TabbedPanelItem() new_tab.id = category_name new_tab.text = category_name components_box = self.make_components_box(category_name) new_scroll = ScrollView() new_scroll.add_widget(components_box) new_tab.add_widget(new_scroll) components_categories.add_widget(new_tab, index + 1)
def __init__(self, prjMaterials, *args, **kwargs): print(f"creating materials sliders...") super(AllMatPropTabbedPanel, self).__init__(*args, **kwargs) self._prjMaterials = prjMaterials for mat in prjMaterials.materials: tmp = TabbedPanelItem() tmp2 = MatPropPanel(mat) self.add_widget(tmp) tmp.text = mat.name tmp.add_widget(tmp2)
def open_file(self, document): """ :type document: doxing.client.data_model.document.DocumentDTO """ # TODO: prevent double openning same file opened_file = TabbedPanelItem() opened_file.text = document.name opened_file.add_widget( TextFileEditor(ctxt=self._ctxt, document=document)) self.add_widget(opened_file) self.switch_to(opened_file)
def createInfoTab(stringDict, tabName): tab = TabbedPanelItem() tab.name = tabName tab.text = stringDict[tabName]["Title"] titleText = Label(text=stringDict[tabName]["Title"]) bodyText = Label(text=stringDict[tabName]["Body"]) tab.add_widget(titleText) tab.add_widget(bodyText) return tab
def __init__(self, **kwargs): super(BandLay, self).__init__(**kwargs) self.tab_item = TabbedPanel() self.tab_item.do_default_tab = False self.tab_item.tab_height = 20 list_bands = [] if site.equipment == 'ADU06': list_bands = ['A', 'B', 'F', 'C', 'D'] elif site.equipment == 'ADU07': list_bands = ['65536H', '4096H', '128H', '4H'] for band in list_bands: tab_item = TabbedPanelItem() tab_item.text = band self.tab_item.add_widget(tab_item) list_file_pplt = self.search_pplt_file(band) site.files_plot[band] = list_file_pplt self.grid_lay = ScrollBox() i = 0 for file_pplt_select in site.files_plot[band]: self.grid_lay.ids.grid.add_widget(file_pplt_select) print(file_pplt_select.obj_pplt.name) i += 1 if band == '65536H' or band == '4096H': self.grid_lay.ids.grid.size_hint_x = None self.grid_lay.ids.grid.width = int(i / 3 * 300) else: self.grid_lay.ids.grid.size_hint_x = None self.grid_lay.ids.grid.width = int(i/3 * 250) tab_item.add_widget(self.grid_lay) self.add_widget(self.tab_item) print(project.path_file_ppmt)
def finalize(self, *args): assert not hasattr(self, '_finalized') if not (self.engine and self.toggle and self.character): Clock.schedule_once(self.finalize, 0) return self._tabs = TabbedPanel(do_default_tab=False) for rb, txt in (('character', 'character'), ('avatar', 'avatar'), ('character_thing', 'thing'), ('character_place', 'place'), ('character_portal', 'portal')): tab = TabbedPanelItem(text=txt) setattr(self, '_{}_tab'.format(rb), tab) box = RulesBox(engine=self.engine, rulebook=self._get_rulebook(rb), entity=self.character, toggle=self.toggle) tab.add_widget(box) self._tabs.add_widget(tab) self.add_widget(self._tabs) self._finalized = True
def __init__(self, **kwargs): super(BandLay, self).__init__(**kwargs) self.tab_item = TabbedPanel() self.tab_item.do_default_tab = False self.tab_item.tab_height = 20 list_bands = [] if site.equipment == 'ADU06': list_bands = ['A', 'B', 'F', 'C', 'D'] elif site.equipment == 'ADU07': list_bands = ['65536H', '4096H', '128H', '4H'] for band in list_bands: tab_item = TabbedPanelItem() tab_item.text = band self.tab_item.add_widget(tab_item) list_file_pplt = self.search_pplt_file(band) site.files_plot[band] = list_file_pplt self.grid_lay = ScrollBox() i = 0 for file_pplt_select in site.files_plot[band]: self.grid_lay.ids.grid.add_widget(file_pplt_select) print(file_pplt_select.obj_pplt.name) i += 1 if band == '65536H' or band == '4096H': self.grid_lay.ids.grid.size_hint_x = None self.grid_lay.ids.grid.width = int(i / 3 * 300) else: self.grid_lay.ids.grid.size_hint_x = None self.grid_lay.ids.grid.width = int(i / 3 * 250) tab_item.add_widget(self.grid_lay) self.add_widget(self.tab_item) print(project.path_file_ppmt)
def test_tabbed_panel(): app = App.get_running_app() app.step_1 = False container = default_container() instructions = Label(text='Press the button on the next tab, then press Submit.') tab_btn = FocusButton(text='Press me first') submit_btn = FocusButton(text='Submit', size_hint_y=0.1) inner_container = default_container() ignore_btn = FocusButton(text='Ignore me') inner_container.add_widget(instructions) inner_container.add_widget(ignore_btn) tp = FocusTabbedPanel() tp.default_tab_content = inner_container item = TabbedPanelItem(text='Go here') item.add_widget(tab_btn) tp.add_widget(item) def press_ignore(*args): # Auto fail app.stop() def press_step_1(*args): app.step_1 = True def submit(*args): if app.step_1: app.did_action = True app.stop() ignore_btn.bind(on_press=press_ignore) tab_btn.bind(on_press=press_step_1) submit_btn.bind(on_press=submit) container.add_widget(tp) container.add_widget(submit_btn) app.root.add_widget(container) return True
def build_play_screen(self): play_screen = Screen(name='play') self.sm.add_widget(play_screen) tab_names = self.layout_names self.layouts = {} tb_panel = TabbedPanel(do_default_tab=False, tab_width=Window.width / len(tab_names)) play_screen.add_widget(tb_panel) for layout_name in self.layout_names: layout = BoxLayout(orientation='vertical') self.layouts[layout_name] = layout self.add_audio_to_layout(layout_name) tabitem = TabbedPanelItem(text=layout_name) tabitem.add_widget(layout) tb_panel.add_widget(tabitem) return
def __init__(self, **kwargs): super().__init__(**kwargs) self.tp_main = TabbedPanel() ti_pandas = TabbedPanelItem(id="ti_pandas", text = "pandas" ) ti_list = TabbedPanelItem(id="ti_list", text = "list") ti_numpy = TabbedPanelItem(id="ti_numpy", text = "numpy array") self.qt_pandas = QzTable(id="qt_pandas") self.qt_list = QzTable(id="qt_list") self.qt_array = QzTable(id="qt_array") self.df_data = pd.read_csv("height_weight.csv") self.l_data = list() v = 10.0 for y in range(1,1000,1): row = list() for x in range(0,50,1): v= v+ 10 row.append(v) self.l_data.append(row) self.a_data = np.array(self.l_data) self.qt_pandas.data = self.df_data self.qt_list.data = self.l_data self.qt_array.data = self.a_data #Layout self.add_widget(self.tp_main) self.tp_main.add_widget(ti_pandas) ti_pandas.add_widget(self.qt_pandas) self.tp_main.add_widget(ti_list) ti_list.add_widget(self.qt_list) self.tp_main.add_widget(ti_numpy) ti_numpy.add_widget(self.qt_array)
class Tab_panel(TabbedPanel): def __init__(self, **kwargs): super(Tab_panel, self).__init__(**kwargs) self.pirveli_tab = TabbedPanelItem(text="შესავსები ბლანკი", font_name="bpg_arial_2009", font_size=20) Window.bind(on_resize=self.window_size_changed) self.tab_width = Window.width / 2.27 self.tab_height = Window.height / 11.76 self.tab_pos = "top_right" self.default_tab_text = "Registration" self.background_image = 'background1.png' self.add_widget(self.pirveli_tab) self.mama = Mama_lay() self.pirovneba = pirovneba_box() self.default_tab_content = self.pirovneba self.pirveli_tab.add_widget(self.mama) self.switch_button = Button(text="შემდეგი", font_name="bpg_arial_2009", font_size=20) self.switch_button.bind(on_release=self.next_tab_func) self.pirovneba.person_box.add_widget(self.switch_button) def next_tab_func(self, *args): self.switch_to(self.pirveli_tab, do_scroll=True) self.mama.name_text.text = self.pirovneba.name_text.text self.mama.surname_text.text = self.pirovneba.surname_text.text self.pirovneba.name_text.text = "" self.pirovneba.surname_text.text = "" self.pirovneba.laptop_text.text = "" def window_size_changed(self, window, width, height): self.tab_width = width / 2.27 self.tab_height = height / 11.76 self.pirveli_tab.font_size = width / 68.3
def build(self): tp = TabbedPanel(do_default_tab=False) tab0 = TabbedPanelItem(text='First Tab') box = BoxLayout(orientation='horizontal', padding=5) xw0 = XWrapChromium('http://news.ycombinator.com') box.add_widget(xw0) b = Button(text='Randomize Site') b.bind(on_press=lambda inst: xw0.chromote.tabs[0].set_url( random.choice(random_sites))) box.add_widget(b) tab0.add_widget(box) tp.add_widget(tab0) tab1 = TabbedPanelItem(text='Other Panel') new_box = BoxLayout(orientation='vertical', padding=12) xw1 = XWrapChromium('http://codewaffle.com/') xw2 = XWrapChromium('http://eventual.games') b2 = Button(text='Random Sites') def randomize_xw12(*args, **kwargs): xw1.chromote.tabs[0].set_url(random.choice(random_sites)) xw2.chromote.tabs[0].set_url(random.choice(random_sites)) b2.bind(on_press=randomize_xw12) new_box.add_widget(xw1) new_box.add_widget(b2) new_box.add_widget(xw2) tab1.add_widget(new_box) tp.add_widget(tab1) return tp
def build(self): height = 800 width = 1200 settings_layout = GridLayout(cols=2) self.my_controller = Controller() self.settings_table = TableSettings(self.my_controller) settings_layout.add_widget(self.settings_table.get_table()) add_button = Button(text='add', size_hint=(.09, .005)) add_button.bind(on_press=self.add_setting) save_and_run = GridLayout(cols=2) save_button = Button(text='Save', size_hint=(.09, .005)) save_button.bind(on_press=self.save_settings) run_button = Button(text='Run', size_hint=(.09, .005)) run_button.bind(on_press=self.run_settings) save_and_run.add_widget(save_button) save_and_run.add_widget(run_button) settings_layout.add_widget(add_button) settings_layout.add_widget(save_and_run) settings = TabbedPanelItem(text='settings') settings.add_widget(settings_layout) tp = TabbedPanel() tp.add_widget(settings) groups_layout = GridLayout() groups = TabbedPanelItem(text='groups') groups.add_widget(groups_layout) tp.add_widget(groups) tp.set_def_tab(settings) Window.clearcolor = (.43, .43, .43, .01) Window.size = (width, height) return tp
def __init__(self, **kwargs): super().__init__(**kwargs) self.tp_main = TabbedPanel() ti_pandas = TabbedPanelItem(id="ti_pandas", text="pandas") ti_list = TabbedPanelItem(id="ti_list", text="list") ti_numpy = TabbedPanelItem(id="ti_numpy", text="numpy array") self.qt_pandas = QzTable(id="qt_pandas") self.qt_list = QzTable(id="qt_list") self.qt_array = QzTable(id="qt_array") self.df_data = pd.read_csv("height_weight.csv") self.l_data = list() v = 10.0 for y in range(1, 1000, 1): row = list() for x in range(0, 50, 1): v = v + 10 row.append(v) self.l_data.append(row) self.a_data = np.array(self.l_data) self.qt_pandas.data = self.df_data self.qt_pandas.row_header_width = 300 self.qt_list.data = self.l_data self.qt_array.data = self.a_data #setup the pandas widgets spinner = qzw.CellSpinner(values=('1', '2')) spinner.background_color = (0.3, 0.3, 0.3, 1) spinner.font_size = 12 qzw.CellSpinnerOptions.BackgroundColor = (0.6, 0.6, 0.65, 1) text = qzw.CellTxtInput(background_color=(0.3, 0.3, 0.3, 1), font_size=12) text.halign = "right" self.qt_pandas.set_widgets({0: spinner, 1: text}) #Layout self.add_widget(self.tp_main) self.tp_main.add_widget(ti_pandas) ti_pandas.add_widget(self.qt_pandas) self.tp_main.add_widget(ti_list) ti_list.add_widget(self.qt_list) self.tp_main.add_widget(ti_numpy) ti_numpy.add_widget(self.qt_array)
def creer(self): self.cours_sm = ScreenManager() self.cours_sm.size_hint = (1, 1) #menu_cours = BoxLayout(orientation="vertical", padding=40) menu_cours = SnsmBox(orientation="vertical", padding=40) boutons = GridLayout(cols=2) menu_cours.add_widget(boutons) for cours in formation_db.liste_cours_all(): button = Button(text=str(cours), color=(1, 1, 1, 1), font_size=20, size_hint=(1, 0.1), markup=True) boutons.add_widget(button) button.bind(on_press=self.selection_cours) scm = Screen(name='menu_principal') scm.add_widget(menu_cours) self.cours_sm.add_widget(scm) self.cours_sm.current = scm.name # Ajout de l'écran d'accueil aux onglets tab = TabbedPanelItem() tab.text = "Accueil" tab.add_widget(self.cours_sm) self.notebook.add_widget(tab) self.notebook.set_def_tab(tab) self.accueil_tab = tab # Ajout de l'écran de gestion aux onglets tab = TabbedPanelItem() tab.text = "Gérer" tab.add_widget(GestionSCM()) self.notebook.add_widget(tab) self.gestion_tab = tab # Ajout de l'écran d'Apropos aux onglets tab = TabbedPanelItem() tab.text = "A propos" tab.add_widget(Label(text="Bienvenue à la SNSM")) self.notebook.add_widget(tab) self.apropos_tab = tab return self
class LogApp(App): backend = backend.LogBackend() field_enable = backend.getEnabledFields() field_skip = backend.getSkipFields() field_widget = {} #used to lookup text field based on name field_widget_reverse_dict = { } #inverse dictionary used to lookup name based on text field object default_value_field_widget = {} field_auto_skip_checkbox = {} field_width_setting_field = {} color_red = [0xFF / 0xFF, 0x80 / 0xFF, 0x80 / 0xFF, 0.9] color_white = [1, 1, 1, 1] current_field_index = 0 edit_id = 0 def build(self): size = self.backend.getParameter('font_size') kv = self.kvConfigString(size) Builder.load_string(kv) Window.bind(on_draw=self.widthChange) self.main_window = BoxLayout() self.main_window.add_widget(self.constructMainWindow()) return self.main_window def kvConfigString(self, size): kv = '<Root>:\n\tfont_size: dp(' + size + ')\n' kv = kv + '<Label>:\n\tfont_size: dp(' + size + ')\n' kv = kv + '<TextInput>:\n\tfont_size: dp(' + size + ')\n' #kv='#:set default_font_size "'+size+'dp"' return kv def getFieldHeight(self, n=1): return str(n * int(self.global_font_size) + 20) + 'dp' #return '25' def getFieldWidth(self, n=1): return str((n * int(self.global_font_size)) - 5) + 'dp' def constructMainWindow(self): self.global_font_size = self.backend.getParameter('font_size') self.main_tabbed_panel = TabbedPanel(do_default_tab=False, size_hint=(1, 1)) self.main_tabbed_panel.softinput_mode = 'scale' #-------------- settings tab --------------------- settings_tab = TabbedPanelItem(text='Settings') sv = ScrollView(size_hint=(1, 1), effect_cls=ScrollEffect, bar_width=5) #, size=(300, 300) #settings_box=BoxLayout(orientation='vertical',size_hint=(1, None),spacing=10,height=1000)#height='1100dp' settings_box = StackLayout(orientation='lr-tb', size_hint=(1, None), height=3000) #-----------settings: log picker ---------- log_picker_box = BoxLayout(orientation='vertical', size_hint=(1, None), height=self.getFieldHeight(3)) log_picker_box.add_widget(Label(text='Select log', size_hint=(1, 1))) self.log_select_spinner = Spinner(text='default', values=('default'), size_hint=(1, 1)) log_picker_box.add_widget(self.log_select_spinner) settings_box.add_widget(log_picker_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-----------settings: new log ---------- new_log_row_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) create_log_help_button = Button(text='Create log (?)', size_hint=(0.5, 1), is_focusable=False) new_log_row_box.add_widget(create_log_help_button) create_log_help_button.bind(on_press=self.createLogHelpButtonCallback) self.new_log_name_field = TextInput( text='', multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, None), height=self.getFieldHeight(), on_text_validate=self.newLogButtonCallback) new_log_row_box.add_widget(self.new_log_name_field) settings_box.add_widget(new_log_row_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-----------settings: info field ---------- info_field_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) info_field_help_button = Button(text='Info field text (?)', size_hint=(0.5, 1), is_focusable=False) info_field_box.add_widget(info_field_help_button) info_field_help_button.bind(on_press=self.infoFieldHelpButtonCallback) self.info_field_input = TextInput( text=self.backend.getParameter('info_text').replace('\n', '#'), multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, 1), on_text_validate=self.infoTextButtonCallback) info_field_box.add_widget(self.info_field_input) settings_box.add_widget(info_field_box) #-------------------------------- settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-----------settings: core log fields ---------- settings_box.add_widget( Label(text='Field settings', size_hint=(1, None), height=self.getFieldHeight())) description_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) description_box.add_widget( Label(text='Field', size_hint=(1, None), height=self.getFieldHeight())) default_field_button = Button(text='Default value (?)', size_hint=(1, None), height=self.getFieldHeight(), is_focusable=False) default_field_button.bind(on_press=self.callbackDefaultValueHelpPopup) description_box.add_widget(default_field_button) skip_cursor_button = Button(text='Skip (?)', size_hint=(1, None), height=self.getFieldHeight(), is_focusable=False) skip_cursor_button.bind(on_press=self.callbackAutoCursorHelpPopup) description_box.add_widget(skip_cursor_button) settings_box.add_widget(description_box) for i in self.field_enable: #field label field_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) field_box.add_widget( Label(text=self.backend.getFieldLabel(i), size_hint=(1, 1))) #default value field self.default_value_field_widget[i] = TextInput( valign='middle', text=self.backend.getFieldDefault(i), multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, 1)) self.default_value_field_widget[i].bind( on_text_validate=self.saveDefaultValues) field_box.add_widget(self.default_value_field_widget[i]) #skip checkbox setup and bind self.field_auto_skip_checkbox[i] = CheckBox(size_hint=(1, 1)) if i in self.field_skip: self.field_auto_skip_checkbox[i].active = True self.field_auto_skip_checkbox[i].bind( active=self.saveSkipCheckboxes) field_box.add_widget(self.field_auto_skip_checkbox[i]) settings_box.add_widget(field_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height=self.getFieldHeight())) #spacer #-------settings: font size slider settings_box.add_widget( Label(text='Font size', size_hint=(1, None), height=self.getFieldHeight())) fontsize_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) self.font_size_slider = Slider(min=5, max=35, value=float(self.global_font_size)) self.font_size_slider.bind(value=self.fontSliderValueChange) self.font_size_label = Label(text=self.global_font_size, size_hint=(None, 1)) fontsize_box.add_widget(self.font_size_slider) fontsize_box.add_widget(self.font_size_label) settings_box.add_widget(fontsize_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-------settings: delete log box delete_log_box = BoxLayout(orientation='vertical', size_hint=(1, None), height=self.getFieldHeight(3)) delete_log_box.add_widget(Label(text='Delete log', size_hint=(1, 1))) delete_log_row_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight(1)) self.log_delete_spinner = Spinner(text='default', values=('default'), size_hint=(1, 1)) delete_log_row_box.add_widget(self.log_delete_spinner) delete_log_inner_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight(1)) delete_log_inner_box.add_widget( Label(text='Unlock', halign='right', size_hint=(0.5, None), height=self.getFieldHeight())) self.unlock_delete_log_checkbox = CheckBox(size_hint=(0.5, 1)) delete_log_inner_box.add_widget(self.unlock_delete_log_checkbox) delete_log_row_box.add_widget(delete_log_inner_box) delete_button = Button(text='Delete', size_hint=(1, 1), is_focusable=False) delete_button.bind(on_press=self.deleteButtonCallback) delete_log_row_box.add_widget(delete_button) delete_log_box.add_widget(delete_log_row_box) settings_box.add_widget(delete_log_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #dummy spacer #settings_box.add_widget(Label(text='',size_hint=(1, None),height=400)) sv.add_widget(settings_box) settings_tab.add_widget(sv) #-------------- logging tab ---------------------- self.log_tab = TabbedPanelItem(text='Log') fl = FloatLayout() log_tab_layout = AnchorLayout(anchor_x='left', anchor_y='top') log_input_layout = StackLayout(orientation='lr-tb', size_hint=(1, 1)) self.info_label = Label(text=self.backend.getParameter('info_text'), size_hint=(0.3, None), height=self.getFieldHeight(2)) log_input_layout.add_widget(self.info_label) for i in self.field_enable: field_box = BoxLayout(orientation='vertical', size_hint=(None, None), width=self.getFieldWidth( self.backend.getFieldInputWidth(i)), height=self.getFieldHeight(3)) #field_box=BoxLayout(orientation='vertical',size_hint=(self.backend.getFieldWidthHint(i),None),height=self.getFieldHeight(3)) field_box.add_widget( Label(text=self.backend.getFieldLabel(i), size_hint=(1, None), height=self.getFieldHeight(1))) self.field_widget[i] = TextInput( text=self.backend.getFieldDefault(i), multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, None), height=self.getFieldHeight(1)) self.field_widget_reverse_dict[self.field_widget[i]] = i self.field_widget[i].bind(on_text_validate=self.textFieldCallback) field_box.add_widget(self.field_widget[i]) log_input_layout.add_widget(field_box) self.save_button = Button(text='SAVE', size_hint=(0.2, None), height=self.getFieldHeight(3), is_focusable=False) self.save_button.bind(on_press=self.saveButtonCallback) log_input_layout.add_widget(self.save_button) self.edit_button = Button(text='EDIT', size_hint=(None, None), height=self.getFieldHeight(3), is_focusable=False) self.edit_button.bind(on_press=self.editButtonCallback) log_input_layout.add_widget(self.edit_button) log_tab_layout.add_widget(log_input_layout) bottom_layout = AnchorLayout(anchor_x='left', anchor_y='bottom') s = Splitter(sizable_from='top', size_hint=(1, 0.1), min_size=25) bottom_layout.add_widget(s) sv = ScrollView(size_hint=(1, 0.5), size=(300, 100), effect_cls=ScrollEffect) self.log_list = TextInput( text='', font_size=self.backend.getParameter('font_size') + 'dp', font_name='DejaVuSansMono.ttf', size=(2000, 3000), size_hint=(None, None)) sv.add_widget(self.log_list) s.add_widget(sv) fl.add_widget(log_tab_layout) fl.add_widget(bottom_layout) self.log_tab.add_widget(fl) #-------------- export tab ---------------------- export_tab = TabbedPanelItem(text='Export') export_box = BoxLayout(orientation='vertical', size_hint=(1, 0.5), spacing=25) export_box.add_widget( Label(text='Select log for export', size_hint=(1, 0.3))) self.log_export_select_spinner = Spinner(text='default', values=('default', 'Home', 'Work', 'Other', 'Custom'), size_hint=(1, 0.3)) export_box.add_widget(self.log_export_select_spinner) export_button = Button(text='Export to ADIF', size_hint=(1, 0.3), is_focusable=False) export_button.bind(on_press=self.exportLog) export_box.add_widget(export_button) export_tab.add_widget(export_box) #------------------------------------------------ #------------- about tab ------------------------ about_tab = TabbedPanelItem(text='About') about_box = BoxLayout(orientation='vertical', size_hint=(1, 1)) about = self.backend.version_string + '\n\nby LB9MG\n\nwww.lb9mg.no\n\[email protected]\n\nLog database is stored in\n/storage/sdcard0/MG-log/mg-log.sqlite3\n\n\nTo edit an entry:\nplace the cursor on a line\n and press EDIT.' about_box.add_widget( Label(text=about, halign='center', size_hint=(1, 1))) about_tab.add_widget(about_box) #------------------------------------------------ #adding all tabs in the right order self.main_tabbed_panel.add_widget(self.log_tab) self.main_tabbed_panel.add_widget(settings_tab) self.main_tabbed_panel.add_widget(export_tab) self.main_tabbed_panel.add_widget(about_tab) self.updateLogList() self.selectLog() self.log_select_spinner.bind(text=self.selectLog) self.backend.popupCallback = self.helpPopup self.field_widget[ self.field_enable[0]].focus = True #focus in the first field return self.main_tabbed_panel def setFontSize(self, size): size = str(int(self.font_size_slider.value)) self.backend.setParameter('font_size', size) kv = self.kvConfigString(size) self.main_window.clear_widgets() Builder.load_string(kv) self.main_window.add_widget(self.constructMainWindow()) def fontSliderValueChange(self, *dummy): text = str(int(self.font_size_slider.value)) self.font_size_label.text = text Clock.unschedule(self.setFontSize) Clock.schedule_once(self.setFontSize, 1.7) def on_pause(self, *dummy): return True def setWhiteFieldBackground(self, *dummy): self.field_widget[ self.field_enable[0]].background_color = self.color_white self.field_widget[self.field_enable[0]].focus = True return False def widthChange(self, *dummy): self.main_tabbed_panel.tab_width = 0.99 * ( self.main_tabbed_panel.size[0] / 4) def infoTextButtonCallback(self, *dummy): text_with_newline = self.info_field_input.text.replace('#', '\n') self.backend.setParameter('info_text', text_with_newline) self.info_label.text = text_with_newline def exportLog(self, *dummy): filename = self.backend.exportLog(self.log_export_select_spinner.text) msg = 'Exported to file :\n' + filename self.helpPopup(msg, title='Export') def saveDefaultValues(self, *dummy): default_values = {} for i in self.default_value_field_widget: default_values[i] = self.default_value_field_widget[i].text self.backend.setParameter('field_default', json.dumps(default_values)) def saveSkipCheckboxes(self, *dummy): skip_list = [] for i in self.field_auto_skip_checkbox: if self.field_auto_skip_checkbox[i].active: skip_list.append(i) self.backend.setParameter('field_skip', json.dumps(skip_list)) self.field_skip = skip_list def selectLog(self, *dummy): self.backend.selectLog(self.log_select_spinner.text) self.updateLog() def newLogButtonCallback(self, *dummy): name = self.new_log_name_field.text if len(name) > 0: self.backend.newLog(name) logs = self.backend.getLogList() self.log_select_spinner.values = tuple(logs) self.log_select_spinner.text = logs[-1] self.log_export_select_spinner.values = tuple(logs) self.log_export_select_spinner.text = logs[-1] self.log_delete_spinner.values = tuple(logs) self.log_delete_spinner.text = logs[-1] self.selectLog() self.helpPopup('New log has been created', title='New log') def updateLogList(self): logs = self.backend.getLogList() self.log_select_spinner.text = logs[0] self.log_select_spinner.values = tuple(logs) self.log_export_select_spinner.text = logs[0] self.log_export_select_spinner.values = tuple(logs) self.log_delete_spinner.text = logs[0] self.log_delete_spinner.values = tuple(logs) def createLogHelpButtonCallback(self, instance): self.helpPopup( 'Type new log name and\npress enter when\nyou are done.') def infoFieldHelpButtonCallback(self, instance): self.helpPopup( 'Contents of this field are shown in the log entry screen.\nYou can place your current callsign,\nQTH locator or place you are operating from.\n It can make spelling details about your station easier.\n\nUse # for newline.\n\nPress enter when\nyou are done.' ) def callbackDefaultValueHelpPopup(self, instance): self.helpPopup( 'It is the value that will\nbe filled by default.\n\nUse NOW for current time in the UTC field.\n\nAfter change you have to restart the application.\n\nPress enter when\nyou are done.' ) def callbackAutoCursorHelpPopup(self, instance): self.helpPopup( 'When you enter new QSO details\nand press ENTER the cursor will be moved\nto the next field. It will skip the fields checked below.\n\nCheck the fields that do not change often\n(eg. band and mode).\n\nAfter the last field is typed and ENTER pressed,\nthe QSO will be added to the log.\n\nChecked fields will also not be cleared after adding a QSO.' ) def helpPopup(self, help_text, title='Help'): content = BoxLayout(orientation='vertical', size_hint=(1, 1)) close_button = Button(text='Close', size_hint=(1, 0.2), is_focusable=False) content.add_widget(Label(text=help_text, halign='center')) content.add_widget(close_button) popup = Popup(title=title, content=content, auto_dismiss=False) # bind the on_press event of the button to the dismiss function close_button.bind(on_press=popup.dismiss) # open the popup popup.open() def textFieldCallback(self, *args): field = args[0] #there should be only one argument name = self.field_widget_reverse_dict[args[0]] self.current_field_index = self.field_enable.index(name) if self.current_field_index < len(self.field_enable) - 1: next_index = self.findNextAvailableField(self.current_field_index) if next_index >= 0: self.field_widget[self.field_enable[next_index]].focus = True else: self.saveButtonCallback() else: self.saveButtonCallback() def findNextAvailableField(self, min=0): next_index = min found = False while next_index < len(self.field_enable) - 1: next_index += 1 if self.field_enable[next_index] in self.field_skip: pass else: found = True break if found: return next_index else: return -1 def log(self, text): self.log_list.text = self.log_list.text + "\n" + text def updateLog(self): widths = self.backend.getFieldWidths() data = self.backend.getLogEntries() counter_format = '|%' + str(widths['no']) + 's|' output_text = '' self.entry_id_list = [] row_len = 0 for row in data: self.entry_id_list.append(row['id']) output_row = counter_format % row[ 'no'] #first 'border' and qso counter for column in self.field_enable: frmt = '%' + str(widths[column]) + 's|' addon = frmt % row[column] output_row = output_row + addon output_text = output_text + '\n' + output_row row_len = len(output_row) last_row = '\n+' for i in range(1, row_len - 1): last_row = last_row + '-' last_row = last_row + '+' output_text = output_text + last_row self.entry_id_list.append(-1) #the last row will have a magic number self.log_list.text = output_text[1:] #get rid of the first newline def saveButtonCallback(self, *dummy_args): #check if the callsign is not empty if len(self.field_widget[self.field_enable[0]].text) < 2: self.field_widget[ self.field_enable[0]].background_color = self.color_red self.field_widget[self.field_enable[0]].focus = True Clock.schedule_once(self.setWhiteFieldBackground, 0.8) return #read data from text fields row = [] for i in self.field_enable: row.append(self.field_widget[i].text.strip()) if self.edit_id > 0: self.backend.editEntry(self.edit_id, row) else: self.backend.addEntry(row) #restore default values if self.edit_id > 0: #this was edited, restore ALL fields for i in self.field_enable: self.field_widget[i].text = self.backend.getFieldDefault(i) else: #this was a new entry, selected fields for i in self.field_enable: if i not in self.field_skip: self.field_widget[i].text = self.backend.getFieldDefault(i) #move back to the first field #first_index = self.findNextAvailableField(-1); #start looking from the beginning #if first_index >= 0: # self.field_widget[self.field_enable[first_index]].focus=True self.updateLog() #update log view self.edit_id = False self.field_widget[self.field_enable[0]].focus = True def editButtonCallback(self, *args): col, row = self.log_list.cursor if row < len(self.entry_id_list): self.edit_id = self.entry_id_list[row] if self.edit_id == -1 or self.edit_id == 0: #if the first or the last line is 'selected' (or not selected at all) - fetch the first QSO self.edit_id = self.entry_id_list[1] if self.edit_id > 0: data = self.backend.getLogEntries(limit=1, entry_id=self.edit_id) entry = data[0] for i in self.field_enable: self.field_widget[i].text = entry[i] self.field_widget[ self.field_enable[0]].focus = True #set first field focus def deleteButtonCallback(self, *dummy): if self.unlock_delete_log_checkbox.active: r = self.backend.deleteLog(self.log_delete_spinner.text) if r: self.helpPopup('Log has been deleted', title='Delete log') self.updateLogList() self.selectLog() else: self.helpPopup( 'There must be at least\none log in the database.\n\nLog has NOT been deleted', title='Delete log')
class MainApp(App): def __init__(self, _GabrielClient, **kwargs): super().__init__(**kwargs) self.Client = _GabrielClient def build(self): self.GabrielPage = FloatLayout() self.EditPage = FloatLayout() self.SettingsPage = FloatLayout() self.MainMenu = TabbedPanel(background_color=(1, 1, 1, 1), default_tab_text='Габриэль', default_tab_content=self.GabrielPage) self.EditMenu = TabbedPanelItem(text='Edit') self.SettingsMenu = TabbedPanelItem(text='Settings') self.MainMenu.add_widget(self.EditMenu) self.MainMenu.add_widget(self.SettingsMenu) self.In_GabrielPage() self.In_EditPage() self.In_SettingsPage() return self.MainMenu def In_GabrielPage(self): self.GabrielPage.add_widget( Image(source='./Resurses/main.jpg', color=(1, 1, 1, 0.5))) self.GabrielPage.add_widget( Button(text="LOGIN IN", on_press=self.LoginGab, size_hint=(None, None), size=(100, 50), pos=(0, 0))) def In_EditPage(self): self.EditMenu.add_widget(self.EditPage) self.EditPage_InformationMenu = FloatLayout() self.EditPage.add_widget(self.EditPage_InformationMenu) self._SelectUser = Spinner(text='Не выбран', size_hint=(None, None), size=(100, 30), pos=(0, 1000), on_press=self.find_members, on_text=self.GetInfoUser) self.EditPage.add_widget(self._SelectUser) def In_SettingsPage(self): self.SettingsMenu.add_widget(self.SettingsPage) self.SettingsPage.add_widget(Label(text="Настройки типа тут будут ")) def LoginGab(self, button): self.GabrielPage.remove_widget(button) threading.Thread(target=self.Client.run, args=(token, )).start() def find_members(self, _Spinner): if _Spinner.text == "Не выбран": self.Users = [] for file in os.listdir("./Statictics/"): self.Users.append( GabrielUser.Open(int(file.split(".gabriel")[0]), Save=False)) _Spinner.values = tuple([str(a.Name) for a in self.Users]) self.GetInfoUser(_Spinner) else: self.GetInfoUser(_Spinner) def GetInfoUser(self, _Spinner): Layout = GridLayout(cols=5) try: User = [user for user in self.Users if user.Name == _Spinner.text][0] except: return for Varname in User.__dir__(): value = User.__getattribute__(Varname) if type(value) in [str, int, float, bool, list, tuple]: ti = TextInput(text=str(value), size_hint=(None, None), size=(300, 50), background_color=(.3, 1, .6, .7)) ti.add_widget(Label(text=str(Varname), color=(1, 0, 0, 1))) Layout.add_widget(ti) self.EditPage_InformationMenu.add_widget(Layout)
def __init__(self, df, security_name, **kwargs): super(Application, self).__init__(**kwargs) self.orientation = 'vertical' tab_panel = TabbedPanel() tab_panel.do_default_tab = False tab_panel.background_color = (7 / 255, 0, 13 / 255, 1) tab_menu = TabbedPanelItem(text="Menu") tab_menu.background_color = (62 / 255, 142 / 255, 222 / 255, 1) tab_chart = TabbedPanelItem(text='Chart') tab_chart.background_color = (62 / 255, 142 / 255, 222 / 255, 1) tab_training = TabbedPanelItem(text='Training') tab_training.background_color = (62 / 255, 142 / 255, 222 / 255, 1) tab_validate = TabbedPanelItem(text='Validate') tab_validate.background_color = (62 / 255, 142 / 255, 222 / 255, 1) tab_future = TabbedPanelItem(text='Prediction') tab_future.background_color = (62 / 255, 142 / 255, 222 / 255, 1) tab_panel.add_widget(tab_menu) tab_panel.add_widget(tab_chart) tab_panel.add_widget(tab_training) tab_panel.add_widget(tab_validate) tab_panel.add_widget(tab_future) tab_menu.bind(on_press=lambda x: change_screen('menu')) chart_layout = FloatLayout() fig = plot_data(df, security_name.upper(), 30, 200) canvas = fig.canvas chart_layout.add_widget(canvas) tab_chart.add_widget(chart_layout) predict_frame = FloatLayout(opacity=1) predict_btn = Button(text='Run Prediction', background_color=(62 / 255, 142 / 255, 222 / 255, 1), font_size=20, pos_hint={ "center_x": 0.5, "bottom": 0 }, size_hint=(0.3, 0.075)) predict_btn.bind(on_press=lambda x: start_predict(df, security_name)) predict_frame.add_widget(predict_btn) chart_layout.add_widget(predict_frame) def start_predict(df, security_name): que = queue.Queue() par_modeling = partial(modeling, security_name=security_name) process = threading.Thread( target=lambda q, arg1: q.put(par_modeling(arg1)), args=(que, df), daemon=True) process.start() Clock.schedule_once( lambda *args: tab_panel.switch_to(tab_training)) train_fig = plt.figure(facecolor='#07000d') train_canvas = train_fig.canvas train_layout = FloatLayout() train_layout.add_widget(train_canvas) tab_training.add_widget(train_layout) if os.path.exists('training.csv'): os.remove('training.csv') def update_plot(fig): train_canvas = fig.canvas train_layout.clear_widgets() train_layout.add_widget(train_canvas) plt.close(fig) # for child in train_layout.children[:1]: # train_layout.remove_widget(child) # Clock.schedule_once(lambda *args: tab_panel.switch_to(tab_training)) def read_training(self): if os.path.exists('training.csv'): loss_df = None try: loss_df = pd.read_csv('training.csv') except Exception as e: print(e) pass if loss_df is not None: train_fig = plot_loss(loss_df) update_plot(train_fig) if not process.is_alive(): Clock.unschedule(read_training) val_fig, future_fig = que.get() val_canvas = val_fig.canvas val_layout = FloatLayout() val_layout.add_widget(val_canvas) tab_validate.add_widget(val_layout) future_canvas = future_fig.canvas future_layout = FloatLayout() future_layout.add_widget(future_canvas) tab_future.add_widget(future_layout) Clock.schedule_once( lambda *args: tab_panel.switch_to(tab_validate)) Clock.schedule_interval(read_training, 0.1) Clock.schedule_once(lambda *args: tab_panel.switch_to(tab_chart)) self.add_widget(tab_panel)
def create_editor_tab(self, filename=None): tab2 = TabbedPanelItem(text="Editor") editor = EditorWidget(self, tab2, filename) tab2.add_widget(editor) self.add_widget(tab2) self.activate_newest_tab()
def create_editor_tab(self, filename = None): tab2 = TabbedPanelItem(text="Editor") editor = EditorWidget(self, tab2, filename) tab2.add_widget(editor) self.add_widget(tab2) self.activate_newest_tab()
def finalize(self, *args): """Add my tabs""" if not self.canvas: Clock.schedule_once(self.finalize, 0) return deck_builder_kwargs = { 'pos_hint': { 'x': 0, 'y': 0 }, 'starting_pos_hint': { 'x': 0.05, 'top': 0.95 }, 'card_size_hint': (0.3, 0.4), 'card_hint_step': (0, -0.1), 'deck_x_hint_step': 0.4 } self._tabs = TabbedPanel(size=self.size, pos=self.pos, do_default_tab=False) self.bind(size=self._tabs.setter('size'), pos=self._tabs.setter('pos')) self.add_widget(self._tabs) for functyp in 'trigger', 'prereq', 'action': tab = TabbedPanelItem(text=functyp.capitalize()) setattr(self, '_{}_tab'.format(functyp), tab) self._tabs.add_widget(getattr(self, '_{}_tab'.format(functyp))) builder = DeckBuilderView(**deck_builder_kwargs) setattr(self, '_{}_builder'.format(functyp), builder) builder.bind( decks=getattr(self, '_trigger_push_{}s'.format(functyp))) scroll_left = DeckBuilderScrollBar(size_hint_x=0.01, pos_hint={ 'x': 0, 'y': 0 }, deckbuilder=builder, deckidx=0, scroll_min=0) setattr(self, '_scroll_left_' + functyp, scroll_left) scroll_right = DeckBuilderScrollBar(size_hint_x=0.01, pos_hint={ 'right': 1, 'y': 0 }, deckbuilder=builder, deckidx=1, scroll_min=0) setattr(self, '_scroll_right_' + functyp, scroll_right) layout = FloatLayout() setattr(self, '_{}_layout'.format(functyp), layout) tab.add_widget(layout) layout.add_widget(builder) layout.add_widget(scroll_left) layout.add_widget(scroll_right) layout.add_widget( Label(text='Used', pos_hint={ 'center_x': 0.1, 'center_y': 0.98 }, size_hint=(None, None))) layout.add_widget( Label(text='Unused', pos_hint={ 'center_x': 0.5, 'center_y': 0.98 }, size_hint=(None, None))) self.bind(rule=getattr(self, '_trigger_pull_{}s'.format(functyp)))
class ZhonxGUIApp(App): def connect(self, instance, value): print('the switch', instance, 'is', value) if value == True: try: self.connection = serial.Serial(self.dlPort.text, self.dlBaudrate.text) except Exception as e: # instance.active = False print(e) else: try: self.connection.close() except Exception as e: # instance.active = True print(e) def build(self): self.availablePorts = listSerialPorts() if len(self.availablePorts) == 0: self.availablePorts.append("----") tabbedPannel = TabbedPanel(do_default_tab=False) # Connection Tab self.connectionTab = TabbedPanelItem(text="Connection") self.layout1 = BoxLayout(orientation='vertical', spacing=10, padding=(200, 200)) self.connectionTab.add_widget(self.layout1) self.lblSerialSettings = Label(text="Connection settings") self.layout1.add_widget(self.lblSerialSettings) self.dlBaudrate = Spinner(values = ["57600", "115200", "230400", "460800", "921600"], text = "115200") self.layout1.add_widget(self.dlBaudrate) self.dlPort = Spinner(values = self.availablePorts, text = self.availablePorts[0]) self.layout1.add_widget(self.dlPort) self.btnConnect = Switch() self.btnConnect.bind(active = self.connect) self.layout1.add_widget(self.btnConnect) # Graph tab self.graphTab = TabbedPanelItem(text = "Graph") # self.layout2 = BoxLayout(orientation='vertical', spacing=10, padding=(200, 200)) # self.graphTab.add_widget(self.layout2) graph = Graph(xlabel='X', ylabel='Y', x_ticks_minor=5, x_ticks_major=25, y_ticks_major=1, y_grid_label=True, x_grid_label=True, padding=5, x_grid=True, y_grid=True, xmin=-0, xmax=100, ymin=-1, ymax=1) plot = MeshLinePlot(color=[1, 1, 0, 1]) plot.points = [(x, sin(x / 10.)) for x in range(0, 101)] graph.add_plot(plot) self.graphTab.add_widget(graph) tabbedPannel.add_widget(self.connectionTab) tabbedPannel.add_widget(self.graphTab) return tabbedPannel
def finalize(self, *args): if self.canvas is None: Clock.schedule_once(self.finalize, 0) return deck_builder_kwargs = { 'pos_hint': { 'x': 0, 'y': 0 }, 'starting_pos_hint': { 'x': 0.05, 'top': 0.95 }, 'card_size_hint': (0.3, 0.4), 'card_hint_step': (0, -0.1), 'deck_x_hint_step': 0.4 } self._headline = Label(size_hint_y=0.05, pos_hint={ 'top': 1, 'center_x': 0.5 }, text=self.headline_text) self.bind(headline_text=self._headline.setter('text')) self.add_widget(self._headline) self._box = BoxLayout(size_hint_y=0.95, pos_hint={'top': 0.95}) self.add_widget(self._box) self._list = RulesList(rulebook=self.rulebook, rulesview=self, size_hint_x=0.33) self.bind(rulebook=self._list.setter('rulebook')) self._box.add_widget(self._list) self._tabs = TabbedPanel(do_default_tab=False) self._box.add_widget(self._tabs) for functyp in 'trigger', 'prereq', 'action': tab = TabbedPanelItem(text=functyp.capitalize()) setattr(self, '_{}_tab'.format(functyp), tab) self._tabs.add_widget(getattr(self, '_{}_tab'.format(functyp))) builder = DeckBuilderView(**deck_builder_kwargs) setattr(self, '_{}_builder'.format(functyp), builder) builder.bind( decks=getattr(self, '_trigger_push_{}s'.format(functyp))) scroll_left = DeckBuilderScrollBar(size_hint_x=0.01, pos_hint={ 'x': 0, 'y': 0 }, deckbuilder=builder, deckidx=0, scroll_min=0) setattr(self, '_scroll_left_' + functyp, scroll_left) scroll_right = DeckBuilderScrollBar(size_hint_x=0.01, pos_hint={ 'right': 1, 'y': 0 }, deckbuilder=builder, deckidx=1, scroll_min=0) setattr(self, '_scroll_right_' + functyp, scroll_right) layout = FloatLayout() setattr(self, '_{}_layout'.format(functyp), layout) tab.add_widget(layout) layout.add_widget(builder) layout.add_widget(scroll_left) layout.add_widget(scroll_right) layout.add_widget( Label(text='Used', pos_hint={ 'center_x': 0.1, 'center_y': 0.98 }, size_hint=(None, None))) layout.add_widget( Label(text='Unused', pos_hint={ 'center_x': 0.5, 'center_y': 0.98 }, size_hint=(None, None))) self.bind(rule=getattr(self, '_trigger_pull_{}s'.format(functyp)))
class MainBox(BoxLayout): ''' Mainbox class ''' def __init__(self, **kwargs): ''' Init main class ui ''' super(MainBox, self).__init__(**kwargs) self.f_size = '15sp' # Shape Widget self.shape = Shape(size_hint=(0.7, 1)) self.add_widget(self.shape) # Right Menu self.panel = TabbedPanel(size_hint=(0.3, 1), do_default_tab=False) self.tab_param = TabbedPanelItem(text='Parameters') self.tab_color = TabbedPanelItem(text='Shape') self.tab_color_bg = TabbedPanelItem(text='Background') self.tab_export = TabbedPanelItem(text='Export') self.panel.add_widget(self.tab_param) self.panel.add_widget(self.tab_color) self.panel.add_widget(self.tab_color_bg) self.panel.add_widget(self.tab_export) self.menu_right = RightMenu( padding=15, orientation="vertical") # Switch mode line self.box_switch = BoxLayout(orientation='horizontal') self.mode_label = Label( text="Line mode", font_size=self.f_size, markup=True) self.box_switch.add_widget(self.mode_label) self.switch_mode = Switch(active=False) self.switch_mode.bind(active=self.on_switch) self.box_switch.add_widget(self.switch_mode) self.menu_right.add_widget(self.box_switch) # Size value self.box_size = BoxLayout(orientation='horizontal') self.size_label = Label( text="Shape size", font_size=self.f_size, markup=True) self.size_label_value = Label( text=str(self.shape.shape_size), font_size=self.f_size, markup=True) self.box_size.add_widget(self.size_label) self.box_size.add_widget(self.size_label_value) self.slider_shape_size = Slider( min=self.shape.property('shape_size').get_min(self.shape), max=self.shape.property('shape_size').get_max(self.shape), value=self.shape.shape_size, step=1) self.slider_shape_size.bind(value=self.change_shape_size) self.menu_right.add_widget(self.box_size) self.menu_right.add_widget(self.slider_shape_size) # Width point or line self.box_stroke = BoxLayout(orientation='horizontal') self.wdth_label = Label( text="Stroke width", font_size=self.f_size, markup=True) self.wdth_label_value = Label( text=str(self.shape.wdth), font_size=self.f_size, markup=True) self.box_stroke.add_widget(self.wdth_label) self.box_stroke.add_widget(self.wdth_label_value) self.slider_wdth = Slider( min=self.shape.property('wdth').get_min(self.shape), max=self.shape.property('wdth').get_max(self.shape), value=self.shape.wdth, step=1) self.slider_wdth.bind(value=self.change_wdth) self.menu_right.add_widget(self.box_stroke) self.menu_right.add_widget(self.slider_wdth) # a value self.box_a = BoxLayout(orientation='horizontal') self.a_label = Label( text="Param a ", font_size=self.f_size, markup=True) self.a_label_value = Label( text=str(self.shape.a), font_size=self.f_size, markup=True) self.box_a.add_widget(self.a_label) self.box_a.add_widget(self.a_label_value) self.slider_a = Slider( min=self.shape.property('a').get_min(self.shape), max=self.shape.property('a').get_max(self.shape), value=self.shape.a) self.slider_a.bind(value=self.change_a) self.menu_right.add_widget(self.box_a) self.menu_right.add_widget(self.slider_a) # b value self.box_b = BoxLayout(orientation='horizontal') self.b_label = Label( text="Param b ", font_size=self.f_size, markup=True) self.b_label_value = Label( text=str(self.shape.b), font_size=self.f_size, markup=True) self.box_b.add_widget(self.b_label) self.box_b.add_widget(self.b_label_value) self.slider_b = Slider( min=self.shape.property('b').get_min(self.shape), max=self.shape.property('b').get_max(self.shape), value=self.shape.b) self.slider_b.bind(value=self.change_b) self.menu_right.add_widget(self.box_b) self.menu_right.add_widget(self.slider_b) # m value self.box_m = BoxLayout(orientation='horizontal') self.m_label = Label( text="Param m ", font_size=self.f_size, markup=True) self.m_label_value = Label( text=str(self.shape.m), font_size=self.f_size, markup=True) self.box_m.add_widget(self.m_label) self.box_m.add_widget(self.m_label_value) self.slider_m = Slider( min=self.shape.property('m').get_min(self.shape), max=self.shape.property('m').get_max(self.shape), value=self.shape.m) self.slider_m.bind(value=self.change_m) self.menu_right.add_widget(self.box_m) self.menu_right.add_widget(self.slider_m) # n1 value self.box_n1 = BoxLayout(orientation='horizontal') self.n1_label = Label( text="Param n1 ", font_size=self.f_size, markup=True) self.n1_label_value = Label( text=str(self.shape.n1), font_size=self.f_size, markup=True) self.box_n1.add_widget(self.n1_label) self.box_n1.add_widget(self.n1_label_value) self.slider_n1 = Slider( min=self.shape.property('n1').get_min(self.shape), max=self.shape.property('n1').get_max(self.shape), value=self.shape.n1) self.slider_n1.bind(value=self.change_n1) self.menu_right.add_widget(self.box_n1) self.menu_right.add_widget(self.slider_n1) # n2 value self.box_n2 = BoxLayout(orientation='horizontal') self.n2_label = Label( text="Param n2 ", font_size=self.f_size, markup=True) self.n2_label_value = Label( text=str(self.shape.n2), font_size=self.f_size, markup=True) self.box_n2.add_widget(self.n2_label) self.box_n2.add_widget(self.n2_label_value) self.slider_n2 = Slider( min=self.shape.property('n2').get_min(self.shape), max=self.shape.property('n2').get_max(self.shape), value=self.shape.n2) self.slider_n2.bind(value=self.change_n2) self.menu_right.add_widget(self.box_n2) self.menu_right.add_widget(self.slider_n2) # n3 value self.box_n3 = BoxLayout(orientation='horizontal') self.n3_label = Label( text="Param n3 ", font_size=self.f_size, markup=True) self.n3_label_value = Label( text=str(self.shape.n3), font_size=self.f_size, markup=True) self.box_n3.add_widget(self.n3_label) self.box_n3.add_widget(self.n3_label_value) self.slider_n3 = Slider( min=self.shape.property('n3').get_min(self.shape), max=self.shape.property('n3').get_max(self.shape), value=self.shape.n3) self.slider_n3.bind(value=self.change_n3) self.menu_right.add_widget(self.box_n3) self.menu_right.add_widget(self.slider_n3) # Nb points self.box_nbp = BoxLayout(orientation='horizontal') self.nbp_label = Label( text="Points number ", font_size=self.f_size, markup=True) self.nbp_label_value = Label( text=str(self.shape.nbp), font_size=self.f_size, markup=True) self.box_nbp.add_widget(self.nbp_label) self.box_nbp.add_widget(self.nbp_label_value) self.slider_nbp = Slider( min=self.shape.property('nbp').get_min(self.shape), max=self.shape.property('nbp').get_max(self.shape), value=self.shape.nbp, step=2) self.slider_nbp.bind(value=self.change_nbp) self.menu_right.add_widget(self.box_nbp) self.menu_right.add_widget(self.slider_nbp) # Percent self.box_percent = BoxLayout(orientation='horizontal') self.percent_label = Label( text="Percent ", font_size=self.f_size, markup=True) self.percent_label_value = Label( text=str(self.shape.percent), font_size=self.f_size, markup=True) self.box_percent.add_widget(self.percent_label) self.box_percent.add_widget(self.percent_label_value) self.slider_percent = Slider( min=self.shape.property('percent').get_min(self.shape), max=self.shape.property('percent').get_max(self.shape), value=self.shape.percent, step=1) self.slider_percent.bind(value=self.change_percent) self.menu_right.add_widget(self.box_percent) self.menu_right.add_widget(self.slider_percent) # Travel self.box_travel = BoxLayout(orientation='horizontal') self.travel_label = Label( text="Travel ", font_size=self.f_size, markup=True) self.travel_label_value = Label( text=str(self.shape.travel), font_size=self.f_size, markup=True) self.box_travel.add_widget(self.travel_label) self.box_travel.add_widget(self.travel_label_value) self.slider_travel = Slider( min=self.shape.property('travel').get_min(self.shape), max=self.shape.property('travel').get_max(self.shape), value=self.shape.travel, step=2) self.slider_travel.bind(value=self.change_travel) self.menu_right.add_widget(self.box_travel) self.menu_right.add_widget(self.slider_travel) # ColorPicker for Shape self.picker = ColorPicker() self.picker.bind(color=self.on_color) # ColorPicker for background self.picker_bg = ColorPicker() self.picker_bg.bind(color=self.on_color_bg) # Export svg button self.export_button = Button(text='Export', size_hint=(1, 0.15)) self.export_button.bind(on_press=self.export) # Tab packs self.tab_param.add_widget(self.menu_right) self.tab_color.add_widget(self.picker) self.tab_color_bg.add_widget(self.picker_bg) self.tab_export.add_widget(self.export_button) self.add_widget(self.panel) # Popups self.pop_export = Popup( title="Export file", content=Label(text="File exported"), size_hint=(None, None), size=(640, 240)) def change_wdth(self, *args): ''' Change stroke width ''' self.shape.wdth = self.slider_wdth.value self.wdth_label_value.text = str(self.slider_wdth.value) def on_switch(self, *args): ''' Switch mode line or point ''' self.shape.line = self.switch_mode.active def on_color(self, *args): ''' Shape color ''' self.shape.color = self.picker.hex_color def on_color_bg(self, *args): ''' Shape background color ''' self.shape.bg_color = self.picker_bg.hex_color def change_shape_size(self, *args): ''' Shape size ''' self.shape.shape_size = self.slider_shape_size.value self.size_label_value.text = str(self.slider_shape_size.value) def change_a(self, *args): ''' a value ''' self.shape.a = self.slider_a.value self.a_label_value.text = str(self.slider_a.value) def change_b(self, *args): ''' b value ''' self.shape.b = self.slider_b.value self.b_label_value.text = str(self.slider_b.value) def change_m(self, *args): ''' m value ''' self.shape.m = self.slider_m.value self.m_label_value.text = str(self.slider_m.value) def change_n1(self, *args): ''' n1 value ''' self.shape.n1 = self.slider_n1.value self.n1_label_value.text = str(self.slider_n1.value) def change_n2(self, *args): ''' n2 value ''' self.shape.n2 = self.slider_n2.value self.n2_label_value.text = str(self.slider_n2.value) def change_n3(self, *args): ''' n3 value ''' self.shape.n3 = self.slider_n3.value self.n3_label_value.text = str(self.slider_n3.value) def change_nbp(self, *args): ''' point number ''' self.shape.nbp = self.slider_nbp.value self.nbp_label_value.text = str(self.slider_nbp.value) def change_percent(self, *args): ''' Percent value ''' self.shape.percent = self.slider_percent.value self.percent_label_value.text = str(self.slider_percent.value) def change_travel(self, *args): ''' Travel number ''' self.shape.travel = self.slider_travel.value self.travel_label_value.text = str(self.slider_travel.value) def export(self, *args): ''' Export to svg file ''' document = svgwrite.Drawing(filename='export.svg', debug=True) tmp = [(float("%.4g" % e)) for e in self.shape.path] # Export polygon if self.shape.line: svg_path = coupled(tmp) document.add(document.polygon(points=svg_path)) else: # Export points svg_path = coupled(coupled(tmp)) for elem in svg_path: document.add(document.line( start=elem[0], end=elem[1] )) document.save() self.shape.export_to_png('export.png') self.pop_export.open()
def build_layout(self): box_base = BoxLayout(orientation="vertical", padding=0) ctrl_box_haut = BoxLayout(orientation="horizontal", padding=10, size_hint_y=None) # Nom de l'individu ctrl_label = Label(text="[color=000000][size=28][b]%s[/b][/size][/color]" % self.dictIndividu["nomComplet"], markup=True, size_hint_y=None) ctrl_box_haut.add_widget(ctrl_label) # Photo photo = self.dictIndividu["photo"] if photo == None : if self.dictIndividu["IDcivilite"] == 1 : photo = UTILS_Images.GetTextureFromFichier("images/homme.png") if self.dictIndividu["IDcivilite"] in (2, 3) : photo = UTILS_Images.GetTextureFromFichier("images/femme.png") if self.dictIndividu["IDcivilite"] == 4 : photo = UTILS_Images.GetTextureFromFichier("images/garcon.png") if self.dictIndividu["IDcivilite"] == 5 : photo = UTILS_Images.GetTextureFromFichier("images/fille.png") if photo != None : ctrl_image = Image(texture=photo, size_hint_x=None) ctrl_box_haut.add_widget(ctrl_image) box_base.add_widget(ctrl_box_haut) # Onglets ctrl_onglets = TabbedPanel(do_default_tab=False, padding=10, tab_pos='top_left') # Vertical=left_bottom box_base.add_widget(ctrl_onglets) liste_onglets = [ {"code":"messages", "titre":u"Messages"}, {"code":"identite", "titre":u"Identité"}, {"code":"liens", "titre":u"Liens"}, {"code":"coordonnees", "titre":u"Coordonnées"}, {"code":"scolarite", "titre":u"Scolarité"}, {"code":"activites", "titre":u"Activités"}, {"code":"medical", "titre":u"Médical"}, ] for dictOnglet in liste_onglets : onglet = TabbedPanelItem(id=dictOnglet["code"], text=dictOnglet["titre"]) doc = RstDocument(text=self.GetTexteOnglet(dictOnglet["code"])) onglet.add_widget(doc) ctrl_onglets.add_widget(onglet) # Barre d'état grid = GridLayout(cols=3, row=1, row_force_default=True, row_default_height=30, spacing=(5, 5), padding=10, size_hint=(1, None), height=50) grid.canvas.before.add(Color(0.128, 0.128, 0.128)) def redraw(self, args): grid.bg_rect.size = self.size grid.bg_rect.pos = self.pos with grid.canvas.before: grid.bg_rect = Rectangle(pos=grid.pos, size=grid.size) grid.bind(pos=redraw, size=redraw) #ctrl_bouton = Button(id="consommations", text="Consommations", width=200, size_hint=(None, None)) #grid.add_widget(ctrl_bouton) box_base.add_widget(grid) # Finalisation du layout self.add_widget(box_base)
def finalize(self, *args): """Add my tabs""" if not self.canvas: Clock.schedule_once(self.finalize, 0) return deck_builder_kwargs = { 'pos_hint': {'x': 0, 'y': 0}, 'starting_pos_hint': {'x': 0.05, 'top': 0.95}, 'card_size_hint': (0.3, 0.4), 'card_hint_step': (0, -0.1), 'deck_x_hint_step': 0.4 } self._tabs = TabbedPanel( size=self.size, pos=self.pos, do_default_tab=False ) self.bind( size=self._tabs.setter('size'), pos=self._tabs.setter('pos') ) self.add_widget(self._tabs) for functyp in 'trigger', 'prereq', 'action': tab = TabbedPanelItem(text=functyp.capitalize()) setattr(self, '_{}_tab'.format(functyp), tab) self._tabs.add_widget(getattr(self, '_{}_tab'.format(functyp))) builder = DeckBuilderView(**deck_builder_kwargs) setattr(self, '_{}_builder'.format(functyp), builder) builder.bind(decks=getattr(self, '_trigger_push_{}s'.format(functyp))) scroll_left = DeckBuilderScrollBar( size_hint_x=0.01, pos_hint={'x': 0, 'y': 0}, deckbuilder=builder, deckidx=0, scroll_min=0 ) setattr(self, '_scroll_left_' + functyp, scroll_left) scroll_right = DeckBuilderScrollBar( size_hint_x=0.01, pos_hint={'right': 1, 'y': 0}, deckbuilder=builder, deckidx=1, scroll_min=0 ) setattr(self, '_scroll_right_' + functyp, scroll_right) layout = FloatLayout() setattr(self, '_{}_layout'.format(functyp), layout) tab.add_widget(layout) layout.add_widget(builder) layout.add_widget(scroll_left) layout.add_widget(scroll_right) layout.add_widget( Label( text='Used', pos_hint={'center_x': 0.1, 'center_y': 0.98}, size_hint=(None, None) ) ) layout.add_widget( Label( text='Unused', pos_hint={'center_x': 0.5, 'center_y': 0.98}, size_hint=(None, None) ) ) self.bind(rule=getattr(self, '_trigger_pull_{}s'.format(functyp)))
class GameScreen(Screen): # on_enter is used instead of __init__ as we require SelectableGrid.chosen to be not empty and contain the names of the three Pokemon selected by the player. def on_enter(self): # Start by bringing in the global dictionary pokemon_info global pokemon_info # Initiate variables for the Pokemon chosen by the player, number of Pokemon beaten, number of trainers beaten, and possible Pokemon that can be generated. player_pokemon = SelectableGrid.chosen self.btn = SoundLoader.load('assets/button.wav') self.pkm_beaten = 0 self.yours_beaten = 0 self.trainers_beaten = 0 self.pbl_images = [ 'assets/threeballs.png', 'assets/twoballs.png', 'assets/oneball.png' ] self.possible_pokemon = list(pokemon_info.keys()) # Create three variables, each one an instance of the Pokemon class, as well as randomize an opposing Pokemon from the pool of Pokemon as an instance of the Pokemon class. self.pkm1, self.pkm2, self.pkm3 = Pokemon(player_pokemon[0]), Pokemon( player_pokemon[1]), Pokemon(player_pokemon[2]) self.opkm = Pokemon(random.choice(self.possible_pokemon)) # Simulating a DS, our layout will start with the BoxLayout in vertical form. self.layout = BoxLayout(orientation='vertical') # self.top_screen displays the information for the player, including the current and max HP of both Pokemon, their levels, names, sprites. self.top_screen = GridLayout(cols=2, rows=2, size_hint=(1, 0.7)) # Sets up and displays the opposing Pokemon's name, health, and level. self.opponent_info = GridLayout(cols=1, rows=3, size_hint=(1, 0.5)) self.opponent_name_level = Label(text=self.opkm.name + ' Lv50', font_size=18, valign='middle', halign='left') self.opponent_info.add_widget(self.opponent_name_level) self.opponent_hp = Label(text=str(self.opkm.chp) + '/' + str(self.opkm.maxhp), font_size=16, valign='top') self.opponent_info.add_widget(self.opponent_hp) self.opponent_pkm_left = Image(source=self.pbl_images[self.pkm_beaten]) self.opponent_info.add_widget(self.opponent_pkm_left) self.top_screen.add_widget(self.opponent_info) # Displays the image for both Pokemon. self.oimg = Image(source=self.opkm.imgf) self.top_screen.add_widget(self.oimg) self.mimg = Image(source=self.pkm1.imgb) self.top_screen.add_widget(self.mimg) # Sets up and displays my Pokemon's name, health, and level. self.my_info = GridLayout(cols=1, rows=3, size_hint=(1, 0.5)) self.my_name_level = Label(text=self.pkm1.name + ' Lv50', font_size=18, valign='middle', halign='left') self.my_info.add_widget(self.my_name_level) self.my_hp = Label(text=str(self.pkm1.chp) + '/' + str(self.pkm1.maxhp), font_size=16, valign='top') self.my_info.add_widget(self.my_hp) self.my_pkm_left = Image(source=self.pbl_images[self.yours_beaten]) self.my_info.add_widget(self.my_pkm_left) # Add the whole of the top screen into the main layout. self.top_screen.add_widget(self.my_info) self.layout.add_widget(self.top_screen) # Create and add a label that shows the progress of the battle, which will be constantly updated as the user takes action. self.textbox = Label(text='Battle progress shows up here!', font_size=14, valign='top', halign='center', size_hint=(1, 0.3)) self.layout.add_widget(self.textbox) # The bottom screen will allow the user to put in their actions. In our case, we do not need the 'Bag' and 'Run' tab from the original Pokemon game, so a TabbedPanel spanning two tab items would suffice. self.btm_screen = TabbedPanel(do_default_tab=False, tab_width=250) # Add in our tabs, either to fight or to switch out. self.fight_tab = TabbedPanelItem(text='Fight') self.switch_tab = TabbedPanelItem(text='Pokemon') # Creating the page for using a move, which is selected initially self.fight_page = GridLayout(cols=2, col_default_width=250, col_force_default=True, row_default_height=150, row_force_default=True) # Initializing the moves for all three Pokemon. self.pkm1_moves = pokemon_info[self.pkm1.name]['moves'] self.pkm2_moves = pokemon_info[self.pkm2.name]['moves'] self.pkm3_moves = pokemon_info[self.pkm3.name]['moves'] # Adding buttons for each move the Pokemon has. self.move1_btn = Button( text=self.pkm1_moves[0] + '\n' + 'PP: ' + str(self.pkm1.this_moveset[self.pkm1_moves[0]]['cPP']) + '/' + str(self.pkm1.this_moveset[self.pkm1_moves[0]]['PP']) + '\n' + 'Type: ' + str(self.pkm1.this_moveset[self.pkm1_moves[0]]['Type']), font_size=16, halign='center', on_press=self.use_attack) self.move2_btn = Button( text=self.pkm1_moves[1] + '\n' + 'PP: ' + str(self.pkm1.this_moveset[self.pkm1_moves[1]]['cPP']) + '/' + str(self.pkm1.this_moveset[self.pkm1_moves[1]]['PP']) + '\n' + 'Type: ' + str(self.pkm1.this_moveset[self.pkm1_moves[1]]['Type']), font_size=16, halign='center', on_press=self.use_attack) self.move3_btn = Button( text=self.pkm1_moves[2] + '\n' + 'PP: ' + str(self.pkm1.this_moveset[self.pkm1_moves[2]]['cPP']) + '/' + str(self.pkm1.this_moveset[self.pkm1_moves[2]]['PP']) + '\n' + 'Type: ' + str(self.pkm1.this_moveset[self.pkm1_moves[2]]['Type']), font_size=16, halign='center', on_press=self.use_attack) self.move4_btn = Button( text=self.pkm1_moves[3] + '\n' + 'PP: ' + str(self.pkm1.this_moveset[self.pkm1_moves[3]]['cPP']) + '/' + str(self.pkm1.this_moveset[self.pkm1_moves[3]]['PP']) + '\n' + 'Type: ' + str(self.pkm1.this_moveset[self.pkm1_moves[3]]['Type']), font_size=16, halign='center', on_press=self.use_attack) self.fight_page.add_widget(self.move1_btn) self.fight_page.add_widget(self.move2_btn) self.fight_page.add_widget(self.move3_btn) self.fight_page.add_widget(self.move4_btn) self.fight_tab.add_widget(self.fight_page) # Creating the page to switch out. self.switch_page = BoxLayout(orientation='horizontal') # Display the names of the other two Pokemon as well as their HP. self.pkm1_btn = Button(text=self.pkm2.name + '\n' + str(self.pkm2.chp) + '/' + str(self.pkm2.maxhp), font_size=16, halign='center', on_press=self.switch1) self.pkm2_btn = Button(text=self.pkm3.name + '\n' + str(self.pkm3.chp) + '/' + str(self.pkm3.maxhp), font_size=16, halign='center', on_press=self.switch2) self.switch_page.add_widget(self.pkm1_btn) self.switch_page.add_widget(self.pkm2_btn) self.switch_tab.add_widget(self.switch_page) self.btm_screen.add_widget(self.fight_tab) self.btm_screen.add_widget(self.switch_tab) # Add the bottom screen into the layout, and add the layout into the screen. self.layout.add_widget(self.btm_screen) self.add_widget(self.layout) # When a transition happens from this screen to the selection screen, remove all widgets so that on_enter does not create a second layer of widgets. def on_leave(self): self.clear_widgets() # The switch function for both Pokemon slots. Checks if the current HP of Pokemon to switch to is 0, if so, do not allow the switch. def switch1(self, instance): self.btn.play() if self.pkm2.chp == 0: SimplePopup.open(self, 'This Pokemon has fainted!') else: self.pkm1, self.pkm2 = self.pkm2, self.pkm1 self.update() self.btm_screen.switch_to(self.fight_tab) def switch2(self, instance): self.btn.play() if self.pkm3.chp == 0: SimplePopup.open(self, 'This Pokemon has fainted!') else: self.pkm1, self.pkm3 = self.pkm3, self.pkm1 self.update() self.btm_screen.switch_to(self.fight_tab) # Binded to each button with a move, this function is called whenever an attack is used. def use_attack(self, instance): # Check if the using Pokemon is fainted first, and prompt the user to switch out of it is. self.btn.play() if self.pkm1.chp == 0: SimplePopup.open( self, 'Your current Pokemon has fainted, please switch out!') else: # Take the text in the button and split it so we can take the first word, the name of the move. move = instance.text.split('\n')[0] # Call use_move from the Pokemon class to execute the move. self.pkm1.use_move(self.opkm, move, self) # If the opposing Pokemon faints, increase pkm_beaten by 1. if self.opkm.chp == 0: self.pkm_beaten += 1 # If three consecutive defeats have happened, change pkm_beaten to 0, and add 1 to trainer beaten. Restore health and PP to all the player's Pokemon, and display a prompt that tells the player that their Pokemon are restored, as well as the number of trainers beaten. if self.pkm_beaten == 3: self.yours_beaten = 0 self.pkm_beaten = 0 self.trainers_beaten += 1 self.pkm1.chp = self.pkm1.maxhp self.pkm2.chp = self.pkm2.maxhp self.pkm3.chp = self.pkm3.maxhp for i in range(4): self.pkm1.this_moveset[self.pkm1_moves[i]][ 'cPP'] = self.pkm1.this_moveset[ self.pkm1_moves[i]]['PP'] self.pkm2.this_moveset[self.pkm2_moves[i]][ 'cPP'] = self.pkm2.this_moveset[ self.pkm2_moves[i]]['PP'] self.pkm3.this_moveset[self.pkm3_moves[i]][ 'cPP'] = self.pkm3.this_moveset[ self.pkm3_moves[i]]['PP'] SimplePopup.open( self, 'You\'ve beaten a trainer!\nYour Pokemon will now be fully healed.\n' + 'Trainers Beaten: ' + str(self.trainers_beaten)) # Randomize a new Pokemon for the opponent, and also preventing it from being the last Pokemon to prevent duplicates. self.opkm = Pokemon( random.choice([ x for x in self.possible_pokemon if x != self.opkm.name ])) # Call the update function. self.update() # The update function updates the game state. After each move or switchout, it will change everything as necessary, be it the health of both Pokemon, the sprites displayed, the moves available for your Pokemon, and PP of the moves, etc. def update(self): # If all the player's Pokemon are fainted, that means the player loses, sadly. Allow the player to restart their run with new Pokemon by bringing them back to the selection screen. Note that the on_leave function is also called to clear all the widgets. if self.yours_beaten == 3: self.yours_beaten = 0 SimplePopup.open( self, 'All your Pokemon have fainted!\nYou will be brought to the selection screen to restart your run.' ) self.manager.transition = NoTransition() self.manager.current = 'selection' self.opponent_name_level.text = self.opkm.name + ' Lv50' self.opponent_hp.text = str(self.opkm.chp) + '/' + str(self.opkm.maxhp) self.oimg.source = self.opkm.imgf self.mimg.source = self.pkm1.imgb self.my_name_level.text = self.pkm1.name + ' Lv50' self.my_hp.text = str(self.pkm1.chp) + '/' + str(self.pkm1.maxhp) self.pkm1_moves = pokemon_info[self.pkm1.name]['moves'] self.move1_btn.text = self.pkm1_moves[0] + '\n' + 'PP: ' + str( self.pkm1.this_moveset[self.pkm1_moves[0]]['cPP']) + '/' + str( self.pkm1.this_moveset[ self.pkm1_moves[0]]['PP']) + '\n' + 'Type: ' + str( self.pkm1.this_moveset[self.pkm1_moves[0]]['Type']) self.move2_btn.text = self.pkm1_moves[1] + '\n' + 'PP: ' + str( self.pkm1.this_moveset[self.pkm1_moves[1]]['cPP']) + '/' + str( self.pkm1.this_moveset[ self.pkm1_moves[1]]['PP']) + '\n' + 'Type: ' + str( self.pkm1.this_moveset[self.pkm1_moves[1]]['Type']) self.move3_btn.text = self.pkm1_moves[2] + '\n' + 'PP: ' + str( self.pkm1.this_moveset[self.pkm1_moves[2]]['cPP']) + '/' + str( self.pkm1.this_moveset[ self.pkm1_moves[2]]['PP']) + '\n' + 'Type: ' + str( self.pkm1.this_moveset[self.pkm1_moves[2]]['Type']) self.move4_btn.text = self.pkm1_moves[3] + '\n' + 'PP: ' + str( self.pkm1.this_moveset[self.pkm1_moves[3]]['cPP']) + '/' + str( self.pkm1.this_moveset[ self.pkm1_moves[3]]['PP']) + '\n' + 'Type: ' + str( self.pkm1.this_moveset[self.pkm1_moves[3]]['Type']) self.pkm1_btn.text = self.pkm2.name + '\n' + str( self.pkm2.chp) + '/' + str(self.pkm2.maxhp) self.pkm2_btn.text = self.pkm3.name + '\n' + str( self.pkm3.chp) + '/' + str(self.pkm3.maxhp) self.pkm1_moves = pokemon_info[self.pkm1.name]['moves'] self.pkm2_moves = pokemon_info[self.pkm2.name]['moves'] self.pkm3_moves = pokemon_info[self.pkm3.name]['moves'] self.opponent_pkm_left.source = self.pbl_images[self.pkm_beaten] self.my_pkm_left.source = self.pbl_images[self.yours_beaten] if self.pkm1.chp == 0: self.btm_screen.switch_to(self.switch_tab)
def constructMainWindow(self): self.global_font_size = self.backend.getParameter('font_size') self.main_tabbed_panel = TabbedPanel(do_default_tab=False, size_hint=(1, 1)) self.main_tabbed_panel.softinput_mode = 'scale' #-------------- settings tab --------------------- settings_tab = TabbedPanelItem(text='Settings') sv = ScrollView(size_hint=(1, 1), effect_cls=ScrollEffect, bar_width=5) #, size=(300, 300) #settings_box=BoxLayout(orientation='vertical',size_hint=(1, None),spacing=10,height=1000)#height='1100dp' settings_box = StackLayout(orientation='lr-tb', size_hint=(1, None), height=3000) #-----------settings: log picker ---------- log_picker_box = BoxLayout(orientation='vertical', size_hint=(1, None), height=self.getFieldHeight(3)) log_picker_box.add_widget(Label(text='Select log', size_hint=(1, 1))) self.log_select_spinner = Spinner(text='default', values=('default'), size_hint=(1, 1)) log_picker_box.add_widget(self.log_select_spinner) settings_box.add_widget(log_picker_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-----------settings: new log ---------- new_log_row_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) create_log_help_button = Button(text='Create log (?)', size_hint=(0.5, 1), is_focusable=False) new_log_row_box.add_widget(create_log_help_button) create_log_help_button.bind(on_press=self.createLogHelpButtonCallback) self.new_log_name_field = TextInput( text='', multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, None), height=self.getFieldHeight(), on_text_validate=self.newLogButtonCallback) new_log_row_box.add_widget(self.new_log_name_field) settings_box.add_widget(new_log_row_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-----------settings: info field ---------- info_field_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) info_field_help_button = Button(text='Info field text (?)', size_hint=(0.5, 1), is_focusable=False) info_field_box.add_widget(info_field_help_button) info_field_help_button.bind(on_press=self.infoFieldHelpButtonCallback) self.info_field_input = TextInput( text=self.backend.getParameter('info_text').replace('\n', '#'), multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, 1), on_text_validate=self.infoTextButtonCallback) info_field_box.add_widget(self.info_field_input) settings_box.add_widget(info_field_box) #-------------------------------- settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-----------settings: core log fields ---------- settings_box.add_widget( Label(text='Field settings', size_hint=(1, None), height=self.getFieldHeight())) description_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) description_box.add_widget( Label(text='Field', size_hint=(1, None), height=self.getFieldHeight())) default_field_button = Button(text='Default value (?)', size_hint=(1, None), height=self.getFieldHeight(), is_focusable=False) default_field_button.bind(on_press=self.callbackDefaultValueHelpPopup) description_box.add_widget(default_field_button) skip_cursor_button = Button(text='Skip (?)', size_hint=(1, None), height=self.getFieldHeight(), is_focusable=False) skip_cursor_button.bind(on_press=self.callbackAutoCursorHelpPopup) description_box.add_widget(skip_cursor_button) settings_box.add_widget(description_box) for i in self.field_enable: #field label field_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) field_box.add_widget( Label(text=self.backend.getFieldLabel(i), size_hint=(1, 1))) #default value field self.default_value_field_widget[i] = TextInput( valign='middle', text=self.backend.getFieldDefault(i), multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, 1)) self.default_value_field_widget[i].bind( on_text_validate=self.saveDefaultValues) field_box.add_widget(self.default_value_field_widget[i]) #skip checkbox setup and bind self.field_auto_skip_checkbox[i] = CheckBox(size_hint=(1, 1)) if i in self.field_skip: self.field_auto_skip_checkbox[i].active = True self.field_auto_skip_checkbox[i].bind( active=self.saveSkipCheckboxes) field_box.add_widget(self.field_auto_skip_checkbox[i]) settings_box.add_widget(field_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height=self.getFieldHeight())) #spacer #-------settings: font size slider settings_box.add_widget( Label(text='Font size', size_hint=(1, None), height=self.getFieldHeight())) fontsize_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight()) self.font_size_slider = Slider(min=5, max=35, value=float(self.global_font_size)) self.font_size_slider.bind(value=self.fontSliderValueChange) self.font_size_label = Label(text=self.global_font_size, size_hint=(None, 1)) fontsize_box.add_widget(self.font_size_slider) fontsize_box.add_widget(self.font_size_label) settings_box.add_widget(fontsize_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #-------settings: delete log box delete_log_box = BoxLayout(orientation='vertical', size_hint=(1, None), height=self.getFieldHeight(3)) delete_log_box.add_widget(Label(text='Delete log', size_hint=(1, 1))) delete_log_row_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight(1)) self.log_delete_spinner = Spinner(text='default', values=('default'), size_hint=(1, 1)) delete_log_row_box.add_widget(self.log_delete_spinner) delete_log_inner_box = BoxLayout(orientation='horizontal', size_hint=(1, None), height=self.getFieldHeight(1)) delete_log_inner_box.add_widget( Label(text='Unlock', halign='right', size_hint=(0.5, None), height=self.getFieldHeight())) self.unlock_delete_log_checkbox = CheckBox(size_hint=(0.5, 1)) delete_log_inner_box.add_widget(self.unlock_delete_log_checkbox) delete_log_row_box.add_widget(delete_log_inner_box) delete_button = Button(text='Delete', size_hint=(1, 1), is_focusable=False) delete_button.bind(on_press=self.deleteButtonCallback) delete_log_row_box.add_widget(delete_button) delete_log_box.add_widget(delete_log_row_box) settings_box.add_widget(delete_log_box) settings_box.add_widget( Label(text='', size_hint=(1, None), height='25sp')) #spacer #dummy spacer #settings_box.add_widget(Label(text='',size_hint=(1, None),height=400)) sv.add_widget(settings_box) settings_tab.add_widget(sv) #-------------- logging tab ---------------------- self.log_tab = TabbedPanelItem(text='Log') fl = FloatLayout() log_tab_layout = AnchorLayout(anchor_x='left', anchor_y='top') log_input_layout = StackLayout(orientation='lr-tb', size_hint=(1, 1)) self.info_label = Label(text=self.backend.getParameter('info_text'), size_hint=(0.3, None), height=self.getFieldHeight(2)) log_input_layout.add_widget(self.info_label) for i in self.field_enable: field_box = BoxLayout(orientation='vertical', size_hint=(None, None), width=self.getFieldWidth( self.backend.getFieldInputWidth(i)), height=self.getFieldHeight(3)) #field_box=BoxLayout(orientation='vertical',size_hint=(self.backend.getFieldWidthHint(i),None),height=self.getFieldHeight(3)) field_box.add_widget( Label(text=self.backend.getFieldLabel(i), size_hint=(1, None), height=self.getFieldHeight(1))) self.field_widget[i] = TextInput( text=self.backend.getFieldDefault(i), multiline=False, write_tab=False, keyboard_suggestions=False, size_hint=(1, None), height=self.getFieldHeight(1)) self.field_widget_reverse_dict[self.field_widget[i]] = i self.field_widget[i].bind(on_text_validate=self.textFieldCallback) field_box.add_widget(self.field_widget[i]) log_input_layout.add_widget(field_box) self.save_button = Button(text='SAVE', size_hint=(0.2, None), height=self.getFieldHeight(3), is_focusable=False) self.save_button.bind(on_press=self.saveButtonCallback) log_input_layout.add_widget(self.save_button) self.edit_button = Button(text='EDIT', size_hint=(None, None), height=self.getFieldHeight(3), is_focusable=False) self.edit_button.bind(on_press=self.editButtonCallback) log_input_layout.add_widget(self.edit_button) log_tab_layout.add_widget(log_input_layout) bottom_layout = AnchorLayout(anchor_x='left', anchor_y='bottom') s = Splitter(sizable_from='top', size_hint=(1, 0.1), min_size=25) bottom_layout.add_widget(s) sv = ScrollView(size_hint=(1, 0.5), size=(300, 100), effect_cls=ScrollEffect) self.log_list = TextInput( text='', font_size=self.backend.getParameter('font_size') + 'dp', font_name='DejaVuSansMono.ttf', size=(2000, 3000), size_hint=(None, None)) sv.add_widget(self.log_list) s.add_widget(sv) fl.add_widget(log_tab_layout) fl.add_widget(bottom_layout) self.log_tab.add_widget(fl) #-------------- export tab ---------------------- export_tab = TabbedPanelItem(text='Export') export_box = BoxLayout(orientation='vertical', size_hint=(1, 0.5), spacing=25) export_box.add_widget( Label(text='Select log for export', size_hint=(1, 0.3))) self.log_export_select_spinner = Spinner(text='default', values=('default', 'Home', 'Work', 'Other', 'Custom'), size_hint=(1, 0.3)) export_box.add_widget(self.log_export_select_spinner) export_button = Button(text='Export to ADIF', size_hint=(1, 0.3), is_focusable=False) export_button.bind(on_press=self.exportLog) export_box.add_widget(export_button) export_tab.add_widget(export_box) #------------------------------------------------ #------------- about tab ------------------------ about_tab = TabbedPanelItem(text='About') about_box = BoxLayout(orientation='vertical', size_hint=(1, 1)) about = self.backend.version_string + '\n\nby LB9MG\n\nwww.lb9mg.no\n\[email protected]\n\nLog database is stored in\n/storage/sdcard0/MG-log/mg-log.sqlite3\n\n\nTo edit an entry:\nplace the cursor on a line\n and press EDIT.' about_box.add_widget( Label(text=about, halign='center', size_hint=(1, 1))) about_tab.add_widget(about_box) #------------------------------------------------ #adding all tabs in the right order self.main_tabbed_panel.add_widget(self.log_tab) self.main_tabbed_panel.add_widget(settings_tab) self.main_tabbed_panel.add_widget(export_tab) self.main_tabbed_panel.add_widget(about_tab) self.updateLogList() self.selectLog() self.log_select_spinner.bind(text=self.selectLog) self.backend.popupCallback = self.helpPopup self.field_widget[ self.field_enable[0]].focus = True #focus in the first field return self.main_tabbed_panel