def test_widget_root_from_code_with_kv(self): from kivy.lang import Builder from kivy.factory import Factory from kivy.properties import ObjectProperty, StringProperty from kivy.uix.floatlayout import FloatLayout Builder.load_string(""" <MyWidget>: Label: text: root.title <BaseWidget>: CallerWidget: """) class CallerWidget(FloatLayout): def __init__(self, **kwargs): super(CallerWidget, self).__init__(**kwargs) self.add_widget(MyWidget(title="Hello World")) class NestedWidget(FloatLayout): title = StringProperty('aa') class MyWidget(NestedWidget): pass class BaseWidget(FloatLayout): pass Factory.register('MyWidget', cls=MyWidget) Factory.register('CallerWidget', cls=CallerWidget) r = self.render root = BaseWidget() r(root)
def __init__(self, ctrl, **kwargs): Builder.load_file("playing.kv") self.ctrl = ctrl super(PlayingScreen, self).__init__(**kwargs) Clock.schedule_interval(self._update_progress, 1/25) self.volume_slider.value = self.ctrl.volume self.init_display()
def __init__(self): ScreenManager.__init__(self) self.apps = {} rr = SimPlanRR(3, name='RoundRobin', archivo='gui/kv/rr.kv') Builder.unload_file('gui/kv/rr.kv') pr = SimPlanPR(1, name='Prioridad Apropiativa', archivo='gui/kv/pr.kv') Builder.unload_file('gui/kv/pr.kv') sjf = SimPlanSJF(2, name='Short Job First', archivo='gui/kv/sjf.kv') Builder.unload_file('gui/kv/sjf.kv') srjf = SimPlanSRJF(5, name='Short Remainnig Job First', archivo='gui/kv/sjf.kv') Builder.unload_file('gui/kv/sjf.kv') prn = SimPlanPRN(2, name='Prioridad No Apropiativa', archivo='gui/kv/pr.kv') Builder.unload_file('gui/kv/pr.kv') self.apps['RR'] = rr self.apps['PR'] = pr self.apps['SJF'] = sjf self.apps['SRJF'] = srjf self.apps['PRN'] = prn self.agregar_procesos_defecto() for app in self.apps.values(): self.add_widget(app)
def update_serial_choices(self, *largs): extra_mac_ports = set(glob.glob('/dev/tty.usbserial*')) new_serial_choices = set([port for port, _, _ in comports()]) for i_hate_macs in extra_mac_ports: new_serial_choices.add(i_hate_macs) if not sets_equal(self.last_serial_choices, new_serial_choices): self.indicators.serial_choices.clear_widgets() self.last_serial_choices = new_serial_choices for port in sorted(list(new_serial_choices)): port_name = port if port_name.startswith('/dev/'): port_name = port[5:] btn = Builder.load_string(''' CheckBox: size_hint_y: 1 group: 'serial_choice_group' ''') lbl = Builder.load_string(''' SaneLabel: size_hint_y: 1 text: '%s' ''' % (port_name,)) btn.bind(active=self.on_serial_choice) btn.port = port if self.serial is not None and self.serial.port == port: btn.active = True self.indicators.serial_choices.add_widget(btn) self.indicators.serial_choices.add_widget(lbl)
def __init__(self, **kwargs): # Before doing anything, ensure the windows exist. EventLoop.ensure_window() # Register touch events self.register_event_type('on_touch_down') self.register_event_type('on_touch_move') self.register_event_type('on_touch_up') super(Widget, self).__init__(**kwargs) # Create the default canvas if not exist if self.canvas is None: self.canvas = Canvas() # Apply all the styles if '__no_builder' not in kwargs: #current_root = Builder.idmap.get('root') #Builder.idmap['root'] = self Builder.apply(self) #if current_root is not None: # Builder.idmap['root'] = current_root #else: # Builder.idmap.pop('root') # Bind all the events for argument, value in kwargs.items(): if argument.startswith('on_'): self.bind(**{argument: value})
def __init__(self, serverip, serverport, team, nick, **kwargs): Builder.load_file(utils.kvPath.format('game_screen')) super(GameScreen, self).__init__(**kwargs) # init with the name game = SpylightGame(serverip, serverport, team, nick, self) self.add_widget(game) self.app = kwargs['app']
def BuildConnectTitle(self, *largs): t1 = time.time() if t1 - self.timecontitle < 30.0: #allow update every 30seconds return txt = self.GetConnectTitle() #print txt #print "BuildConnectTitle" kv_container = self.current_screen.children[0] for child in kv_container.children[:]: if isinstance(child, BoxLayout): kv_widget = child break try: parser = Parser(content=txt) kv_container.remove_widget(kv_widget) widget = Factory.get(parser.root.name)() Builder._apply_rule(widget, parser.root, parser.root) for child in widget.children[:]: if isinstance(child, Button): if isinstance(child, Spinner): print "Spinner", child child.bind(text=self.ConfigPopupOpen) self.btncamsetup = child else: print "Button", child child.bind(on_release=self.RefreshAllControls) kv_container.add_widget(widget) #self.current_screen.ids['btnCamSetup'].bind(text=self.ConfigPopupOpen) #.btnCamSetup.text #bind(on_text=self.ConfigPopupOpen) self.timecontitle = t1 except (SyntaxError, ParserException) as e: print "SyntaxError, ParserException", e except Exception as e: print "Exception", e
def __init__(self, sm, ctrl, playlist, **kwargs): Builder.load_file("playlist.kv") self.sm = sm self.playlist = playlist self.ctrl = ctrl super( PlayListScreen, self).__init__(**kwargs)
def __init__(self, *largs): self.resources = list(self.search_data_files()) resource_add_path(dirname(__file__)) Builder.load_file(join(dirname(__file__), 'map.kv')) super(MapServer, self).__init__(*largs) self.timeout = 0 self.timemsg = 0 self.players = {} # init client table for client in self.controler.clients: self.players[client] = { 'client': client, 'name': self.controler.get_client_name(client), 'ready': False, 'done': False, 'place': self.controler.metadata[client]['place'], 'count': 0 } #store mapitems and thumbs in order to display them on main screen #or remove them from clients self.mapitems = {} #filename: [client, index] self.thumbs = {} #index: [client, pos] #get map layers list from json self.load_json()
def test_kv_python_init(self): from kivy.lang import Builder, Factory from kivy.uix.widget import Widget class MyObject(object): value = 55 class MyWidget(Widget): cheese = MyObject() Builder.load_string(''' <MyWidget>: x: 55 y: self.width + 10 height: self.cheese.value width: 44 <MySecondWidget@Widget>: x: 55 Widget: x: 23 ''') w = MyWidget(x=22, height=12, y=999) self.assertEqual(w.x, 22) self.assertEqual(w.width, 44) self.assertEqual(w.y, 44 + 10) self.assertEqual(w.height, 12) w2 = Factory.MySecondWidget(x=999) self.assertEqual(w2.x, 999) self.assertEqual(w2.children[0].x, 23)
def __init__(self, **kwargs): # Before doing anything, ensure the windows exist. EventLoop.ensure_window() # Register touch events self.register_event_type("on_touch_down") self.register_event_type("on_touch_move") self.register_event_type("on_touch_up") super(Widget, self).__init__(**kwargs) # Create the default canvas if not exist if self.canvas is None: self.canvas = Canvas(opacity=self.opacity) # Apply all the styles if "__no_builder" not in kwargs: # current_root = Builder.idmap.get('root') # Builder.idmap['root'] = self Builder.apply(self) # if current_root is not None: # Builder.idmap['root'] = current_root # else: # Builder.idmap.pop('root') # Bind all the events for argument in kwargs: if argument[:3] == "on_": self.bind(**{argument: kwargs[argument]})
def __init__(self, **kwargs): # Before doing anything, ensure the windows exist. EventLoop.ensure_window() # Assign the default context of the widget creation. if not hasattr(self, '_context'): self._context = get_current_context() no_builder = '__no_builder' in kwargs if no_builder: del kwargs['__no_builder'] on_args = {k: v for k, v in kwargs.items() if k[:3] == 'on_'} for key in on_args: del kwargs[key] super(Widget, self).__init__(**kwargs) # Create the default canvas if it does not exist. if self.canvas is None: self.canvas = Canvas(opacity=self.opacity) # Apply all the styles. if not no_builder: #current_root = Builder.idmap.get('root') #Builder.idmap['root'] = self Builder.apply(self) #if current_root is not None: # Builder.idmap['root'] = current_root #else: # Builder.idmap.pop('root') # Bind all the events. if on_args: self.bind(**on_args)
def __init__(self, **kwargs): # Before doing anything, ensure the windows exist. EventLoop.ensure_window() # assign the default context of the widget creation if not hasattr(self, '_context'): self._context = get_current_context() super(Widget, self).__init__(**kwargs) # Create the default canvas if not exist if self.canvas is None: self.canvas = Canvas(opacity=self.opacity) # Apply all the styles if '__no_builder' not in kwargs: #current_root = Builder.idmap.get('root') #Builder.idmap['root'] = self Builder.apply(self) #if current_root is not None: # Builder.idmap['root'] = current_root #else: # Builder.idmap.pop('root') # Bind all the events for argument in kwargs: if argument[:3] == 'on_': self.bind(**{argument: kwargs[argument]})
def __init__(self, **kwargs): super(Widget, self).__init__() # Register touch events self.register_event_type('on_touch_down') self.register_event_type('on_touch_move') self.register_event_type('on_touch_up') # Before doing anything, ensure the windows exist. EventLoop.ensure_window() # Auto bind on own handler if exist properties = self.__properties.keys() for func in dir(self): if not func.startswith('on_'): continue name = func[3:] if name in properties: self.bind(**{name: getattr(self, func)}) # Create the default canvas self.canvas = Canvas() # Apply the existing arguments to our widget for key, value in kwargs.iteritems(): if hasattr(self, key): setattr(self, key, value) # Apply all the styles if '__no_builder' not in kwargs: Builder.apply(self)
def __init__(self, n_procesadores, **kwargs): Builder.load_file(kwargs['archivo']) Screen.__init__(self, **kwargs) self.procesadores = None self.tabla_procesos = None self.popup_proceso = None self.inicializar(n_procesadores) self.tabla_procesos = self.tabla_procesos or TablaProcesosGUI(self.sistema.procesos) self.procesadores = self.procesadores or [ProcesadorGUI(p, self.tabla_procesos) for p in self.sistema.procesadores] self.popup_proceso = self.popup_proceso or ProcesoPopup(self.sistema) self.ids.titulo.text = "Simulacion para "+self.name self.popup_recurso = RecursoPopup(self.sistema) self.tabla_recursos = TablaRecursosGUI(self.sistema.recursos) self.ejecutando = False self.paso = False for p in self.procesadores: self.ids.procesadores.add_widget(p) self.c_procesos.add_widget(self.tabla_procesos) self.c_recursos.add_widget(self.tabla_recursos) self.sistema.asignar_vista(self)
def __init__(self, title, *args, **kwargs): """ @title - tytul (nazwa) cwiczenia """ Builder.load_file("kv/genericlevels.kv") Screen.__init__(self, *args, **kwargs) self.title = title
def __init__(self, **kwargs): Builder.load_string(materiallbl_kv) super(MaterialLabel, self).__init__(**kwargs) self.bind(theme_text_color=self._update_color, theme_style=self._update_color, text_color=self._update_color) self.theme_style = self._theme_cls.theme_style
def build(self): self.title = "Pong" Builder.load_file('ui.kv') self.ponggame = PongGame() self.ponggame.serve_ball() return self.ponggame
def BuildConnectControl(self, *largs): txt = self.GetConnectControl() if txt == self.textctrlbtn: return kv_container = self.current_screen.children[0] kv_widget = kv_container.children[0] for child in kv_container.children[:]: if isinstance(child, AnchorLayout): kv_widget = child break try: parser = Parser(content=txt) if isinstance(kv_widget, AnchorLayout): kv_container.remove_widget(kv_widget) widget = Factory.get(parser.root.name)() Builder._apply_rule(widget, parser.root, parser.root) widget.children[0].children[2].bind(on_release=self.Connect) widget.children[0].children[1].bind(on_release=self.Record) widget.children[0].children[0].bind(on_release=self.Buzzer) self.btnphoto = widget.children[0].children[0] self.btnrecord = widget.children[0].children[1] self.btnconnect = widget.children[0].children[2] self.lblrecordtime = widget.children[0].children[4] #print "self.lblrecordtime.text",self.lblrecordtime.text kv_container.add_widget(widget) self.textctrlbtn = txt except (SyntaxError, ParserException) as e: print "SyntaxError, ParserException", e except Exception as e: print "BuildConnectControl Exception", e
def build(self): Builder.load_file('bouncing.kv') self.title = 'Two bouncing balls' root = RootWidget() Clock.schedule_interval(root.update1, 1.0/60) Clock.schedule_interval(root.update2, 1.0/60) return root
def build(self): Builder.load_string(textwrap.dedent( ''' <CustomButtonClass@Button>: description_a: '' description_b: '' text: root.description_a + ' <newline> ' + root.description_b halign:'center' size_hint:(1, 0.1) <MyListView>: size_hint:(0.5, 0.5) ListView: item_strings: [str(index) for index in range(10)] <OtherNamedScreen>: GridLayout: cols: 2 MyListView ScrollView: ContainerForButtons: cols:1 row_default_height:150 size_hint_y: None ''')) Window.bind(on_keyboard=self.check_what_key_was_pressed) self.screen_mgr = ScreenManager() first = Screen(name='First') self.screen_mgr.add_widget(first) first.add_widget(Button(text="click me", bind=self.swap_screen)) self.screen_mgr.add_widget(OtherNamedScreen(name='Second')) return self.screen_mgr
def __init__(self, **kwargs): super(Container, self).__init__(**kwargs) self.previous_text = open(self.kv_file).read() parser = Parser(content=self.previous_text) widget = Factory.get(parser.root.name)() Builder._apply_rule(widget, parser.root, parser.root) self.add_widget(widget)
def __init__(self, **kwargs): # Before doing anything, ensure the windows exist. EventLoop.ensure_window() # Assign the default context of the widget creation. if not hasattr(self, '_context'): self._context = get_current_context() no_builder = '__no_builder' in kwargs self._disabled_value = False if no_builder: del kwargs['__no_builder'] on_args = {k: v for k, v in kwargs.items() if k[:3] == 'on_'} for key in on_args: del kwargs[key] self._disabled_count = 0 super(Widget, self).__init__(**kwargs) # Create the default canvas if it does not exist. if self.canvas is None: self.canvas = Canvas(opacity=self.opacity) # Apply all the styles. if not no_builder: Builder.apply(self, ignored_consts=self._kwargs_applied_init) # Bind all the events. if on_args: self.bind(**on_args)
def test_list_view_declared_in_kv_with_adapter(self): from kivy.lang import Builder from kivy.uix.modalview import ModalView from kivy.uix.widget import Widget from kivy.factory import Factory from kivy.properties import StringProperty, ObjectProperty, BooleanProperty Builder.load_string( """ #:import label kivy.uix.label #:import sla kivy.adapters.simplelistadapter <ListViewModal>: size_hint: None,None size: 400,400 lvm: lvm ListView: id: lvm size_hint: .8,.8 adapter: sla.SimpleListAdapter( data=["Item #{0}".format(i) for i in xrange(100)], cls=label.Label) """ ) class ListViewModal(ModalView): def __init__(self, **kwargs): super(ListViewModal, self).__init__(**kwargs) list_view_modal = ListViewModal() list_view = list_view_modal.lvm self.assertEqual(len(list_view.adapter.data), 100)
def change_kv(self, *largs): '''Called when the update button is clicked. Needs to update the interface for the currently active kv widget, if there is one based on the kv file the user entered. If there is an error in their kv syntax, show a nice popup.''' kv_container = self.screen_manager.current_screen.content.children[0] try: parser = Parser(content=self.language_box.text.encode('utf8')) kv_container.clear_widgets() widget = Factory.get(parser.root.name)() Builder._apply_rule(widget, parser.root, parser.root) kv_container.add_widget(widget) except (SyntaxError, ParserException) as e: self.info_label.text = str(e) self.anim = Animation(top=190.0, opacity=1, d=2, t='in_back') +\ Animation(top=190.0, d=2) +\ Animation(top=0, opacity=0, d=2) self.anim.start(self.info_label) except: import traceback traceback.print_exc() popup = Popup(title="Boom", content=Label(text='Something horrible happened while parsing' + 'your Kivy Language', text_size=(350, None), size_hint=(None, None), size=(400, 400))) popup.open()
def idle(self): '''This function is called every frames. By default : * it "tick" the clock to the next frame * read all input and dispatch event * dispatch on_update + on_draw + on_flip on window ''' # update dt Clock.tick() # read and dispatch input from providers self.dispatch_input() # flush all the canvas operation Builder.sync() # tick before draw Clock.tick_draw() # flush all the canvas operation Builder.sync() window = self.window if window and window.canvas.needs_redraw: window.dispatch('on_draw') window.dispatch('on_flip') # don't loop if we don't have listeners ! if len(self.event_listeners) == 0: Logger.error('Base: No event listeners have been created') Logger.error('Base: Application will leave') self.exit() return False return self.quit
def make_button_class(class_name, img_up, img_down, img_path, color_down='000000', color_up='000000', color_dis='000000'): template = """ <{cls}@RemoteKey>: canvas: Clear Color: rgb: self.hextorgb('{bgdis}' if self.disabled else '{bgup}') RoundedRectangle: size: self.size pos: self.pos bgup: '{bgup}' bgdown: '{bgdn}' bgdis: '{bgdis}' #background_normal: 'img/white.png' #background_down: ''#'' border: 0,0,0,0 Image: id: btnimg source: '{btnimg}' y: self.parent.y x: self.parent.x size: self.parent.size mipmap: True """.format(cls=class_name, bgup=color_up, bgdn=color_down, bgdis=color_dis, btnimg=('{}/{}.png'.format(img_path, img_up) if img_up != '' else '')) Builder.load_string(template)
def FromFile(cls, filename, use_cache = False): Logger.info('From File with ' + str(filename)) if not use_cache: Logger.info(' From File without cache') from os.path import split from kivy.resources import resource_add_path import sys resource_add_path(split(filename)[0]) sys.path.append(split(filename)[0]) name, filename = find_template_path(filename) #Add filename dir to ressources folder to facilitate relativ import #Load & return all templates from a file as a list. Take an optionnal filter from kivy.lang import Builder # Remove any former trace of the file if use_cache and filename in templateList.templates: res = templateList[filename] res = [r.blank() for r in res] else: Builder.unload_file(filename) # Now create a widget try: Builder.load_file(filename) res = cls._process_file_build(filename) templateList[filename] = res except Exception, E: from utils import alert from utils import log import traceback alert(str(E)) Logger.error('[Error] While trying to import Template %s'%filename) log(E, traceback.print_exc()) res = list()
def load_all_kv_files(start="./gui"): pattern = re.compile(r".*?\.kv") kv_files = [] for root, dirs, files in os.walk(start): kv_files += [root + "/" + kv_file for kv_file in files if pattern.match(kv_file)] for kv_file in kv_files: Builder.load_file(kv_file)
def build(self): self.title = "Plateformer" Builder.load_file('ui.kv') self.platformergame = PlatformerGame() Clock.schedule_interval(self.platformergame.update_game, 1.0/60) return self.platformergame
from kivy.lang import Builder from kivy.properties import ObjectProperty from kivy.properties import StringProperty from kivy.uix.boxlayout import BoxLayout from plyer.utils import platform Builder.load_string(''' #:import uniqueid plyer.uniqueid <UniqueIDInterface>: uniqueid: uniqueid orientation: 'vertical' padding: '50dp' spacing: '20dp' BoxLayout: orientation: 'horizontal' size_hint_y: 0.3 Button: text: 'Get Unique ID' on_release: root.get_uid() Label: text: str(root.text) Label: text: str(root.uid) ''') class UniqueIDInterface(BoxLayout): '''Root Widget.''' uniqueid = ObjectProperty()
root = Builder.load_string(''' #:set tam_font dp('80') <Botao@Button>: font_size: tam_font Home: orientation: 'vertical' padding: dp('5') spacing: dp('5') BoxLayout: size_hint: 1, .2 Label: id: info text: 'Jogador %d começa' % root.vez font_size: sp('20') Button: text: 'Novo' size_hint_x: .2 on_release: root.novo(self) GridLayout: rows: 3 cols: 3 #spacing: dp('5') #padding: dp('5') Botao: id: bt1 text: '' on_press: root.selecionado(self) Botao: id: bt2 text: '' on_press: root.selecionado(self) Botao: id: bt3 text: '' on_press: root.selecionado(self) Botao: id: bt4 text: '' on_press: root.selecionado(self) Botao: id: bt5 text: '' on_press: root.selecionado(self) Botao: id: bt6 text: '' on_press: root.selecionado(self) Botao: id: bt7 text: '' on_press: root.selecionado(self) Botao: id: bt8 text: '' on_press: root.selecionado(self) Botao: id: bt9 text: '' on_press: root.selecionado(self) ''')
def build(self): return Builder.load_file("UI.kv")
from kivy.app import App from kivy.uix.boxlayout import BoxLayout from kivy.uix.gridlayout import GridLayout from kivy.uix.anchorlayout import AnchorLayout from kivy.lang import Builder Builder.load_file('tables.kv') class TablesPageScreen(BoxLayout, GridLayout, AnchorLayout): def __init__(self, **kwargs): super().__init__(**kwargs) def ShiftToProvinceList(self): self.parent.parent.current = 'provinceListPageScreen' def ShiftToVehicleList(self): self.parent.parent.current = 'vehicleListPageScreen' def ShiftToCompanyList(self): self.parent.parent.current = 'companyListPageScreen' def ShiftToBuyList(self): self.parent.parent.current = 'buyListPageScreen' def ShiftToSaleList(self): self.parent.parent.current = 'saleListPageScreen' def ShiftToBranchList(self): self.parent.parent.current = 'branchListPageScreen'
Builder.load_string(""" <READ_AND_WRITE>: AnchorLayout: anchor_x : 'right' anchor_y : 'center' padding: 3 Widget: size_hint: (.8,1) canvas: Color: rgba: .22,.22,.26,1 Rectangle: size: self.size pos: self.pos BoxLayout: orientation : 'vertical' size_hint : (.2, 1) padding: 3 Button: text: 'Чтение/Запись' bold : 'True' color: [0,0,0,1] background_color : [.62,.93,.25,1] background_normal : '' Button: text : 'Температура ПЛИС' bold: 'True' background_color : [.22,.22,.26,1] background_normal : '' on_press:root.manager.current = 'TEMPERATURE' on_press:root.cont_drawing() Button: text : 'Регистры ПЛИС' bold: 'True' background_color : [.22,.22,.26,1] background_normal : '' on_press: root.manager.current = 'CONTROL' Button: text : 'Настройки загрузчика' bold: 'True' background_color : [.22,.22,.26,1] background_normal : '' on_press: root.socket_close() on_press: root.manager.current = 'BOOTLOADER_SETTINGS' Button: text : 'Сетевые настройки' bold: 'True' background_color : [.22,.22,.26,1] background_normal : '' on_press: root.manager.current = 'SETTING' Button: size_hint: (1,6.5) background_color : [.22,.22,.26,1] background_normal : '' AnchorLayout: anchor_x : 'center' anchor_y : 'center' size_hint : [1.2, 1.3] GridLayout: cols: 2 size_hint: [.45, .3] spacing: 3 Label: text: 'Адрес' text_size:self.size halign:'left' valign:'middle' TextInput: id: address text: multiline: False Label: text: 'Данные на запись' text_size:self.size halign:'left' valign:'middle' TextInput: id: data text: multiline: False Widget: Widget: Label: text: 'Прочитанные данные' text_size:self.size halign:'left' valign:'top' TextInput: id: income_data size_hint: (1,2) text: Widget: Widget: Button: text: 'ЗАПИСЬ' bold : 'True' color: [0,0,0,1] background_color : [.62,.93,.25,1] background_normal : '' on_press: root.write() Button: text: 'ЧТЕНИЕ' bold : 'True' color: [0,0,0,1] background_color : [.62,.93,.25,1] background_normal : '' on_press: root.read() """)
Builder.load_string(''' <Clyrics_s1>: BoxLayout: BoxLayout: id: client_box size_hint: 1, 1 spacing: 10 orientation: 'vertical' Label: id: artist_lbl markup: True size_hint: 1, .5 text: 'Artist name:' TextInput: id: artist_input size_hint: 1, .2 text: '' multiline: False Label: id: song_lbl markup: True size_hint: 1, .5 text: 'Song name:' TextInput: id: song_input size_hint: 1, .2 text: '' multiline: False BoxLayout: id: action_box size_hint: 1, 1 spacing: 10 orientation: 'vertical' Button: size_hint: 1, .1 text: 'Get lyrics' on_release: root.crawl_lyrics() Button: size_hint: 1, .1 text: 'Watch video' Button: size_hint: 1, .1 text: 'Refresh' on_release: root.refresh() ScrollView: Label: id: lyrics_box text: '' markup: True text_size: self.width, None size_hint_y: None height: self.texture_size[1] ''')
import os from kivy.lang import Builder from kivy.uix.popup import Popup from midistream.helpers import Note, midi_instruments, midi_notes, note_name from kivy.uix.togglebutton import ToggleButton from kivy.properties import NumericProperty, StringProperty, ObjectProperty from kivy.uix.stacklayout import StackLayout Builder.load_file(os.path.join(os.path.dirname(__file__), 'noteselect.kv')) class SelectableButton(ToggleButton): value = NumericProperty(0) def select(self): if self.state != 'down': self._do_press() class NoteButton(SelectableButton): def format_text(self): return note_name(self.value) class InstrumentButton(SelectableButton): title = StringProperty('') def format_text(self): return "{}".format(self.title)
class Train(BoxLayout): """Train a deep learning model with own data Because this module rely on models from Model Zoo, so it is designed as opening in a passive manner. To be specific, at start the GUI will guide user to select a model in Model Zoo module, only after deep learning model is selected, this module will shift to work mode. Attributes: model_id: id of model, used to find and load configuration of the model train_notebooks: list of notebook pathes. Each model may have one or more notebooks for training different kind of data. bundle_dir: the dir of main.py """ model_id = StringProperty() train_notebooks = ListProperty() bundle_dir = rootpath.detect( pattern='main.py') # Obtain the dir of main.py Builder.load_file(bundle_dir + os.sep + 'ui' + os.sep + 'train.kv') def __init__(self): super(Train, self).__init__() self.bind(model_id=self.switch_screens) self.bind(model_id=self.show_config) self.bind(model_id=self.collect_train_notebooks) def switch_screens(self, *args): self.ids.screens.current = 'work' def jump_to_model_zoo(self, *args): widget_handler = WidgetHandler() widget_handler.switch_screens('processing', 'model_zoo') def show_config(self, instance, text): self.ids.config_panel.clear_widgets() path = os.sep.join( [self.bundle_dir, 'model_zoo', text, 'config_form.json']) if not os.path.exists(path): self.ids.config_panel.add_widget( Label(text='This network do not need configuration')) return self.form_parser = FormParser() self.form_parser.load_json(path) self.ids.config_panel.add_widget(self.form_parser) def collect_train_notebooks(self, *args): self.train_notebooks = get_file_list(os.sep.join([ self.bundle_dir, 'plugins', 'processing', 'model_zoo', 'models', self.model_id, 'training' ]), formats=['ipynb']) def open_via(self): webbrowser.open( 'http://www.robots.ox.ac.uk/~vgg/software/via/via-2.0.4.html') def train(self): webbrowser.open( 'https://colab.research.google.com/github/deepdiy/deepdiy/blob/master/deepdiy/model_zoo/' + self.model_id + '/training/' + self.ids.run_notebook_spinner.text) def select_annotation_path(self): self.annoation_path = select_file() def select_config_path(self): self.config_path = select_file() def select_img_dir(self): self.img_dir = select_folder() def save_zip(self): dataset = Dataset() dataset.destination_dir = select_folder() dataset.annotation_path = self.annoation_path dataset.img_dir = self.img_dir dataset.config_path = self.config_path dataset.run()
Builder.load_string(''' #:import md_icons kivymd.icon_definitions.md_icons #:import colors kivymd.color_definitions.colors #:import MDLabel kivymd.label.MDLabel <BaseButton>: size_hint: (None, None) anchor_x: 'center' anchor_y: 'center' <BaseFlatButton>: <BaseRaisedButton>: <BaseRoundButton>: canvas: Clear Color: rgba: self._current_button_color Ellipse: size: self.size pos: self.pos size: (dp(48), dp(48)) content: content padding: dp(12) theme_text_color: 'Primary' MDLabel: id: content font_style: 'Icon' text: u"{}".format(md_icons[root.icon]) theme_text_color: root.theme_text_color text_color: root.text_color disabled: root.disabled valign: 'middle' halign: 'center' opposite_colors: root.opposite_colors <BaseRectangularButton>: canvas: Clear Color: rgba: self._current_button_color RoundedRectangle: size: self.size pos: self.pos radius: (dp(2),) content: content height: dp(36) width: content.texture_size[0] + dp(16) padding: (dp(8), 0) theme_text_color: 'Primary' MDLabel: id: content text: root._capitalized_text font_style: 'Button' size_hint_x: None text_size: (None, root.height) height: self.texture_size[1] theme_text_color: root.theme_text_color text_color: root.text_color disabled: root.disabled valign: 'middle' halign: 'center' opposite_colors: root.opposite_colors <BaseScreenWidthRectangularButton>: canvas: Clear Color: rgba: self._current_button_color RoundedRectangle: size: self.size pos: self.pos radius: (dp(2),) canvas: Color: rgba: (0, 0, 0, 0.03) if self.theme_cls.theme_style == 'Light' else (1, 1, 1, 0.03) Line: points: (root.x ,root.y, root.x+self.width, root.y) Line: points: (root.x+self.width ,root.y, root.x+self.width, root.y+self.height) content: content size_hint: 1, None height: dp(36) padding: (dp(8), 0) theme_text_color: 'Primary' MDLabel: id: content text: root._capitalized_text font_style: 'Button' size_hint_x: None text_size: (None, root.height) height: self.texture_size[1] theme_text_color: root.theme_text_color text_color: root.text_color disabled: root.disabled valign: 'middle' halign: 'center' opposite_colors: root.opposite_colors <MDRaisedButton>: md_bg_color: root.theme_cls.primary_color theme_text_color: 'Custom' text_color: root.specific_text_color <MDFloatingActionButton>: # Defaults to 56-by-56 and a backround of the accent color according to # guidelines size: (dp(56), dp(56)) md_bg_color: root.theme_cls.accent_color theme_text_color: 'Custom' text_color: root.specific_text_color ''')
def build(self): self.title = "Convert miles to kilometres" self.root = Builder.load_file('convert_miles_km.kv') return self.root
Builder.load_string( """ <ItemPagination> size_hint: None, None size: dp(15), dp(15) pos_hint: {'center_y': .5} canvas: Color: rgba: self.theme_cls.primary_color\ if root.current_index == 0 else root.color_round_not_active RoundedRectangle: pos: self.pos size: self.size <MDSwiperPagination> padding: dp(5) size_hint: None, None width: self.minimum_width pos_hint: {'center_x': .5} height: dp(56) MDIconButton: icon: 'chevron-left' theme_text_color: 'Custom' text_color: app.theme_cls.primary_color on_release: root.manager.swith_screen('right') BoxLayout: id: box spacing: dp(5) size_hint_x: None width: self.minimum_width MDIconButton: theme_text_color: 'Custom' text_color: app.theme_cls.primary_color icon: 'chevron-right' on_release: root.manager.swith_screen('left') """ )
class GameScreen(Screen): current_time = StringProperty("") timer_clock = None Builder.load_file("kvs/game/enigmakeyboard.kv") def __init__(self, **kwargs): super().__init__(**kwargs) Window.bind(on_key_down=self._on_key_down) def load_output_text(self): """On load of game from selector screen, put text in board""" game_id = App.get_running_app().game_id store = JsonStore(DATA_DIR) keyboard_output = store.get(str(game_id))["current_output_text"] if keyboard_output: self.ids.enigma_keyboard.ids.lamp_board.ids.board_output.text = ( keyboard_output) else: self.ids.enigma_keyboard.ids.lamp_board.ids.board_output.text = "" def play_effect_sound(self, sound): sound_names = { "pop", "plug_in", "keyboard_click", "paper", "button_1", "swoosh", "button_2", "rotor", } if sound not in sound_names: return settings = JsonStore(CONFIG_DIR) volume = 1.0 if settings.exists("effects_volume"): if settings.get("effects_volume")["value"] == 0: return else: volume = settings.get("effects_volume")["value"] sound = SoundLoader.load("misc/" + sound + (".wav" if sound != "swoosh" else ".mp3")) sound.volume = volume sound.play() if platform.system() in {"Linux", "Darwin"}: Clock.schedule_once(lambda dt: sound.unload(), sound.length) if not os.path.exists(DATA_DIR): store = JsonStore(DATA_DIR) store.put("latest_game_id", id=None) def on_enter(self, *args): store = JsonStore(DATA_DIR) game_id = App.get_running_app().game_id if game_id is None or store.exists(str( App.get_running_app().game_id)) is False: setup_new_game_settings() else: on_config_change() if not self.timer_clock: self.timer_clock = Clock.schedule_interval(self.handle_timer, 1) else: self.timer_clock() def on_leave(self): if self.timer_clock and self.manager.current not in { "rotor_screen", "plugboard_screen", }: self.timer_clock.cancel() def _on_key_down(self, window, key, scancode, codepoint, modifiers): if (self.manager.current == "game_screen" and isinstance(codepoint, str) and codepoint.upper() in App.get_running_app().keys and self.ids.enigma_keyboard.ids.lamp_board.ids.board_output.focus ): self.ids.enigma_keyboard.ids.keyboard.ids[ codepoint.upper()].trigger_action() def handle_key(self, key): """ ... whenever a key/letter in the machine (keyboard or board_output) is pressed """ # Handle visuals self.play_effect_sound("keyboard_click") anim = Animation(_color=[1, 212 / 255, 42 / 255], duration=0.2) + Animation(_color=[1, 1, 1], duration=0.2) anim.start(self.ids.enigma_keyboard.ids.lamp_board.ids.lamp) # Auto-input invading key letter = auto_input_processor(key.name) board_output = self.ids.enigma_keyboard.ids.lamp_board.ids.board_output if not board_output.focus: board_output.insert_text(letter) # Updating rotors new_rotors = App.get_running_app().machine.get_display() save_rotors(new_rotors[0], new_rotors[1], new_rotors[2]) rotor_screen = self.manager.get_screen("rotor_screen") rotor_screen.rotor_section.ids.first_rotor.rotor_value.text = new_rotors[ 0] rotor_screen.rotor_section.ids.second_rotor.rotor_value.text = new_rotors[ 1] rotor_screen.rotor_section.ids.third_rotor.rotor_value.text = new_rotors[ 2] def load_old_game(self): """Loads old/saved (point) copy of game""" game_id = App.get_running_app().game_id store = JsonStore(DATA_DIR) game = store.get(str(game_id)) store_put( last_saved_date=datetime.now().isoformat(), current_state=game["last_saved_state"], current_output_text=game["last_saved_output_text"], ) on_config_change() self.manager.get_screen("game_selector_screen").load_game(game_id) def save_game(self): game_id = App.get_running_app().game_id store = JsonStore(DATA_DIR) game = store.get(str(game_id)) store_put( last_saved_date=datetime.now().isoformat(), last_saved_state=game["current_state"], last_saved_output_text=self.ids.enigma_keyboard.ids.lamp_board.ids. board_output.text, ) def change_game_title(self, btn, title): if title != "" or title is not None: store_put(game_title=title) def handle_timer(self, dt): """ Handle timer during game Init timer handled in gameselector and setup_new_game_settings """ game_id = App.get_running_app().game_id store = JsonStore(DATA_DIR) current_state = store.get(str(game_id))["current_state"] # Timer logic if int(self.current_time) == 0: self.timer_clock.cancel() Factory.TimesUp().open() else: self.current_time = str(int(self.current_time) - 1) # Save timer in data current_state["timer"] = self.current_time store_put(current_state=current_state)
def build(self): return Builder.load_string(kv)
def build(self): """build the Kivy app from the kv file""" Window.size = (600, 300) self.title = "Convert Miles to Kilometres" self.root = Builder.load_file('miles_to_km_customised.kv') return self.root
def build(self): self.theme_cls.primary_palette = "Teal" self.theme_cls.accent_palette = 'Teal' self.theme_cls.theme_style = "Light" return Builder.load_string(kv_string)
from kivy.uix.screenmanager import ScreenManager from kivy.uix.textinput import TextInput from kivymd.uix.textfield import MDTextField from kivymd.app import MDApp from kivymd.theming import ThemableBehavior from kivymd.uix.button import MDFlatButton from kivymd.uix.dialog import MDDialog from kivymd.uix.list import OneLineIconListItem, MDList from kivymd.uix.screen import Screen from kivymd.uix.snackbar import Snackbar from wacryptolib.authentication_device import list_available_authentication_devices, _get_key_storage_folder_path from wacryptolib.exceptions import KeyStorageAlreadyExists from waguilib.widgets.popups import display_info_toast Builder.load_file(str( Path(__file__).parent / 'authentication_device_store.kv')) class AuthenticationDeviceStoreScreen(Screen): filesystem_key_storage_pool = ObjectProperty(None) def __init__(self, *args, **kwargs): self.selected_authentication_device_uids = [] self.register_event_type('on_selected_authentication_devices_changed') super().__init__(*args, **kwargs) def on_selected_authentication_devices_changed(self, *args): pass print("I am dispatched on_selected_authentication_devices_changed", args)
def build(self): self.title = "Box Layout Demo" self.root = Builder.load_file('box_layout.kv') return self.root
from jocular.component import Component from jocular.widgets import Panel, LabelR Builder.load_string(''' <FilterToggle>: canvas.before: Color: rgba: .15, .15, .15, 1 Ellipse: pos: self.pos size: self.width, self.height Color: rgb: self.filter_color a: .7 if self.state == 'down' else .2 Ellipse: pos: self.x + 2, self.y + 2 size: self.width - 5, self.height - 5 markup: True color: (.8, .8, .8, 1) if self.state == 'down' else (0, 0, 0, 1) disabled: self.text == '-' background_color: 0, 0, 0, 0 size: dp(70), dp(70) font_size: '24sp' if self.state == 'down' else '18sp' size_hint: None, None ''') class FilterToggle(ToggleButton): filter_color = ListProperty([1, 1, 1, 1])
Builder.load_string(''' #:import Window kivy.core.window.Window #:import _ electrum_gui.kivy.i18n._ <WizardTextInput@TextInput> border: 4, 4, 4, 4 font_size: '15sp' padding: '15dp', '15dp' background_color: (1, 1, 1, 1) if self.focus else (0.454, 0.698, 0.909, 1) foreground_color: (0.31, 0.31, 0.31, 1) if self.focus else (0.835, 0.909, 0.972, 1) hint_text_color: self.foreground_color background_active: 'atlas://gui/kivy/theming/light/create_act_text_active' background_normal: 'atlas://gui/kivy/theming/light/create_act_text_active' size_hint_y: None height: '48sp' <WizardButton@Button>: root: None size_hint: 1, None height: '48sp' on_press: if self.root: self.root.dispatch('on_press', self) on_release: if self.root: self.root.dispatch('on_release', self) <BigLabel@Label> color: .854, .925, .984, 1 size_hint: 1, None text_size: self.width, None height: self.texture_size[1] bold: True <-WizardDialog> text_color: .854, .925, .984, 1 value: '' #auto_dismiss: False size_hint: None, None canvas.before: Color: rgba: 0, 0, 0, .9 Rectangle: size: Window.size Color: rgba: .239, .588, .882, 1 Rectangle: size: Window.size crcontent: crcontent # add electrumpq icon BoxLayout: orientation: 'vertical' if self.width < self.height else 'horizontal' padding: min(dp(27), self.width/32), min(dp(27), self.height/32),\ min(dp(27), self.width/32), min(dp(27), self.height/32) spacing: '10dp' GridLayout: id: grid_logo cols: 1 pos_hint: {'center_y': .5} size_hint: 1, None height: self.minimum_height Label: color: root.text_color text: 'ELECTRUMPQ' size_hint: 1, None height: self.texture_size[1] if self.opacity else 0 font_size: '33sp' font_name: 'gui/kivy/data/fonts/tron/Tr2n.ttf' GridLayout: cols: 1 id: crcontent spacing: '1dp' Widget: size_hint: 1, 0.3 GridLayout: rows: 1 spacing: '12dp' size_hint: 1, None height: self.minimum_height WizardButton: id: back text: _('Back') root: root WizardButton: id: next text: _('Next') root: root disabled: root.value == '' <WizardMultisigDialog> value: 'next' Widget size_hint: 1, 1 Label: color: root.text_color size_hint: 1, None text_size: self.width, None height: self.texture_size[1] text: _("Choose the number of signatures needed to unlock funds in your wallet") Widget size_hint: 1, 1 GridLayout: orientation: 'vertical' cols: 2 spacing: '14dp' size_hint: 1, 1 height: self.minimum_height Label: color: root.text_color text: _('From {} cosigners').format(n.value) Slider: id: n range: 2, 5 step: 1 value: 2 Label: color: root.text_color text: _('Require {} signatures').format(m.value) Slider: id: m range: 1, n.value step: 1 value: 2 <WizardChoiceDialog> message : '' Widget: size_hint: 1, 1 Label: color: root.text_color size_hint: 1, None text_size: self.width, None height: self.texture_size[1] text: root.message Widget size_hint: 1, 1 GridLayout: row_default_height: '48dp' orientation: 'vertical' id: choices cols: 1 spacing: '14dp' size_hint: 1, None <MButton@Button>: size_hint: 1, None height: '33dp' on_release: self.parent.update_amount(self.text) <WordButton@Button>: size_hint: None, None padding: '5dp', '5dp' text_size: None, self.height width: self.texture_size[0] height: '30dp' on_release: self.parent.new_word(self.text) <SeedButton@Button>: height: dp(100) border: 4, 4, 4, 4 halign: 'justify' valign: 'top' font_size: '18dp' text_size: self.width - dp(24), self.height - dp(12) color: .1, .1, .1, 1 background_normal: 'atlas://gui/kivy/theming/light/white_bg_round_top' background_down: self.background_normal size_hint_y: None <SeedLabel@Label>: font_size: '12sp' text_size: self.width, None size_hint: 1, None height: self.texture_size[1] halign: 'justify' valign: 'middle' border: 4, 4, 4, 4 <RestoreSeedDialog> message: '' word: '' BigLabel: text: "ENTER YOUR SEED PHRASE" GridLayout cols: 1 padding: 0, '12dp' orientation: 'vertical' spacing: '12dp' size_hint: 1, None height: self.minimum_height SeedButton: id: text_input_seed text: '' on_text: Clock.schedule_once(root.on_text) on_release: root.options_dialog() SeedLabel: text: root.message BoxLayout: id: suggestions height: '35dp' size_hint: 1, None new_word: root.on_word BoxLayout: id: line1 update_amount: root.update_text size_hint: 1, None height: '30dp' MButton: text: 'Q' MButton: text: 'W' MButton: text: 'E' MButton: text: 'R' MButton: text: 'T' MButton: text: 'Y' MButton: text: 'U' MButton: text: 'I' MButton: text: 'O' MButton: text: 'P' BoxLayout: id: line2 update_amount: root.update_text size_hint: 1, None height: '30dp' Widget: size_hint: 0.5, None height: '33dp' MButton: text: 'A' MButton: text: 'S' MButton: text: 'D' MButton: text: 'F' MButton: text: 'G' MButton: text: 'H' MButton: text: 'J' MButton: text: 'K' MButton: text: 'L' Widget: size_hint: 0.5, None height: '33dp' BoxLayout: id: line3 update_amount: root.update_text size_hint: 1, None height: '30dp' Widget: size_hint: 1, None MButton: text: 'Z' MButton: text: 'X' MButton: text: 'C' MButton: text: 'V' MButton: text: 'B' MButton: text: 'N' MButton: text: 'M' MButton: text: ' ' MButton: text: '<' <AddXpubDialog> title: '' message: '' BigLabel: text: root.title GridLayout cols: 1 padding: 0, '12dp' orientation: 'vertical' spacing: '12dp' size_hint: 1, None height: self.minimum_height SeedButton: id: text_input text: '' on_text: Clock.schedule_once(root.check_text) SeedLabel: text: root.message GridLayout rows: 1 spacing: '12dp' size_hint: 1, None height: self.minimum_height IconButton: id: scan height: '48sp' on_release: root.scan_xpub() icon: 'atlas://gui/kivy/theming/light/camera' size_hint: 1, None WizardButton: text: _('Paste') on_release: root.do_paste() WizardButton: text: _('Clear') on_release: root.do_clear() <ShowXpubDialog> xpub: '' message: _('Here is your master public key. Share it with your cosigners.') BigLabel: text: "MASTER PUBLIC KEY" GridLayout cols: 1 padding: 0, '12dp' orientation: 'vertical' spacing: '12dp' size_hint: 1, None height: self.minimum_height SeedButton: id: text_input text: root.xpub SeedLabel: text: root.message GridLayout rows: 1 spacing: '12dp' size_hint: 1, None height: self.minimum_height WizardButton: text: _('QR code') on_release: root.do_qr() WizardButton: text: _('Copy') on_release: root.do_copy() WizardButton: text: _('Share') on_release: root.do_share() <ShowSeedDialog> spacing: '12dp' value: 'next' BigLabel: text: "PLEASE WRITE DOWN YOUR SEED PHRASE" GridLayout: id: grid cols: 1 pos_hint: {'center_y': .5} size_hint_y: None height: self.minimum_height orientation: 'vertical' spacing: '12dp' SeedButton: text: root.seed_text on_release: root.options_dialog() SeedLabel: text: root.message <LineDialog> BigLabel: text: root.title SeedLabel: text: root.message TextInput: id: passphrase_input multiline: False size_hint: 1, None height: '27dp' SeedLabel: text: root.warning ''')
from kivy.app import App from kivy.lang import Builder from kivy.uix.screenmanager import ScreenManager, Screen from kivy.uix.popup import Popup Builder.load_file('screens.kv') Builder.load_file('landing.kv') Builder.load_file('home.kv') class Screens(ScreenManager): def __init__(self, **kwargs): super(Screens, self).__init__(**kwargs) self.current = 'landing' def navigate(self): self.current = 'home' class Landing(Screen): def __init__(self, **kwargs): super(Landing, self).__init__(**kwargs) self.name = 'landing' class Home(Screen): def __init__(self, **kwargs): super(Home, self).__init__(**kwargs) self.name = 'home'
def build(self): self.title = "Demoing the id attribute" self.root = Builder.load_file('self_root_ids.kv') return self.root
article = self.article.text title = self.title.text if keyword != "" and category != "" and article != "" and title != "": db.insert(keyword, title, category, article) print("成功插入数据记录:%s %s %s \n%s" % (title, category, keyword, article)) val.clear() sm.current = "main" else: popupWindow( "No enough arguments!", "Please finish all the arguments to complish record this article!" ) kv = Builder.load_file("my.kv") # 利用screenmanager实现界面切换 sm = WindowManager() db = DataBase() val = Val() screens = [ MainView(name="main"), ListView(name="list"), DetailView(name="detail") ] for screen in screens: sm.add_widget(screen) sm.current = "main" class MyMainApp(App):
class smoothButton(Button): pass class MyPopup(FloatLayout): pass def show_popup(): show = MyPopup() popupWindow = Popup(title="Dice rolled", content=show, size_hint=(None, None), size=(400, 400)) popupWindow.open() kv = Builder.load_file("UI.kv") class MyMainApp(App): def build(self): return Builder.load_file("UI.kv") if __name__ == "__main__": MyMainApp().run()
from kivy.lang import Builder import os Builder.load_string(''' <LoadDialog>: BoxLayout: size: root.size pos: root.pos orientation: "vertical" FileChooserIconView: id: filechooser multiselect: False path: root.path title: 'File to print' filters: ['*.g', '*.gcode', '*.nc'] BoxLayout: size_hint_y: None height: 30 Button: text: "Cancel" on_release: root.cancel() Button: text: "Load" on_release: root.load(filechooser.path, filechooser.selection) ''') class LoadDialog(FloatLayout): load = ObjectProperty(None)
Builder.load_string(''' <Custom@Button> font_size:'20dp' <CustomBox@BoxLayout> spacing:10 <CalcGridLayout> id: calc display: entry rows: 6 padding:10 spacing:10 BoxLayout: TextInput: id: entry font_size: '30dp' multiline: False CustomBox: Custom: text: 'AC' on_press: calc.clear() Custom: text: 'M+' on_press: calc.add_mem(entry.text) Custom: text: 'M-' on_press: calc.sub_mem(entry.text) Custom: text: 'MRC' on_press: calc.mrc_mem() CustomBox: Custom: text: '7' on_press: entry.text += self.text Custom: text: '8' on_press: entry.text += self.text Custom: text: '9' on_press: entry.text += self.text Custom: text: '+' on_press: entry.text += self.text CustomBox: Custom: text: '4' on_press: entry.text += self.text Custom: text: '5' on_press: entry.text += self.text Custom: text: '6' on_press: entry.text += self.text Custom: text: '-' on_press: entry.text += self.text CustomBox: Custom: text: '1' on_press: entry.text += self.text Custom: text: '2' on_press: entry.text += self.text Custom: text: '3' on_press: entry.text += self.text Custom: text: '*' on_press: entry.text += self.text CustomBox: Custom: text: '.' on_press: entry.text += self.text Custom: text: '0' on_press: entry.text += self.text Custom: id: equal text: '=' on_press: calc.calC(entry.text) Custom: text: '/' on_press: entry.text += self.text ''')
Builder.load_string(''' #:import os os <WalletDialog@Popup>: title: _('Wallets') id: popup path: os.path.dirname(app.get_wallet_path()) BoxLayout: orientation: 'vertical' padding: '10dp' FileChooserListView: id: wallet_selector dirselect: False filter_dirs: True filter: '*.*' path: root.path rootpath: root.path size_hint_y: 0.6 Widget size_hint_y: 0.1 GridLayout: cols: 3 size_hint_y: 0.1 Button: id: open_button size_hint: 0.1, None height: '48dp' text: _('New') on_release: popup.dismiss() root.new_wallet(app, wallet_selector.path) Button: id: open_button size_hint: 0.1, None height: '48dp' text: _('Open') disabled: not wallet_selector.selection on_release: popup.dismiss() root.open_wallet(app) ''')
Params = autoclass('android.view.WindowManager$LayoutParams') PythonActivity.mActivity.getWindow().addFlags(Params.FLAG_KEEP_SCREEN_ON) except: Logger.debug("jnius autoclass exception, app is not running on android") # for PC only #Window.size = (960, 540) #-------------------------------------------------------------------- # ---GLOBALS--- UPDATE_FG_RATE=20.0 #Hz Builder.load_file('APMenu.kv') Builder.load_file('ViewButtons.kv') Builder.load_file('LightsButtons.kv') Builder.load_file('Settings.kv') Builder.load_file('Disclaimer.kv') ''' class InfoPopup ''' class InfoPopup(Popup): txt = '' bindroot = ObjectProperty(None) #--------------------------------------------------------------------
Builder.load_string(''' <AddressLabel@Label> text_size: self.width, None halign: 'left' valign: 'top' <AddressItem@CardItem> address: '' memo: '' amount: '' status: '' BoxLayout: spacing: '8dp' height: '32dp' orientation: 'vertical' Widget AddressLabel: text: root.address shorten: True Widget AddressLabel: text: (root.amount if root.status == 'Funded' else root.status) + ' ' + root.memo color: .699, .699, .699, 1 font_size: '13sp' shorten: True Widget <AddressButton@Button>: background_color: 1, .585, .878, 0 halign: 'center' text_size: (self.width, None) shorten: True size_hint: 0.5, None default_text: '' text: self.default_text padding: '5dp', '5dp' height: '40dp' text_color: self.foreground_color disabled_color: 1, 1, 1, 1 foreground_color: 1, 1, 1, 1 canvas.before: Color: rgba: (0.9, .498, 0.745, 1) if self.state == 'down' else self.background_color Rectangle: size: self.size pos: self.pos <AddressesDialog@Popup> id: popup title: _('Addresses') message: '' pr_status: 'Pending' show_change: 0 show_used: 0 on_message: self.update() BoxLayout: id:box padding: '12dp', '12dp', '12dp', '12dp' spacing: '12dp' orientation: 'vertical' BoxLayout: spacing: '6dp' height: self.minimum_height size_hint: 1, None orientation: 'horizontal' AddressFilter: opacity: 1 size_hint: 1, None height: self.minimum_height spacing: '5dp' AddressButton: id: search text: {0:_('Receiving'), 1:_('Change'), 2:_('All')}[root.show_change] on_release: root.show_change = (root.show_change + 1) % 3 Clock.schedule_once(lambda dt: root.update()) AddressFilter: opacity: 1 size_hint: 1, None height: self.minimum_height spacing: '5dp' AddressButton: id: search text: {0:_('All'), 1:_('Unused'), 2:_('Funded'), 3:_('Used')}[root.show_used] on_release: root.show_used = (root.show_used + 1) % 4 Clock.schedule_once(lambda dt: root.update()) AddressFilter: opacity: 1 size_hint: 1, None height: self.minimum_height spacing: '5dp' canvas.before: Color: rgba: 0.9, 0.9, 0.9, 1 AddressButton: id: change text: root.message if root.message else _('Search') on_release: Clock.schedule_once(lambda dt: app.description_dialog(popup)) RecycleView: scroll_type: ['bars', 'content'] bar_width: '15dp' viewclass: 'AddressItem' id: search_container RecycleBoxLayout: orientation: 'vertical' default_size: None, dp(56) default_size_hint: 1, None size_hint_y: None height: self.minimum_height <AddressPopup@Popup>: address: '' balance: '' status: '' script_type: '' pk: '' address_color: 1, 1, 1, 1 address_background_color: 0.3, 0.3, 0.3, 1 BoxLayout: orientation: 'vertical' ScrollView: GridLayout: cols: 1 height: self.minimum_height size_hint_y: None padding: '10dp' spacing: '10dp' TopLabel: text: _('Address') RefLabel: color: root.address_color background_color: root.address_background_color data: root.address name: _('Address') GridLayout: cols: 1 size_hint_y: None height: self.minimum_height spacing: '10dp' BoxLabel: text: _('Balance') value: root.balance BoxLabel: text: _('Script type') value: root.script_type BoxLabel: text: _('Status') value: root.status TopLabel: text: _('Private Key') RefLabel: data: root.pk name: _('Private key') on_touched: if not self.data: root.do_export(self) Widget: size_hint: 1, 0.1 BoxLayout: size_hint: 1, None height: '48dp' Button: size_hint: 0.5, None height: '48dp' text: _('Receive') on_release: root.receive_at() Button: size_hint: 0.5, None height: '48dp' text: _('Close') on_release: root.dismiss() ''')
def build(self): """ build the Kivy app from the kv file """ Window.size = (400, 200) self.title = "Square Number" self.root = Builder.load_file('squaring.kv') return self.root
Builder.load_string(''' #:import Window kivy.core.window.Window #:import _ electrum_gui.kivy.i18n._ <WizardTextInput@TextInput> border: 4, 4, 4, 4 font_size: '15sp' padding: '15dp', '15dp' background_color: (1, 1, 1, 1) if self.focus else (0.454, 0.698, 0.909, 1) foreground_color: (0.31, 0.31, 0.31, 1) if self.focus else (0.835, 0.909, 0.972, 1) hint_text_color: self.foreground_color background_active: 'atlas://gui/kivy/theming/light/create_act_text_active' background_normal: 'atlas://gui/kivy/theming/light/create_act_text_active' size_hint_y: None height: '48sp' <WizardButton@Button>: root: None size_hint: 1, None height: '48sp' on_press: if self.root: self.root.dispatch('on_press', self) on_release: if self.root: self.root.dispatch('on_release', self) <-WizardDialog> text_color: .854, .925, .984, 1 #auto_dismiss: False size_hint: None, None canvas.before: Color: rgba: 0, 0, 0, .9 Rectangle: size: Window.size Color: rgba: .239, .588, .882, 1 Rectangle: size: Window.size crcontent: crcontent # add electrum icon BoxLayout: orientation: 'vertical' if self.width < self.height else 'horizontal' padding: min(dp(42), self.width/16), min(dp(60), self.height/16),\ min(dp(42), self.width/16), min(dp(72), self.height/16) spacing: '27dp' GridLayout: id: grid_logo cols: 1 pos_hint: {'center_y': .5} size_hint: 1, None #height: self.minimum_height Label: color: root.text_color text: 'ELECTRUM' size_hint: 1, None height: self.texture_size[1] if self.opacity else 0 font_size: '33sp' font_name: 'gui/kivy/data/fonts/tron/Tr2n.ttf' GridLayout: cols: 1 id: crcontent spacing: '1dp' <CreateRestoreDialog> Image: id: logo_img mipmap: True allow_stretch: True size_hint: 1, None height: '110dp' source: 'atlas://gui/kivy/theming/light/electrum_icon640' Widget: size_hint: 1, 1 Label: color: root.text_color size_hint: 1, None text_size: self.width, None height: self.texture_size[1] text: _("Wallet file not found")+"\\n\\n" +\ _("Do you want to create a new wallet ")+\ _("or restore an existing one?") Widget size_hint: 1, 1 GridLayout: id: grid orientation: 'vertical' cols: 1 spacing: '14dp' size_hint: 1, None height: self.minimum_height WizardButton: id: create text: _('Create a new seed') root: root WizardButton: id: restore text: _('I already have a seed') root: root <MButton@Button>: size_hint: 1, None height: '33dp' on_release: self.parent.update_amount(self.text) <WordButton@Button>: size_hint: None, None padding: '5dp', '5dp' text_size: None, self.height width: self.texture_size[0] height: '30dp' on_release: self.parent.new_word(self.text) <SeedButton@Button>: height: dp(100) border: 4, 4, 4, 4 halign: 'justify' valign: 'top' font_size: '18dp' text_size: self.width - dp(24), self.height - dp(12) color: .1, .1, .1, 1 background_normal: 'atlas://gui/kivy/theming/light/white_bg_round_top' background_down: self.background_normal size_hint_y: None <SeedLabel@Label>: font_size: '12sp' text_size: self.width, None size_hint: 1, None height: self.texture_size[1] halign: 'justify' valign: 'middle' border: 4, 4, 4, 4 <RestoreSeedDialog> word: '' Label: color: root.text_color size_hint: 1, None text_size: self.width, None height: self.texture_size[1] text: "[b]ENTER YOUR SEED PHRASE[/b]" GridLayout cols: 1 padding: 0, '12dp' orientation: 'vertical' spacing: '12dp' size_hint: 1, None height: self.minimum_height SeedButton: id: text_input_seed text: '' on_text: Clock.schedule_once(root.on_text) SeedLabel: text: root.message BoxLayout: id: suggestions height: '35dp' size_hint: 1, None new_word: root.on_word BoxLayout: id: line1 update_amount: root.update_text size_hint: 1, None height: '30dp' MButton: text: 'Q' MButton: text: 'W' MButton: text: 'E' MButton: text: 'R' MButton: text: 'T' MButton: text: 'Y' MButton: text: 'U' MButton: text: 'I' MButton: text: 'O' MButton: text: 'P' BoxLayout: id: line2 update_amount: root.update_text size_hint: 1, None height: '30dp' Widget: size_hint: 0.5, None height: '33dp' MButton: text: 'A' MButton: text: 'S' MButton: text: 'D' MButton: text: 'F' MButton: text: 'G' MButton: text: 'H' MButton: text: 'J' MButton: text: 'K' MButton: text: 'L' Widget: size_hint: 0.5, None height: '33dp' BoxLayout: id: line3 update_amount: root.update_text size_hint: 1, None height: '30dp' Widget: size_hint: 1, None MButton: text: 'Z' MButton: text: 'X' MButton: text: 'C' MButton: text: 'V' MButton: text: 'B' MButton: text: 'N' MButton: text: 'M' MButton: text: ' ' MButton: text: '<' Widget: size_hint: 1, 1 GridLayout: rows: 1 spacing: '12dp' size_hint: 1, None height: self.minimum_height WizardButton: id: back text: _('Back') root: root IconButton: id: scan on_release: root.scan_seed() icon: 'atlas://gui/kivy/theming/light/camera' WizardButton: id: next text: _('Next') root: root disabled: True <ShowSeedDialog> spacing: '12dp' Label: color: root.text_color size_hint: 1, None text_size: self.width, None height: self.texture_size[1] text: "[b]PLEASE WRITE DOWN YOUR SEED PHRASE[/b]" GridLayout: id: grid cols: 1 pos_hint: {'center_y': .5} size_hint_y: None height: self.minimum_height orientation: 'vertical' spacing: '12dp' SeedButton: text: root.seed_text SeedLabel: text: root.message Widget: size_hint: 1, 1 GridLayout: rows: 1 spacing: '12dp' size_hint: 1, None height: self.minimum_height WizardButton: id: back text: _('Back') root: root WizardButton: id: confirm text: _('Confirm') root: root ''')