Beispiel #1
0
class TicTacToeApp(App):

    game = ObjectProperty(None)
    sm = ObjectProperty(None)
    winning_screen = ObjectProperty(None)

    def build(self):

        menu = MenuScreen(name="Menu")
        self.winning_screen = FinalScreen(name="Win")
        self.sm = ScreenManager()
        self.game = GameScreen(False, name="Tic Tac Toe")
        self.sm.add_widget(menu)
        self.sm.add_widget(self.game)
        self.sm.add_widget(self.winning_screen)

        #Clock.schedule_interval(game.botTurn, 0.5)
        return self.sm

        #return Symbol()

    def new_game(self, human):
        if self.sm.has_screen("Tic Tac Toe"):
            self.sm.remove_widget(self.game)

        self.game = GameScreen(human, name="Tic Tac Toe")
        self.sm.add_widget(self.game)
        self.sm.current = "Tic Tac Toe"

    def display_winner(self, winner):
        self.winning_screen.update_winner(winner)
        self.sm.current = "Win"
Beispiel #2
0
class MyScreen(Singleton):
  def __init__(self):
    self.screenMgr = ScreenManager(size=WH)
    self.name = "Root Screen"
    self.transition = WipeTransition()
    # or self.transition = SlideTransition(direction="down")
    self.emptyScreen = Screen(name = "empty screen")
    #self.emptyScreen.add_widget(Label(text="empty.screen"))
    self.add_screen(self.emptyScreen)
    self.current_screen(self.emptyScreen)
    
  def prev_screen(self):
    prev_screen = self.screenMgr.previous()
    if prev_screen:
      self.screenMgr.current = prev_screen
  
  def add_screen(self, screen):
    if screen.name not in self.screenMgr.screen_names:
      self.screenMgr.add_widget(screen)
    
  def current_screen(self, screen):
    if self.screenMgr.current != screen.name:
      if not self.screenMgr.has_screen(screen.name):
        self.add_screen(screen)
      self.screenMgr.current = screen.name
    
  def remove_screen(self, screen):
    if screen.name in self.screenMgr.screen_names:
      self.screenMgr.remove_widget(screen)
      self.prev_screen()
  
  def get_current_screen(self):
    return self.screenMgr.current_screen
Beispiel #3
0
class MyScreen(Singleton):
    def __init__(self):
        self.screenMgr = ScreenManager(size=WH)
        self.name = "Root Screen"
        self.transition = WipeTransition()
        # or self.transition = SlideTransition(direction="down")
        self.emptyScreen = Screen(name="empty screen")
        #self.emptyScreen.add_widget(Label(text="empty.screen"))
        self.add_screen(self.emptyScreen)
        self.current_screen(self.emptyScreen)

    def prev_screen(self):
        prev_screen = self.screenMgr.previous()
        if prev_screen:
            self.screenMgr.current = prev_screen

    def add_screen(self, screen):
        if screen.name not in self.screenMgr.screen_names:
            self.screenMgr.add_widget(screen)

    def current_screen(self, screen):
        if True or self.screenMgr.current != screen.name and self.screenMgr.has_screen(
                screen.name):
            self.screenMgr.current = screen.name

    def remove_screen(self, screen):
        if screen.name in self.screenMgr.screen_names:
            self.screenMgr.remove_widget(screen)
            self.prev_screen()

    def get_current_screen(self):
        return self.screenMgr.current
Beispiel #4
0
class SwitchBoard(GridLayout):
    '''
    Holds a bunch of Screens inside a screen manager an can switch with a UI
    '''

    def __init__(self, app, screens, *args, **kwargs):
        '''
        params:-
            app : Visualliser : The parent of this
            screens : (Screen, ...) : Screens to be added onto the UI
        '''
        super().__init__(*args, **kwargs)

        self.app = app

        self.cols = 1
        self.rows = 2

        self.screen_manager = ScreenManager()
        self.screen_manager.transition = SwapTransition()

        # Add screens to the screen manager
        for screen in screens:
            self.screen_manager.add_widget(screen)

        self.add_widget(self.screen_manager)

        # Add the UI buttons
        ui = GridLayout(rows=1, size_hint_y=None, height=20)

        ui.add_widget(Button(on_press=lambda a: self.switch_screen( str(int(self.screen_manager.current) - 1)) ))
        ui.add_widget(Button(on_press=lambda a: self.switch_screen( str(int(self.screen_manager.current) + 1)) ))

        self.add_widget(ui)


    def switch_screen(self, name):
        '''
        params:-
            name : str : Name of the screen you want to change to
        returns:-
            None : Changes the window to the new board
        '''
        if self.screen_manager.has_screen(name):
            self.screen_manager.current = name
Beispiel #5
0
class CalendarWidgetM(RelativeLayout):
    """ Basic calendar widget """

    def __init__(self, as_popup=False, touch_switch=False, *args, **kwargs):
        super(CalendarWidgetM, self).__init__(*args, **kwargs)

        self.as_popup = as_popup
        self.touch_switch = touch_switch
        self.prepare_data()
        monthlyWrkHours.getHolidays()
        self.init_ui()

    def init_ui(self):

        self.left_arrow = arrowBtn(text="<", on_press=self.go_prev,
                                      pos_hint={"top": 1, "left": 0}, size_hint=(.1, .1))

        self.right_arrow = arrowBtn(text=">", on_press=self.go_next,
                                       pos_hint={"top": 1, "right": 1}, size_hint=(.1, .1))

        self.add_widget(self.left_arrow)
        self.add_widget(self.right_arrow)

        # Title
        self.title_label = monthBtn(text=self.title, pos_hint={"top": 1, "center_x": .5}, size_hint=(None, 0.15), halign=("center"))
        monthlyPopup.month = self.title
        self.add_widget(self.title_label)

        # ScreenManager
        self.sm = ScreenManager(pos_hint={"top": .9}, size_hint=(1, .9))
        self.add_widget(self.sm)

        self.create_month_scr(self.quarter[1], toogle_today=True)

    def create_month_scr(self, month, toogle_today=False):
        """ Screen with calendar for one month """
        monthlyWrkHours.calArtistLeave(self.active_date[2], str(self.active_date[1]).zfill(2), str(self.active_date[0]).zfill(2))
        #self.active_date[0] = day, self.active_date[1] = month, self.active_date[2] = year

        scr = Screen()
        m = self.month_names_eng[self.active_date[1] - 1]
        scr.name = "%s-%s" % (m, self.active_date[2])  # like march-2015

        # Grid for days
        grid_layout = GridLayout(cols=7, rows=7, size_hint=(1, 1), pos_hint={"top": 1}, spacing = 2)
        scr.add_widget(grid_layout)

        # Days abbrs
        for i in range(7):
            if i >= 5:  # weekends
                l = WeekEndLabel(text=self.days_abrs[i])
            else:  # work days
                l = WrkDayLabel(text=self.days_abrs[i])

            grid_layout.add_widget(l)

        global aboveSWH, belowSWH, holidays, artistHolidays

        # Buttons with days numbers
        for week in month:
            for day in week:
                if day[1] >= 6:  # weekends
                    self.tbtn = CalNormalButton(text=str(day[0]), background_color=(0.5, 0.5, 0.5, 1), color=(1, 1, 1, 1))
                else:
                    self.tbtn = CalNormalButton(text=str(day[0]), background_color=(255, 255, 255, 1), color=(0, 0, 0, 1))
                    for i in range(len(aboveSWH)):
                        if self.active_date[2] == aboveSWH[i][2]:
                            if self.active_date[1] == aboveSWH[i][1]:
                                if self.tbtn.text == str(aboveSWH[i][0]):
                                    self.tbtn.background_color=(0, 255, 0, 0.7)
                    for i in range(len(belowSWH)):
                        if self.active_date[2] == belowSWH[i][2]:
                            if self.active_date[1] == belowSWH[i][1]:
                                if self.tbtn.text == str(belowSWH[i][0]):
                                    self.tbtn.background_color=(255, 0, 0, 0.7)
                    for i in range(len(reg)):
                        if self.active_date[2] == reg[i][2]:
                            if self.active_date[1] == reg[i][1]:
                                if self.tbtn.text == str(reg[i][0]):
                                    self.tbtn.ids.calLbl.text = 'R'
                    for i in range(len(leaves)):
                        if self.active_date[2] == leaves[i][2]:
                            if self.active_date[1] == leaves[i][1]:
                                if day[0] == (leaves[i][0]):
                                    self.tbtn.background_color=(255, 195, 0, 0.7)
                    for i in range(len(holidays)):
                        if self.active_date[2] == holidays[i][2]:
                            if self.active_date[1] == holidays[i][1]:
                                if day[0] == holidays[i][0]:
                                    self.tbtn.background_color=(0, 0, 255, 0.7)

                self.tbtn.bind(on_press=self.get_btn_value)

                """if toogle_today:
                    # Down today button
                    if day[0] == self.active_date[0] and day[2] == 1:
                        self.tbtn.state = "down"""
                # Disable buttons with days from other months
                if day[2] == 0:
                    self.tbtn.text = " "
                    self.tbtn.disabled = True
                    self.tbtn.background_color = (255, 255, 255, 1)

                grid_layout.add_widget(self.tbtn)

        self.sm.add_widget(scr)

    def prepare_data(self):
        """ Prepare data for showing on widget loading """

        # Get days abbrs and month names lists
        self.month_names = cal_data.get_month_names()
        self.month_names_eng = cal_data.get_month_names_eng()
        self.days_abrs = cal_data.get_days_abbrs()

        # Today date
        self.active_date = cal_data.today_date_list()
        # Set title
        self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1],
                                  self.active_date[2])

        # Quarter where current month in the self.quarter[1]
        self.get_quarter()

    def get_quarter(self):
        """ Get caledar and months/years nums for quarter """

        self.quarter_nums = cal_data.calc_quarter(self.active_date[2],
                                                  self.active_date[1])
        self.quarter = cal_data.get_quarter(self.active_date[2],
                                            self.active_date[1])

    def get_btn_value(self, inst):
        """ Get day value from pressed button """
        from pages import userPage, infoPopup, table, monthlyPopup

        global id

        self.active_date[0] = int(inst.text)
        formatted_date = "{}:{}:{}".format(str(self.active_date[0]).zfill(2), str(self.active_date[1]).zfill(2), self.active_date[2])
        print(formatted_date)

        getInfo.date = formatted_date
        userPage.date = formatted_date
        infoPopup.date = formatted_date
        #infoPopup.InfoTab().popInfo(formatted_date)
        table.date = formatted_date
        monthlyPopup.date = formatted_date

        if self.as_popup:
            self.parent_popup.dismiss()

        #getInfo.getUserInfo(id, formatted_date)

    def go_prev(self, inst):
        """ Go to screen with previous month """
        monthlyWrkHours.calArtistLeave(self.quarter_nums[0][0], self.quarter_nums[0][1], self.active_date[0])

        # Change active date
        self.active_date = [self.active_date[0], self.quarter_nums[0][1],
                            self.quarter_nums[0][0]]

        # Name of prev screen
        n = self.quarter_nums[0][1] - 1
        prev_scr_name = "%s-%s" % (self.month_names_eng[n],
                                   self.quarter_nums[0][0])

        # If it's doen't exitst, create it
        if not self.sm.has_screen(prev_scr_name):
            self.create_month_scr(self.quarter[0])

        self.sm.current = prev_scr_name
        self.sm.transition.direction = "left"

        self.get_quarter()
        self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1],
                                  self.active_date[2])

        self.title_label.text = self.title

        # assign title to monthlyPopup
        monthlyPopup.month = self.title

    def go_next(self, inst):
        """ Go to screen with next month """
        monthlyWrkHours.calArtistLeave(self.quarter_nums[2][0], self.quarter_nums[2][1], self.active_date[0])

         # Change active date
        self.active_date = [self.active_date[0], self.quarter_nums[2][1],
                            self.quarter_nums[2][0]]

        # Name of prev screen
        n = self.quarter_nums[2][1] - 1
        next_scr_name = "%s-%s" % (self.month_names_eng[n],
                                   self.quarter_nums[2][0])

        # If it's doen't exitst, create it
        if not self.sm.has_screen(next_scr_name):
            self.create_month_scr(self.quarter[2])

        self.sm.current = next_scr_name
        self.sm.transition.direction = "right"

        self.get_quarter()
        self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1],
                                  self.active_date[2])

        self.title_label.text = self.title

        # assign title to monthlyPopup
        monthlyPopup.month = self.title

    def on_touch_move(self, touch):
        """ Switch months pages by touch move """

        if self.touch_switch:
            # Left - prev
            if touch.dpos[0] < -30:
                self.go_prev(None)
            # Right - next
            elif touch.dpos[0] > 30:
                self.go_next(None)
Beispiel #6
0
class Car(MDApp):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.title = "Infernus"
        self.theme_cls.primary_palette = "DeepOrange"
        self.theme_cls.theme_style = "Light"
        self.sm = ScreenManager()
        self.has_animated_card = False
        self.has_animated_background = False

    def login(self, usr, passwd):
        if (usr.text == "salman97" and passwd.text == "salman"):
            #Snackbar(text="Welcome " + usr.text + "!").show()
            toast("Welcome " + usr.text + "!")
            self.manage_screens("home_screen", "add")
            self.change_screen("home_screen")

        else:
            toast("Incorrect username and/or password!")
            #Snackbar(text="Incorrect username and/or password!").show()

    def animate_background(self, widget):
        if self.has_animated_background == False:
            anim = Animation(size_hint_y=1) + Animation(size_hint_y=0.5)
            anim.start(widget.ids.bx)

    def animate_card(self, widget):
        # {"center_x": 0.5, "center_y": 0.6}
        if self.has_animated_card == False:
            anim = Animation(pos_hint={
                "center_x": 0.5,
                "center_y": 0.6
            },
                             duration=0.5)
            anim.start(widget)
            self.has_animated_card = True

    def change_screen(self, screen_name):
        if self.sm.has_screen(screen_name):
            self.sm.current = screen_name

    def manage_screens(self, screen_name, action):
        scns = {
            "login_screen": Factory.LoginScreen,
            "home_screen": Factory.HomeScreen,
            "explore_screen": Factory.ExploreScreen
        }
        try:

            if action == "remove":
                if self.sm.has_screen(screen_name):
                    self.sm.remove_widget(self.sm.get_screen(screen_name))
                #print("Screen ["+screen_name+"] removed")
            elif action == "add":
                if self.sm.has_screen(screen_name):
                    pass
                    #print("Screen [" + screen_name + "] already exists")
                else:
                    self.sm.add_widget(scns[screen_name](name=screen_name))
                    #print(screen_name + " added")
                    #print("Screen ["+screen_name+"] added")
        except:
            print(traceback.format_exc())
            print("Traceback ^.^")

    def on_pause(self):
        return True

    def on_resume(self):
        pass

    def build(self):
        print('hello')
        self.bind(on_start=self.post_build_init)
        self.sm.add_widget(Factory.LoginScreen())
        self.sm.add_widget(Factory.HomeScreen())
        self.sm.current = "login_screen"
        return self.sm

    def post_build_init(self, ev):
        win = self._app_window
        win.bind(on_keyboard=self._key_handler)

    def _key_handler(self, *args):
        key = args[1]
        # 1000 is "back" on Android
        # 27 is "escape" on computers
        if key in (1000, 27):
            try:
                self.sm.current = "login_screen"
            except Exception as e:
                print(e)
            return True
        elif key == 1001:
            try:
                self.sm.current = "login_screen"
            except Exception as e:
                print(e)
            return True
Beispiel #7
0
class JewelApp(App):
    score = NumericProperty(0)

    score_multiplier = NumericProperty(1)

    score_combo = NumericProperty(0)

    timer = NumericProperty(LEVEL_TIME)

    level_time = NumericProperty(LEVEL_TIME)

    timer_next = NumericProperty(0)

    no_touch = BooleanProperty(False)

    highscores = ListProperty([0, 0, 0])

    background_rgb = ListProperty([0, 0, 0])

    sidebar_warning_color = ListProperty([0, 0, 0, 0])

    time = NumericProperty(0)

    score_levels = ListProperty([0])

    gameover_graph = ObjectProperty()

    timer_hint = NumericProperty(0)

    def build(self):
        self.textures = {}
        self.load_sounds()
        self.highscore_fn = join(self.user_data_dir, 'highscore.dat')

        from kivy.base import EventLoop
        EventLoop.ensure_window()
        # load textures
        for fn in ('gem', 'gem_selected', 't5', 't10', 'tarea', 'tline', 'star'):
            texture = CoreImage(join('data', '{}.png'.format(fn)), mipmap=True).texture
            self.textures[fn] = texture


        self.root = ScreenManager(transition=SlideTransition())

        self.bind(score_combo=self.check_game_over,
                timer=self.check_game_over,
                timer_next=self.check_game_over)
        self.ui_jewel = JewelUI(name='jewel')
        self.root.add_widget(self.ui_jewel)
        self.start()

        Clock.schedule_interval(self.update_time, 1 / 20.)
        #Clock.schedule_interval(self._stats, 1 / 60.)
        #self._stats()

        if False:
            def debug_leaks(*args):
                import gc; gc.collect()
                print 'collect()', len(gc.get_objects())
                import objgraph;
                #print len(objgraph.by_type('PropertyStorage'))
                objgraph.show_growth()
                #print objgraph.typestats(objgraph.get_leaking_objects())
                #objgraph.show_most_common_types()
            Clock.schedule_interval(debug_leaks, 1.)

        # load highscores
        if not exists(self.highscore_fn):
            return
        try:
            with open(self.highscore_fn) as fd:
                version, highscores = json.load(fd)
            if version == HIGHSCORE_VERSION:
                self.highscores = highscores
        except:
            pass

    def save_highscore(self):
        highscores = self.highscores + [self.score]
        highscores.sort()
        highscores = list(reversed(highscores))[:3]
        self.highscores = highscores
        with open(self.highscore_fn, 'w') as fd:
            json.dump([HIGHSCORE_VERSION, self.highscores], fd)

    def start(self):
        if not self.board.first_run:
            self.board.reset()

        self.score = 0
        self.score_combo = 0
        self.score_multiplier = 1
        self.timer = LEVEL_TIME
        self.level_time = LEVEL_TIME
        self.start_time = self.timer_hint = time()
        self.no_touch = False
        self.score_levels = [0]
        self.audio_warning_index = -1

        self.root.current = 'jewel'

        Clock.schedule_interval(self.update_timer, 1 / 20.)

        self.bind(score_multiplier=self.update_background)
        self.update_background()

        self.show_text('Level 1')

    def update_background(self, *args):
        index = (self.score_multiplier - 1) % len(BACKGROUND_COLORS)
        c = BACKGROUND_COLORS[index]
        Animation(background_rgb=c).start(self)

    def game_over(self):
        self.no_touch = True
        self.timer = 0
        self.board.gameover()
        self.sound('end')
        Clock.unschedule(self.update_timer)

    def check_game_over(self, *args):
        if any([self.score_combo, self.timer, self.timer_next]):
            return
        if self.no_touch:
            self.save_highscore()
            if not self.root.has_screen('gameover'):
                self.gameover = GameOver(name='gameover')
                self.root.add_widget(GameOver(name='gameover'))
            self.root.current = 'gameover'

    def update_time(self, dt):
        self.time += dt

    def update_timer(self, dt):
        self.sound_played = []
        current_time = time()
        self.timer = self.level_time - (current_time - self.start_time)

        should_hint = current_time - self.timer_hint
        if should_hint > HINT_TIME:
            self.timer_hint = current_time
            if self.score_combo == 0:
                self.board.highlight_move()

        t = self.timer + self.timer_next
        if t < 10:
            a = abs(sin(self.time * 3))
            self.sidebar_warning_color = [1, .1, .1,
                    ((10. - t) / 10.) * .3 + a * .5]

            audio_warning_index = 10 - int(t)
            if audio_warning_index != self.audio_warning_index:
                self.play_sound('warning',
                        volume=(audio_warning_index / 15.))
                self.audio_warning_index = audio_warning_index

        else:
            self.sidebar_warning_color = [0, 0, 0, 0]
            self.audio_warning_index = -1


        if self.timer > 0:
            return

        if self.timer_next == 0:
            self.game_over()
            return

        # next level!
        self.score_multiplier += 1
        self.start_time = time()
        self.level_time = self.timer_next
        self.timer = self.level_time - (time() - self.start_time)
        self.timer_next = self.property('timer_next').defaultvalue
        self.score_levels.append(0)
        self.board.levelup()
        self.show_text('Level {}'.format(self.score_multiplier))
        self.sound('levelup')


    def add_score(self, ix, iy, pattern, count):
        x, y = self.board.index_to_pos(ix, iy)

        m = self.score_multiplier
        score = 0
        if pattern == 'classic':
            score += count * 50
        elif pattern == '4j':
            score += count * 100
        elif pattern == '5j':
            score += count * 150
        elif pattern == '2axes':
            score += count * 200
        elif pattern == 'area':
            score += count * 500
        elif pattern == 'line':
            score += count * 1000
        elif pattern == 'combo':
            score += self.score_combo * 1000

        score *= m
        self.score += score
        self.score_levels[-1] += score

        if score == 0:
            return

        js = self.board.jewel_size
        label = ScoreLabel(text='{}'.format(score), origin=(x + js / 2, y + js / 2))
        self.ui_jewel.add_widget(label)

    def increase_timer_next(self, t):
        if self.no_touch:
            return
        self.timer_next = min(LEVEL_TIME, t + self.timer_next)

    def reset_combo(self):
        self.score_combo = 0
        self.timer_hint = time()

    def show_text(self, text):
        ttext = TitleText(text=text)
        self.ui_jewel.add_widget(ttext)

    def load_sounds(self):
        self.music = SoundLoader.load('data/audio/Tetra_-_Hunters.ogg')
        self.music.volume = .35
        self.music.loop = True
        self.music.play()

        self.sounds = {}
        self.load_sound('move', 'move.ogg', count=5)
        self.load_sound('levelup', 'levelup.ogg')
        self.load_sound('end', 'end.ogg')
        self.load_sound('time5', 'time5.ogg', count=2)
        self.load_sound('time10', 'time10.ogg', count=2)
        self.load_sound('warning', 'warning.ogg')
        self.load_sound('explode-line', 'explode-line.ogg', count=2)
        self.load_sound('explode-area', 'explode-area.ogg', count=2)

    def load_sound(self, action, fn, count=1):
        sounds = [SoundLoader.load('data/audio/{}'.format(fn)) for x in range(count)]
        self.sounds[action] = sounds

    def play_sound(self, action, volume=1.):
        if action in self.sound_played:
            return
        self.sound_played.append(action)
        sounds = self.sounds[action]
        sound = sounds.pop(0)
        sound.volume = volume
        sound.play()
        sounds.append(sound)

    def sound(self, action):
        # no sound for explode yet.
        if action == 'explode':
            action = 'move'
        self.play_sound(action)

    '''
Beispiel #8
0
class JewelApp(App):
    score = NumericProperty(0)

    score_multiplier = NumericProperty(1)

    score_combo = NumericProperty(0)

    timer = NumericProperty(LEVEL_TIME)

    level_time = NumericProperty(LEVEL_TIME)

    timer_next = NumericProperty(0)

    no_touch = BooleanProperty(False)

    highscores = ListProperty([0, 0, 0])

    background_rgb = ListProperty([0, 0, 0])

    sidebar_warning_color = ListProperty([0, 0, 0, 0])

    time = NumericProperty(0)

    score_levels = ListProperty([0])

    gameover_graph = ObjectProperty()

    timer_hint = NumericProperty(0)

    def build(self):
        self.textures = {}
        self.load_sounds()
        self.highscore_fn = join(self.user_data_dir, 'highscore.dat')

        from kivy.base import EventLoop
        EventLoop.ensure_window()
        # load textures
        for fn in ('gem', 'gem_selected', 't5', 't10', 'tarea', 'tline',
                   'star'):
            texture = CoreImage(join('data', '{}.png'.format(fn)),
                                mipmap=True).texture
            self.textures[fn] = texture

        self.root = ScreenManager(transition=SlideTransition())

        self.bind(score_combo=self.check_game_over,
                  timer=self.check_game_over,
                  timer_next=self.check_game_over)
        self.ui_jewel = JewelUI(name='jewel')
        self.root.add_widget(self.ui_jewel)
        self.start()

        Clock.schedule_interval(self.update_time, 1 / 20.)
        #Clock.schedule_interval(self._stats, 1 / 60.)
        #self._stats()

        if False:

            def debug_leaks(*args):
                import gc
                gc.collect()
                print 'collect()', len(gc.get_objects())
                import objgraph
                #print len(objgraph.by_type('PropertyStorage'))
                objgraph.show_growth()
                #print objgraph.typestats(objgraph.get_leaking_objects())
                #objgraph.show_most_common_types()

            Clock.schedule_interval(debug_leaks, 1.)

        # load highscores
        if not exists(self.highscore_fn):
            return
        try:
            with open(self.highscore_fn) as fd:
                version, highscores = json.load(fd)
            if version == HIGHSCORE_VERSION:
                self.highscores = highscores
        except:
            pass

    def save_highscore(self):
        highscores = self.highscores + [self.score]
        highscores.sort()
        highscores = list(reversed(highscores))[:3]
        self.highscores = highscores
        with open(self.highscore_fn, 'w') as fd:
            json.dump([HIGHSCORE_VERSION, self.highscores], fd)

    def start(self):
        if not self.board.first_run:
            self.board.reset()

        self.score = 0
        self.score_combo = 0
        self.score_multiplier = 1
        self.timer = LEVEL_TIME
        self.level_time = LEVEL_TIME
        self.start_time = self.timer_hint = time()
        self.no_touch = False
        self.score_levels = [0]
        self.audio_warning_index = -1

        self.root.current = 'jewel'

        Clock.schedule_interval(self.update_timer, 1 / 20.)

        self.bind(score_multiplier=self.update_background)
        self.update_background()

        self.show_text('Level 1')

    def update_background(self, *args):
        index = (self.score_multiplier - 1) % len(BACKGROUND_COLORS)
        c = BACKGROUND_COLORS[index]
        Animation(background_rgb=c).start(self)

    def game_over(self):
        self.no_touch = True
        self.timer = 0
        self.board.gameover()
        self.sound('end')
        Clock.unschedule(self.update_timer)

    def check_game_over(self, *args):
        if any([self.score_combo, self.timer, self.timer_next]):
            return
        if self.no_touch:
            self.save_highscore()
            if not self.root.has_screen('gameover'):
                self.gameover = GameOver(name='gameover')
                self.root.add_widget(GameOver(name='gameover'))
            self.root.current = 'gameover'

    def update_time(self, dt):
        self.time += dt

    def update_timer(self, dt):
        self.sound_played = []
        current_time = time()
        self.timer = self.level_time - (current_time - self.start_time)

        should_hint = current_time - self.timer_hint
        if should_hint > HINT_TIME:
            self.timer_hint = current_time
            if self.score_combo == 0:
                self.board.highlight_move()

        t = self.timer + self.timer_next
        if t < 10:
            a = abs(sin(self.time * 3))
            self.sidebar_warning_color = [
                1, .1, .1, ((10. - t) / 10.) * .3 + a * .5
            ]

            audio_warning_index = 10 - int(t)
            if audio_warning_index != self.audio_warning_index:
                self.play_sound('warning', volume=(audio_warning_index / 15.))
                self.audio_warning_index = audio_warning_index

        else:
            self.sidebar_warning_color = [0, 0, 0, 0]
            self.audio_warning_index = -1

        if self.timer > 0:
            return

        if self.timer_next == 0:
            self.game_over()
            return

        # next level!
        self.score_multiplier += 1
        self.start_time = time()
        self.level_time = self.timer_next
        self.timer = self.level_time - (time() - self.start_time)
        self.timer_next = self.property('timer_next').defaultvalue
        self.score_levels.append(0)
        self.board.levelup()
        self.show_text('Level {}'.format(self.score_multiplier))
        self.sound('levelup')

    def add_score(self, ix, iy, pattern, count):
        x, y = self.board.index_to_pos(ix, iy)

        m = self.score_multiplier
        score = 0
        if pattern == 'classic':
            score += count * 50
        elif pattern == '4j':
            score += count * 100
        elif pattern == '5j':
            score += count * 150
        elif pattern == '2axes':
            score += count * 200
        elif pattern == 'area':
            score += count * 500
        elif pattern == 'line':
            score += count * 1000
        elif pattern == 'combo':
            score += self.score_combo * 1000

        score *= m
        self.score += score
        self.score_levels[-1] += score

        if score == 0:
            return

        js = self.board.jewel_size
        label = ScoreLabel(text='{}'.format(score),
                           origin=(x + js / 2, y + js / 2))
        self.ui_jewel.add_widget(label)

    def increase_timer_next(self, t):
        if self.no_touch:
            return
        self.timer_next = min(LEVEL_TIME, t + self.timer_next)

    def reset_combo(self):
        self.score_combo = 0
        self.timer_hint = time()

    def show_text(self, text):
        ttext = TitleText(text=text)
        self.ui_jewel.add_widget(ttext)

    def load_sounds(self):
        self.music = SoundLoader.load('data/audio/Tetra_-_Hunters.ogg')
        self.music.volume = .35
        self.music.loop = True
        self.music.play()

        self.sounds = {}
        self.load_sound('move', 'move.ogg', count=5)
        self.load_sound('levelup', 'levelup.ogg')
        self.load_sound('end', 'end.ogg')
        self.load_sound('time5', 'time5.ogg', count=2)
        self.load_sound('time10', 'time10.ogg', count=2)
        self.load_sound('warning', 'warning.ogg')
        self.load_sound('explode-line', 'explode-line.ogg', count=2)
        self.load_sound('explode-area', 'explode-area.ogg', count=2)

    def load_sound(self, action, fn, count=1):
        sounds = [
            SoundLoader.load('data/audio/{}'.format(fn)) for x in range(count)
        ]
        self.sounds[action] = sounds

    def play_sound(self, action, volume=1.):
        if action in self.sound_played:
            return
        self.sound_played.append(action)
        sounds = self.sounds[action]
        sound = sounds.pop(0)
        sound.volume = volume
        sound.play()
        sounds.append(sound)

    def sound(self, action):
        # no sound for explode yet.
        if action == 'explode':
            action = 'move'
        self.play_sound(action)

    '''
Beispiel #9
0
class LeaveDetLayout(BoxLayout):
    def __init__(self, **args):
        super(LeaveDetLayout, self).__init__(**args)
        self.artistDetList = usersListManip.getUserInfo()
        self.setup()
        self.init_ui()

    def init_ui(self):
        self.sm1 = ScreenManager(pos_hint={"top": .9}, size_hint=(1, .9))
        self.ids.dateInfo.add_widget(self.sm1)

        self.sm2 = ScreenManager(pos_hint={"top": 1}, size_hint=(1, 1))
        self.ids.details.add_widget(self.sm2)

        self.ids.artistlist.rows = len(self.artistDetList['artistId'])
        self.ids.artistlist.bind(
            minimum_height=self.ids.artistlist.setter('height'))
        for a in self.artistDetList['artistName']:
            artistLbl = ArtistLabel(text="{}".format(a),
                                    size_hint_y=None,
                                    color=(0, 0, 0, 1),
                                    height=30)
            self.ids.artistlist.add_widget(artistLbl)

        self.create_leave_scr()

    def create_leave_scr(self):
        Det = leaveData.getDetails(
            self.months.index(self.dispMonth) + 1, self.dispYear,
            self.artistDetList['artistId'])
        #print(Det)

        days = DaysScreen()
        days.name = self.ids.monthName.text
        daysNum = DaysGrid(rows=2)
        daysNum.cols = self.numOfDays[1]
        for i in range(1, self.numOfDays[1] + 1):
            dayNumLbl = DaysNumLabel(
                text='{}'.format(i),
                color=(0, 0, 0, 1),
            )
            daysNum.add_widget(dayNumLbl)
        weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
        l = 0
        w = self.numOfDays[0]
        while l < (self.numOfDays[1]):
            wd = weekdays[w]
            weekDaysLbl = DaysLabel(text='{}'.format(wd), color=(0, 0, 0, 1))
            if wd == 'Sun':
                weekDaysLbl.set_bgGray()
            l += 1
            w += 1
            if w == 7:
                w = 0
            if l > (self.numOfDays[1] + 1):
                break
            daysNum.add_widget(weekDaysLbl)
        days.add_widget(daysNum)
        self.sm1.add_widget(days)

        # starting to add chart
        charts = ChartScreen()
        charts.name = self.ids.monthName.text
        self.chartScroll = ChartScroll(size_hint=(1, 1))
        #self.chartScroll.bind(scroll_y=lambda x:self.scroll_sync) #.ids.scroll_a.scroll_y
        self.chartScroll.bind(scroll_y=self.scroll_sync)
        leaveGrid = ChartGrid()
        leaveGrid.bind(minimum_height=leaveGrid.setter('height'))
        leaveGrid.size_hint = (1, None)
        leaveGrid.rows = len(self.artistDetList['artistId'])
        leaveGrid.cols = self.numOfDays[1]
        leaveGrid.padding = (0, 1, 0, 0)

        def callback(wid, touch):
            global detail
            det = wid.text.split(".")
            detail = [det[0], det[1]]

        def opCall(wid, touch):
            global opDetail
            det = wid.text.split(".")
            opDetail = [det[0], det[1]]

        for r in range(leaveGrid.rows):
            #print(Det[r]['leaveDates'][0])
            leaveDates = Det[r]['leaveDates']
            planned = Det[r]['planned']
            requests = Det[r]['leave_requests']
            permissions = Det[r]['permission']
            l = 0
            w = self.numOfDays[0]
            for c in range(leaveGrid.cols):
                curDate = "{}-{}-{}".format(
                    self.dispYear,
                    str(self.months.index(self.dispMonth) + 1).zfill(2),
                    str(c + 1).zfill(2))
                lvBtn = LeaveButton(text='{}.{}'.format(Det[r]['id'], curDate),
                                    size_hint_y=None,
                                    height=30)
                lvBtn.bind(on_touch_down=opCall)
                wd = weekdays[w]
                try:
                    if curDate in leaveDates:
                        lvBtn.setUP()
                except Exception as e:
                    print(e)
                    pass
                if curDate in planned:
                    lvBtn.setP()
                if curDate in permissions:
                    lvBtn.setPE()
                if curDate in requests:
                    lvBtn = PermissionButton(
                        text='{}.{}'.format(Det[r]['id'], curDate))
                    lvBtn.bind(on_touch_down=callback)
                if wd == 'Sun':
                    lvBtn.set_bgGray()
                l += 1
                w += 1
                if w == 7:
                    w = 0
                if l > (self.numOfDays[1] + 1):
                    break
                leaveGrid.add_widget(lvBtn)

        self.chartScroll.add_widget(leaveGrid)
        charts.add_widget(self.chartScroll)
        self.sm2.add_widget(charts)

    def setup(self):
        self.months = calendar_data.get_month_names()
        self.today = datetime.today()
        self.dispMonth = self.months[self.today.month - 1]
        self.dispYear = self.today.year
        self.numOfDays = monthrange(self.dispYear, self.today.month)
        self.ids.monthName.text = "{} - {}".format(self.dispMonth,
                                                   self.dispYear)

    def go_prev(self):
        self.dispMonth = self.months[self.months.index(self.dispMonth) - 1]
        if self.dispMonth == self.months[-1]:
            self.dispYear -= 1
        self.numOfDays = monthrange(self.dispYear,
                                    self.months.index(self.dispMonth) + 1)
        self.ids.monthName.text = "{} - {}".format(self.dispMonth,
                                                   self.dispYear)

        if not self.sm1.has_screen(
                self.ids.monthName.text) and not self.sm2.has_screen(
                    self.ids.monthName.text):
            print("creating screen1")
            self.create_leave_scr()

        self.sm1.current = self.ids.monthName.text
        self.sm2.current = self.ids.monthName.text
        self.sm1.transition.direction = "left"
        self.sm2.transition.direction = "left"

    def go_next(self):
        if self.months.index(self.dispMonth) == 11:
            self.dispMonth = self.months[0]
            self.dispYear += 1
            self.numOfDays = monthrange(self.dispYear,
                                        self.months.index(self.dispMonth) + 1)
            self.ids.monthName.text = "{} - {}".format(self.dispMonth,
                                                       self.dispYear)

            if not self.sm1.has_screen(self.ids.monthName.text):
                print("creating screen1")
                self.create_leave_scr()

            self.sm1.current = self.ids.monthName.text
            self.sm1.transition.direction = "right"

            if not self.sm2.has_screen(self.ids.monthName.text):
                print("creating screen2")
                self.create_leave_scr()

            self.sm2.current = self.ids.monthName.text
            self.sm2.transition.direction = "right"

            return 0

        self.dispMonth = self.months[self.months.index(self.dispMonth) + 1]
        self.numOfDays = monthrange(self.dispYear,
                                    self.months.index(self.dispMonth) + 1)
        self.ids.monthName.text = "{} - {}".format(self.dispMonth,
                                                   self.dispYear)

        if not self.sm1.has_screen(self.ids.monthName.text):
            print("creating screen")
            self.create_leave_scr()
        self.sm1.current = self.ids.monthName.text
        self.sm1.transition.direction = "right"

        if not self.sm2.has_screen(self.ids.monthName.text):
            print("creating screen")
            self.create_leave_scr()

        self.sm2.current = self.ids.monthName.text
        self.sm2.transition.direction = "right"

    def scroll_sync(self, instance, value):
        self.ids.scroll_a.scroll_y = self.chartScroll.scroll_y
Beispiel #10
0
class Logotouch(App):

    connected = BooleanProperty(False)

    def build_config(self, config):
        config.setdefaults('server', {
            'host': 'logotouch.erasme.org',
            'db': '0' })

    def build(self):
        from kivy.core.window import Window
        Window.bind(on_keyboard=self._on_window_keyboard)

        self.user_email = '*****@*****.**'
        self.user_name = 'Mathieu Virbel'

        self.rpc = None
        self.game_screen = None
        self.sm = ScreenManager(transition=SlideTransition())
        self.screen_welcome = WelcomeScreen(name='welcome')
        self.sm.add_widget(self.screen_welcome)
        self.connect()
        #self.create_session_with_corpus(0)
        return self.sm

    def create_session(self):
        if not hasattr(self, 'screen_create_session'):
            self.screen_create_session = CreateSessionScreen(name='create')
            self.sm.add_widget(self.screen_create_session)
        self.sm.current = 'create'

    def join_session(self):
        if not hasattr(self, 'screen_join_session'):
            self.screen_join_session = JoinSessionScreen(name='join')
            self.sm.add_widget(self.screen_join_session)
        self.sm.current = 'join'

    def create_session_with_corpus(self, corpus_id):
        if not hasattr(self, 'screen_download_corpus'):
            self.screen_download_corpus = DownloadScreen(name='download',
                    title=_('Game is starting'),
                    action=_('Creating session'),
                    progression=33)
            self.sm.add_widget(self.screen_download_corpus)
        self.sm.current = 'download'
        self.g_corpus_id = corpus_id
        self.rpc.new_session(self.user_email, corpus_id,
                callback=self._on_create_session)

    def create_session_new_corpus(self):
        if not hasattr(self, 'screen_download_corpus'):
            self.screen_download_corpus = DownloadScreen(name='download',
                    title=_('Game is starting'),
                    action=_('Creating session'),
                    progression=33)
            self.sm.add_widget(self.screen_download_corpus)
        self.sm.current = 'download'
        from time import time
        self.rpc.new_corpus(
            'Corpus {}'.format(time()),
            self.user_name,
            self.user_email,
            callback=self._on_create_corpus)

    def _on_create_corpus(self, result, error=None):
        if error is not None:
            return
        self.create_session_with_corpus(result)

    def join_session_from_enc(self, enc):
        try:
            sessid = basedec(enc)
            if not hasattr(self, 'screen_download_corpus2'):
                self.screen_download_corpus2 = \
                        DownloadScreen(name='download2',
                        title=_('Game is starting'),
                        action=_('Joining session'),
                        progression=33)
                self.sm.add_widget(self.screen_download_corpus2)
            self.sm.current = 'download2'
            self.rpc.join_session(self.user_email, sessid,
                    callback=self._on_join_session)
        except:
            self.screen_join_session.error = _('Invalid session code')
            self.sm.current = 'join'
            self.screen_join_session.disptach('on_enter')

    def add_sentence(self, data):
        self.rpc.add_sentence(self.g_sessid, data)

    def get_sentences(self, callback):
        self.rpc.get_sentences(self.g_sessid, callback=callback)

    def _on_join_session(self, result, error=None):
        if error is not None:
            self.screen_join_session.error = _('Error while joining the session: {}').format(error)
            self.sm.current = 'join'
            return
        if result is None:
            self.screen_join_session.error = _('Unknow session code')
            self.sm.current = 'join'
            return
        self.g_sessid = result['sessid']
        self.g_corpus_id = result['corpusid']
        self.g_sentences_count = result['sentences_count']
        self.rpc.bind_session(self.g_sessid)
        self.sm.current_screen.action = _('Downloading Corpus')
        self.sm.current_screen.progression = 66
        self.rpc.get_corpus(self.g_corpus_id, callback=self._on_corpus)

    def _on_create_session(self, result, error=None):
        if error is not None:
            return
        self.g_sessid = result
        self.g_sentences_count = 0
        self.rpc.bind_session(self.g_sessid)
        self.sm.current_screen.action = _('Downloading Corpus')
        self.sm.current_screen.progression = 66
        self.rpc.get_corpus(self.g_corpus_id, callback=self._on_corpus)

    def _on_corpus(self, result, error=None):
        if error is not None:
            # TODO
            return
        self.g_corpus = result
        self.sm.current_screen.progression = 100
        Clock.schedule_once(self._start_game, 0.1)

    def _start_game(self, *args):
        self.game_screen = GameScreen(name='game',
            sessid=self.g_sessid, corpus=self.g_corpus,
            sentences_count=self.g_sentences_count)
        if self.sm.has_screen('game'):
            self.sm.remove_widget(self.sm.get_screen('game'))
        self.sm.add_widget(self.game_screen)
        self.sm.current = 'game'

    def connect(self):
        self.rpc = ThreadedRpcClient(
                host=self.config.get('server', 'host'),
                on_session_broadcast=self._on_session_broadcast)

    def disconnect(self):
        pass

    def help_gesture(self):
        popup = HelpGesturePopup()
        popup.open()

    def _on_window_keyboard(self, window, *largs):
        key = largs[0]
        if key != 27:
            return
        self.do_back()

    def do_back(self):
        # if there is a modal view in the window, avoid to check it
        from kivy.core.window import Window
        if any([isinstance(x, ModalView) for x in Window.children]):
            return
        if self.sm.current != 'welcome':
            self.sm.current = 'welcome'
            return True

    def _on_session_broadcast(self, sessid, message):
        if str(self.g_sessid) != str(sessid):
            print 'Dropped message, invalid sessid {} (we accept {})'.format(
                    sessid, self.g_sessid)
            return
        if self.game_screen:
            self.game_screen.on_broadcast(message)
Beispiel #11
0
class CalendarWidgetS(RelativeLayout):
    """ Basic calendar widget """

    def __init__(self, as_popup=False, touch_switch=False, *args, **kwargs):
        super(CalendarWidgetS, self).__init__(*args, **kwargs)

        self.as_popup = as_popup
        self.touch_switch = touch_switch
        #self.selectedDates = []
        self.prepare_data()
        self.init_ui()

    def init_ui(self):

        self.left_arrow = Button(text="<", on_press=self.go_prev,
                                      pos_hint={"top": 1, "left": 0}, size_hint=(.1, .1))

        self.right_arrow = Button(text=">", on_press=self.go_next,
                                       pos_hint={"top": 1, "right": 1}, size_hint=(.1, .1))

        self.add_widget(self.left_arrow)
        self.add_widget(self.right_arrow)

        # Title
        self.title_label = Label(text=self.title, pos_hint={"top": 1, "center_x": .5}, size_hint=(None, 0.15), halign=("center"))
        self.add_widget(self.title_label)

        # ScreenManager
        self.sm = ScreenManager(pos_hint={"top": .9}, size_hint=(1, .9))
        self.add_widget(self.sm)

        self.create_month_scr(self.quarter[1], toogle_today=True)

    def create_month_scr(self, month, toogle_today=False):
        """ Screen with calendar for one month """

        scr = Screen()
        m = self.month_names_eng[self.active_date[1] - 1]
        scr.name = "%s-%s" % (m, self.active_date[2])  # like march-2015

        # Grid for days
        grid_layout = GridLayout(cols=7, rows=7, size_hint=(1, 1), pos_hint={"top": 1})
        scr.add_widget(grid_layout)

        # Days abbrs
        for i in range(7):
            if i >= 5:  # weekends
                l = Label(text=self.days_abrs[i], color=(1, 0, 0, 1))
            else:  # work days
                l = Label(text=self.days_abrs[i], text_size=(self.size[0], None), halign="center")

            grid_layout.add_widget(l)

        global holiday, halfday

        # Buttons with days numbers
        for week in month:
            for day in week:
                if day[1] >= 6:  # weekends
                    self.tbtn = ToggleBtn(text=str(day[0]), color=(0, 0, 0, 1))
                else:
                    self.tbtn = ToggleBtn(text=str(day[0]), color=(0, 0, 0, 1))
                    for i in range(len(holiday)):
                        if self.active_date[2] == holiday[i][2]:
                            if self.active_date[1] == holiday[i][1]:
                                if day[0] == holiday[i][0]:
                                    self.tbtn.background_color=(128, 0, 128, 1)
                    for i in range(len(halfday)):
                        if self.active_date[2] == halfday[i][2]:
                            if self.active_date[1] == halfday[i][1]:
                                if day[0] == halfday[i][0]:
                                    self.tbtn.background_color=(0, 255, 255, 0.5)

                self.tbtn.bind(on_press=self.get_btn_value)

                if toogle_today:
                    # Down today button
                    if day[0] == self.active_date[0] and day[2] == 1:
                        self.tbtn.state = "down"
                # Disable buttons with days from other months
                if day[2] == 0:
                    self.tbtn.text = " "
                    self.tbtn.disabled = True
                    self.tbtn.background_color = (0, 0, 0, 0.1)

                grid_layout.add_widget(self.tbtn)

        self.sm.add_widget(scr)

    def prepare_data(self):
        """ Prepare data for showing on widget loading """

        # Get days abbrs and month names lists
        self.month_names = cal_data.get_month_names()
        self.month_names_eng = cal_data.get_month_names_eng()
        self.days_abrs = cal_data.get_days_abbrs()

        # Today date
        self.active_date = cal_data.today_date_list()
        # Set title
        self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1],
                                  self.active_date[2])

        # Quarter where current month in the self.quarter[1]
        self.get_quarter()

    def get_quarter(self):
        """ Get caledar and months/years nums for quarter """

        self.quarter_nums = cal_data.calc_quarter(self.active_date[2],
                                                  self.active_date[1])
        self.quarter = cal_data.get_quarter(self.active_date[2],
                                            self.active_date[1])

    def get_btn_value(self, inst):
        """ Get day value from pressed button """

        self.active_date[0] = int(inst.text)

        selected = [self.active_date[0], self.active_date[1], self.active_date[2]]

        global selectedDates

        if selected in selectedDates:
            selectedDates.remove(selected)
        else:
            selectedDates.append(selected)

        if self.as_popup:
            self.parent_popup.dismiss()

        #getInfo.openPopup()

    def go_prev(self, inst):
        """ Go to screen with previous month """

        # Change active date
        self.active_date = [self.active_date[0], self.quarter_nums[0][1],
                            self.quarter_nums[0][0]]

        # Name of prev screen
        n = self.quarter_nums[0][1] - 1
        prev_scr_name = "%s-%s" % (self.month_names_eng[n],
                                   self.quarter_nums[0][0])

        # If it's doen't exitst, create it
        if not self.sm.has_screen(prev_scr_name):
            self.create_month_scr(self.quarter[0])

        self.sm.current = prev_scr_name
        self.sm.transition.direction = "left"

        self.get_quarter()
        self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1],
                                  self.active_date[2])

        self.title_label.text = self.title

    def go_next(self, inst):
        """ Go to screen with next month """

         # Change active date
        self.active_date = [self.active_date[0], self.quarter_nums[2][1],
                            self.quarter_nums[2][0]]

        # Name of prev screen
        n = self.quarter_nums[2][1] - 1
        next_scr_name = "%s-%s" % (self.month_names_eng[n],
                                   self.quarter_nums[2][0])

        # If it's doen't exitst, create it
        if not self.sm.has_screen(next_scr_name):
            self.create_month_scr(self.quarter[2])

        self.sm.current = next_scr_name
        self.sm.transition.direction = "right"

        self.get_quarter()
        self.title = "%s - %s" % (self.month_names[self.active_date[1] - 1],
                                  self.active_date[2])

        self.title_label.text = self.title

    def on_touch_move(self, touch):
        """ Switch months pages by touch move """

        if self.touch_switch:
            # Left - prev
            if touch.dpos[0] < -30:
                self.go_prev(None)
            # Right - next
            elif touch.dpos[0] > 30:
                self.go_next(None)
Beispiel #12
0
class ChatApp(App):
    """聊天小程序"""
    def build(self):
        self.sm = ScreenManager(transition=SlideTransition())
        self.contact = ChatContact(name='contact')
        self.client = ChatClient(name='client')
        self.server = ChatServer(name='server')
        self.user_setting = UserSetting(name='user')
        self.load_user_setting()
        self.sm.add_widget(self.user_setting)
        # self.sm.add_widget(self.client)
        # self.sm.add_widget(self.server)
        # self.sm.add_widget(self.contact)
        # sm.current = 'client'
        # self.server.start_server()  # 自动打开服务器监听
        return self.sm

    def to_server(self, direction):
        """显示服务端"""
        if not self.sm.has_screen('server'):
            self.sm.add_widget(self.server)
        self.sm.transition.direction = direction
        self.sm.current = 'server'

    def to_client(self, direction):
        """显示客户端"""
        if not self.sm.has_screen('client'):
            self.sm.add_widget(self.client)
        self.sm.transition.direction = direction
        self.sm.current = 'client'

    def to_contact(self, direction):
        """显示客户端"""
        if not self.sm.has_screen('contact'):
            self.sm.add_widget(self.contact)
        self.sm.transition.direction = direction
        self.sm.current = 'contact'

    def load_user_setting(self):
        """加载用户配置"""
        if not exists(self.user_fn):
            self.user_setting.data = []
            self.user_setting.is_new = True
            return
        with open(self.user_fn) as fd:
            data = json.load(fd)
        self.user_setting.data = data
        self.user_setting.is_new = False

    def save_user_setting(self):
        """保存用户配置"""
        is_new = self.user_setting.is_new
        if self.user_setting.is_new:  # 新建用户
            # 获取用户昵称
            if len(self.user_setting.ids.ti_nickname.text) == 0:
                self.user_setting.ids.ti_nickname.focus = True
                return
            else:
                self.user_setting.data[
                    'name'] = self.user_setting.ids.ti_nickname.text
            self.user_setting.ids.ti_nickname.text = ''
            self.user_setting.is_new = False

        # self.to_client('left')
        _thread.start_new_thread(self.thread_open_client, (is_new, ))

    def thread_open_client(self, is_new):
        """打开程序线程"""
        popup = Popup(title='Create Keys ...',
                      content=ProgressBar(max=100),
                      size_hint=(.8, .2))
        popup.open()
        if is_new:
            # 生成密钥
            key = RSA.generate(1024)
            rsa_prikey = key.exportKey('PEM').decode('utf-8')
            rsa_pubkey = key.publickey().exportKey('PEM').decode('utf-8')
            self.user_setting.data['prikey'] = rsa_prikey
            self.user_setting.data['pubkey'] = rsa_pubkey
            time.sleep(.1)
            popup.title = 'Save setting ...'
            popup.content.value = 20
            with open(self.user_fn, 'w') as fd:
                json.dump(self.user_setting.data, fd)
            time.sleep(.1)
        popup.title = 'Using setting ...'
        popup.content.value = 40
        user_info['name'] = self.user_setting.data['name']
        user_info['pubkey'] = self.user_setting.data['pubkey']
        time.sleep(.1)
        popup.title = 'Start server ...'
        popup.content.value = 60
        if self.server.start_server():
            time.sleep(.1)
            popup.title = 'Start succeed ...'
            popup.content.value = 80
            time.sleep(.1)
            popup.title = 'Open client ...'
            popup.content.value = 100
            self.to_client('left')
            popup.dismiss()
        else:
            time.sleep(.1)
            popup.title = 'Start failed ...'
            popup.content.value = 80
            time.sleep(.1)
            popup.title = 'Open server ...'
            popup.content.value = 100
            self.to_server('left')
            popup.dismiss()

    def send_message(self):
        """发送信息"""
        message = self.client.ids.ti_message.text
        if len(message) == 0:  # 输入为空 返回
            return
        if self.client.ids.t_address.text != 'All Nodes':
            t_name, url = self.client.ids.t_address.text.split(
                ' @ ')  # 获取用户名和链接
            if self.post_request(url, message):
                messages.append(
                    'To [%s] \n ' % t_name + '[ %s ]\n ' % message +
                    time.strftime("%H:%M:%S %Y-%m-%d", time.localtime()))
                self.client.ids.ti_message.text = ''
            else:
                messages.append('To [%s] \n ' % t_name + 'Failed!!! ')
        else:  # 发送给所有节点
            for node in nodes:
                t_name = node['name']
                url = node['address']
                if self.post_request(url, message):
                    messages.append(
                        'To [%s] \n ' % t_name + '[ %s ]\n ' % message +
                        time.strftime("%H:%M:%S %Y-%m-%d", time.localtime()))
                    self.client.ids.ti_message.text = ''
                else:
                    messages.append('To [%s] \n ' % t_name + 'Failed!!! ')

    def post_request(self, url, data):
        """发送POST请求"""
        try:
            conn = HTTPConnection(url)
            params = urllib.parse.urlencode({'data': data})
            headers = {
                'Content-type': 'application/x-www-form-urlencoded',
                'Accept': 'text/plain'
            }
            conn.request('POST', "/", params, headers)
            r1 = conn.getresponse()
            data = json.loads(r1.read())
            # print(data)
            if data['result'] == 'OK':
                return True
        except Exception as e:
            logs.append("Error: %s\n" % str(e) +
                        time.strftime("%H:%M:%S %Y-%m-%d", time.localtime()))
            return False

    def open_help(self):
        """打开帮助弹窗"""
        pass

    def encrypt_message(self, message):
        """加密信息"""
        pass

    @property
    def user_fn(self):
        return join('./', 'user.json')
Beispiel #13
0
class SwitchContainer(MDBoxLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        #管理器
        self.screen_manager = ScreenManager()
        self.add_widget(self.screen_manager)
        self.page_list = []

        #事件循环
        self.event = Clock.schedule_interval(self.Start, 5)

    def AddPage(self, page_name, page):
        '''
        说明: 添加一个页面来显示
        args{
            page_name: 屏幕的名字
            page:要显示的内容(控件,非Screen)
        }
        return: 
        '''

        screen = Screen(name=page_name)
        screen.add_widget(page)
        self.page_list.append(page_name)
        self.screen_manager.add_widget(screen)
        self.screen_manager.current = page_name

    def DeletePage(self, page_name):
        '''
        说明: 
        args{
            page_name: 要移除的屏幕的名字
        }
        return: 
        '''

        if self.screen_manager.has_screen(page_name):
            page = self.screen_manager.get_screen(page_name)
            self.screen_manager.remove_widget(page)
            self.page_list.remove(page_name)

    def DeleteAll(self):
        '''
        说明: 移除全部屏幕
        args{
            
        }
        return: 
        '''

        while len(self.page_list):
            self.DeletePage(self.page_list[0])

    def Start(self, *args):
        '''
        说明: 循环事件
        args{
            
        }
        return: 
        '''

        if len(self.page_list) > 1:
            index = (self.page_list.index(self.screen_manager.current) +
                     1) % len(self.page_list)
            self.screen_manager.current = self.page_list[index]
Beispiel #14
0
class DWMBarberShop(App):
    selected_attrs = []

    def viewing(self, bx):
        count = 0
        for entry in data:
            if count > 10:
                return
            s = ", ".join(entry)
            s = s + "\n"
            bx.add_widget(Label(text=s))
            count += 1

    def them_buttons(self, ref, ref2):
        self.ref2 = ref2
        a = [
            "Hair Style Name",
            "Normal Price (N$)",
            "Barber",
            "Weather",
            "Environment Noise Level",
            "Head Shape",
            "Customer Reaction",
            "Discount Percent",
            "Age Group",
            "Pre Hair Length",
            "Physical Height (m)",
            "Body Mass (kg)",  # in age group +/- 5
            "Date (DDMMYYYY)",
            "Client Skin Tone",
            "Styling Time (minutes)",  # in style +/- 10
        ]
        for n in a:
            ref.add_widget(Button(text=n, on_release=self.btn_action))

    def btn_action(self, bt):
        self.selected_attrs.append(bt.text)
        self.ref2.add_widget(Label(text=bt.text))

    def show_patterns(self):
        s = ""
        for n in self.selected_attrs:
            s += f'"{n}" '
        import os

        a = os.path.join(os.getcwd(), "correlation_.py")
        f = a + " " + s
        print(f)
        subprocess.Popen(f, close_fds=True, shell=True)

    def open_visualisation(self, p):
        subprocess.Popen("python " + p, close_fds=True)

    def build(self):
        self.sm = ScreenManager()
        self.sm.add_widget(MainScreen(name="main"))
        return self.sm

    def manage_screens(self, screen_name, action):
        scns = {
            "main": MainScreen,
            "correlation_attributes": Factory.CorrelationAttributes,
            "view_data": Factory.ViewData,
        }

        if action == "remove":
            if self.sm.has_screen(screen_name):
                self.sm.remove_widget(self.sm.get_screen(screen_name))
            # print("Screen ["+screen_name+"] removed")
        elif action == "add":
            if self.sm.has_screen(screen_name):
                print("Screen [" + screen_name + "] already exists")
            else:
                self.sm.add_widget(scns[screen_name](name=screen_name))
                print(screen_name + " added")
                # print("Screen ["+screen_name+"] added")

    def change_screen(self, screen_name):
        if self.sm.has_screen(screen_name):
            self.sm.current = screen_name
        else:
            print("Screen [" + screen_name + "] does not exist.")
Beispiel #15
0
class Emp(MDApp):
    job_list = ListProperty()  # contains data needed to display job list cards
    category_list = ListProperty(
    )  # contains data needed to display job list cards

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.title = "Namibia Job Hunt"
        self.theme_cls.primary_palette = "DeepPurple"
        self.theme_cls.theme_style = "Light"
        self.sm = ScreenManager()
        self.has_animated_card = False
        self.has_animated_background = False

    def account_action(self, email, passwd, username=None, action=None):
        print(email, passwd, username, action)
        if action == "register":
            pass
            # register the user
        elif action == "login":
            # login the user
            pass
        self.manage_screens("home_screen", "add")
        self.change_screen("home_screen")

    def animate_background(self, widget):
        if self.has_animated_background == False:
            anim = Animation(size_hint_y=1) + Animation(size_hint_y=0.5)
            anim.start(widget.ids.bx)
            print("background animated")
        else:
            print("background already animated")

    def animate_card(self, widget):
        # {"center_x": 0.5, "center_y": 0.6}
        if self.has_animated_card == False:
            anim = Animation(pos_hint={
                "center_x": 0.5,
                "center_y": 0.6
            },
                             duration=2)
            anim.start(widget)
            self.has_animated_card = True
            print("card animated")
        else:
            print("card already animated")

    def change_screen(self, screen_name):
        if self.sm.has_screen(screen_name):
            self.sm.current = screen_name
        else:
            print("Screen [" + screen_name + "] does not exist.")

    def manage_screens(self, screen_name, action):
        scns = {
            "login_screen": Factory.LoginScreen,
            "registration_screen": Factory.RegistrationScreen,
            "home_screen": Factory.HomeScreen,
            "job_list_screen": Factory.JobListScreen
        }
        try:

            if action == "remove":
                if self.sm.has_screen(screen_name):
                    self.sm.remove_widget(self.sm.get_screen(screen_name))
                print("Screen [" + screen_name + "] removed")
            elif action == "add":
                if self.sm.has_screen(screen_name):
                    print("Screen [" + screen_name + "] already exists")
                else:
                    self.sm.add_widget(scns[screen_name](name=screen_name))
                    print(screen_name + " added")
                    print("Screen [" + screen_name + "] added")
        except:
            print(traceback.format_exc())
            print("Traceback ^.^")

    def on_pause(self):
        return True

    def on_resume(self):
        pass

    def build(self):
        self.bind(on_start=self.post_build_init)
        self.sm.add_widget(Factory.LoginScreen())
        # self.sm.add_widget(HomeScreen(name="home_screen"))
        # self.sm.current = "login_screen"
        return self.sm

    def post_build_init(self, ev):
        win = self._app_window
        win.bind(on_keyboard=self._key_handler)

    def _key_handler(self, *args):
        key = args[1]
        # 1000 is "back" on Android
        # 27 is "escape" on computers
        if key in (1000, 27):
            try:
                self.sm.current_screen.dispatch("on_back_pressed")
            except Exception as e:
                print(e)
            return True
        elif key == 1001:
            try:
                self.sm.current_screen.dispatch("on_menu_pressed")
            except Exception as e:
                print(e)
            return True
class Main(MDApp):

    def build(self):
        global screens
        Builder.load_file("tmlayout.kv")
        self.sm = ScreenManager(transition=NoTransition())
        screens = list()
        screens.append(Main_info(name="MainInfo"))
        screens.append(sub_new_activity(name="subNewActivity"))
        screens.append(activity_timer(name="activitytimer"))
        for i in range(len(screens)):
            self.sm.add_widget(screens[i])
            screens[i].uxids_dict_add(screens)
        print("potato" + str(screens))
        self.theme_cls.primary_palette = "Blue"

        print("0current Screen: " + str(self.sm.current_screen) + " | has the next screen? " +str(self.sm.has_screen("MainInfo")))
        self.sm.switch_to(screens[0])

        
        return self.sm
Beispiel #17
0
class ProjetoApp(App):
    construir_medidas_com_historico = False
    dados = Dados()

    # dados.gera_data_bases()
    icon = "imagens/icone.png"
    kv_file = "projeto.kv"

    def on_start(self):
        pass

    def build(self):
        self.manager = ScreenManager()
        self.constroi_tela_home()

        self.constroi_tela_inserir_constantes("simples")
        self.constroi_tela_inserir_constantes("duplo")
        self.constroi_tela_sobre()

        # self.constroi_tela_historico()

        self.manager.ids["circuito_simples_botao_ok"].bind(
            on_release=self.button_circuito_botao_ok("simples"))
        self.manager.ids["circuito_duplo_botao_ok"].bind(
            on_release=self.button_circuito_botao_ok("duplo"))
        # self.manager.current = "circuito_simples"

        return self.manager

    def vai_para_tela(self, nome: str):
        def dentro(*args):
            self.manager.current = nome

        return dentro

    def button_circuito_botao_ok(self, tipo: str):
        def funcao_dentro(*args):
            self.ler_entrada_dados(tipo)
            self.tela_anterior = f"circuito_{tipo}"

        return funcao_dentro

    def button_circuito_duplo_botao_ok(self, button):
        self.ler_entrada_dados("duplo")
        self.tela_anterior = "circuito_duplo"

    def button_circuito_simples_botao_ok(self, button):
        self.ler_entrada_dados("simples")
        self.tela_anterior = "circuito_simples"

    def button_voltar_home(self, button):
        self.manager.current = "home"

    def button_voltar_home_e_apaga_insercoes(self, tipo):
        distancias = [""] * 3
        constantes = [tipo] + [""] * len(NOMES_CONSTANTES[tipo][:-2]) + ["0"]

        def funcao_interna(*argsv):
            self.constroi_telas_a_partir_do_historico(constantes, distancias)
            self.manager.current = "home"

        return funcao_interna

    def button_home_circuito_duplo(self, button):
        self.construir_medidas_com_historico = False
        self.constroi_tela_inserir_constantes("duplo")

    def button_home_circuito_simples(self, button):
        self.construir_medidas_com_historico = False
        self.constroi_tela_inserir_constantes("simples")

    def button_home_historico(self, button):
        self.constroi_tela_historico()

    def button_botoes_historico(self, button):
        key = button.key
        dados = self.dados.ler_do_banco_dados()[key]
        # print(f"Botao {key}, Valor: {dados}")
        constantes, distancias = dados
        self.constroi_telas_a_partir_do_historico(constantes[2:],
                                                  distancias[1:])

    def button_inserir_distancias_botao_voltar(self, button):
        self.manager.current = self.tela_anterior

    def button_inserir_distancias_botao_ok(self, button):
        self.ler_entrada_distancias()

    def button_home_sair(self, *args, **kwargs):
        # print("chamou")
        tela: TelaHome = self.manager.get_screen("home")

        tela.confirmacao_saida()
        return True

    def button_historico_botao_limpar(self, button):

        # print("limpando banco de dados")
        box = BoxLayout(orientation="vertical", padding="10sp", spacing="10sp")
        botoes = BoxLayout(padding="10sp", spacing="10sp")

        pop = Popup(title="Deseja Limpar o Histórico?",
                    content=box,
                    title_size="25sp",
                    size_hint=(.5, .35))
        pop.opacity = .85
        imagem = Image(source="./imagens/atencao.png")

        def limpa_e_recarrega_hitorico(*args):
            self.dados.gera_data_bases()
            self.constroi_tela_historico()
            pop.dismiss()

        sim = PopButton(text="sim",
                        font_size="20sp",
                        on_release=limpa_e_recarrega_hitorico)
        nao = PopButton(text="nao", font_size="20sp", on_release=pop.dismiss)
        botoes.add_widget(sim)
        botoes.add_widget(nao)

        box.add_widget(imagem)
        box.add_widget(botoes)
        pop.open()

        # self.dados.gera_data_bases()
        # self.constroi_tela_historico()

    def button_relatorio_voltar(self, button):
        self.manager.current = self.tela_anterior

    def constroi_telas_a_partir_do_historico(self, constantes, distancias):
        tipo = constantes[0]
        nome = f"circuito_{tipo}" + "_{}"
        nomes_constantes = NOMES_CONSTANTES[tipo]
        for txt, cons in zip(constantes[1:], nomes_constantes[1:]):
            if cons == "CONDUTORES_SIMETRICOS":
                self.manager.ids[nome.format(cons)].active = int(txt)
                continue
            self.manager.ids[nome.format(cons)].text = str(txt)

        self.manager.current = f"circuito_{tipo}"
        self.construir_medidas_com_historico = True
        self._distancias = distancias

    def constroi_tela_home(self):
        screen = TelaHome(name="home")
        home = TelaHomeWidget(Window.size)
        for chave, valor in home.ids.items():
            self.manager.ids[chave] = valor
        screen.add_widget(home)
        self.manager.add_widget(screen)

        self.manager.ids["home_circuito_simples"].bind(
            on_release=self.button_home_circuito_simples)
        self.manager.ids["home_circuito_duplo"].bind(
            on_release=self.button_home_circuito_duplo)
        self.manager.ids["home_historico"].bind(
            on_release=self.button_home_historico)
        self.manager.ids["home_sobre"].bind(
            on_release=self.vai_para_tela("sobre"))
        self.manager.ids["home_sair"].bind(on_release=self.button_home_sair)

    def constroi_tela_historico(self):
        nome_tela = "historico"
        if self.manager.has_screen(nome_tela):
            screen = self.manager.get_screen(nome_tela)
            screen.canvas.clear()
        else:
            screen = Screen(name=nome_tela)
            self.manager.add_widget(screen)

        historico = HistoricoWidget(Window.size, self.dados)
        try:
            historico.ids['historico_botao_voltar'].bind(
                on_release=self.button_voltar_home)
            historico.ids['historico_botao_limpar'].bind(
                on_release=self.button_historico_botao_limpar)
        except:
            pass
        for chave, valor in historico.ids.items():
            if valor.__class__.__name__.endswith("HistoricoButton"):
                valor.bind(on_press=self.button_botoes_historico)

        screen.add_widget(historico)
        self.manager.current = nome_tela

    def constroi_tela_inserir_constantes(self, tipo):
        assert isinstance(tipo, str)
        nome_tela = f"circuito_{tipo}"
        if self.manager.has_screen(nome_tela):
            self.manager.current = nome_tela
            return

        screen = Screen(name=nome_tela)
        nomes = NOMES_CONSTANTES[tipo]
        tela_inserir = TelaInserirWidget(
            Window.size,
            nome_tela,
            nomes[1:],
            titulo=f"Dados para Circuito {tipo}".title())

        screen.add_widget(tela_inserir)
        self.manager.add_widget(screen)

        for chave, valor in tela_inserir.ids.items():
            self.manager.ids[chave] = valor

        self.manager.ids[f"{nome_tela}_botao_voltar"].bind(
            on_release=self.button_voltar_home)

    def constroi_tela_inserir_medidas(self, numero_condutores):
        nome_tela = "inserir_distancias"

        if self.manager.has_screen(nome_tela):
            screen = self.manager.get_screen(nome_tela)
            screen.canvas.clear()
        else:
            screen = Screen(name=nome_tela)
            self.manager.add_widget(screen)

        simetria = int(self.constantes_lidas[-1])

        if simetria:
            if numero_condutores > 4:
                raise NotImplementedError(
                    "Codigo no modulo Calculos nao implementado ... Parando ainda no modulo main"
                )
            nomes_campos = ["Distancia entre os contutores"]
            keys = ["TEXT_INPUT"]
        else:
            nomes_campos = [
                f"Distancia entre os cabos {i+1} e {j+1}"
                for i in range(numero_condutores)
                for j in range(i + 1, numero_condutores)
            ]
            keys = [f"TEXT_INPUT{i}" for i, j in enumerate(nomes_campos)]

        inserir = TelaInserirWidget(Window.size,
                                    nome_tela,
                                    nomes_campos,
                                    "Entre com as distancias".title(),
                                    keys=keys)
        screen.add_widget(inserir)

        n = 0
        for chave, valor in inserir.ids.items():
            if self.construir_medidas_com_historico and "TEXT_INPUT" in chave:
                try:
                    valor.text = str(self._distancias[n])
                except:
                    valor.text = ""
                n += 1

            self.manager.ids[chave] = valor

        self.manager.ids[f"{nome_tela}_botao_voltar"].bind(
            on_release=self.button_inserir_distancias_botao_voltar)
        self.manager.ids[f"{nome_tela}_botao_ok"].bind(
            on_release=self.button_inserir_distancias_botao_ok)

        # self.manager.current = nome_tela

    def constroi_tela_sobre(self):
        nome_tela = "sobre"
        screen = Screen(name=nome_tela)
        dados = [[
            "Programa desenvolvido pelos estudantes",
        ], ["Danilo C Nascimento", "*****@*****.**"],
                 ["Kaio Nascimento", "*****@*****.**"],
                 ["Shamella Castro", "*****@*****.**"]]
        tela = TelaSobreWidget(titulo="Sobre os Desenvolvedores", dados=dados)
        tela.ids["sobre_botao_voltar"].bind(
            on_release=self.vai_para_tela("home"))
        screen.add_widget(tela)
        self.manager.add_widget(screen)

    def constroi_tela_gera_relatorio(self):
        # print("Aqui serão gerados os relatórios")

        nomes = self.dados.get_valores_de_um_campo("NOME")

        if self.NOME not in nomes:
            self.dados.salva_no_banco_dados([
                self.constantes_lidas_para_salvar,
                self.distancias_lidas_para_salvar
            ])

        nome_tela = "gera_relatorio"
        if self.manager.has_screen(nome_tela):
            screen = self.manager.get_screen(nome_tela)
            screen.canvas.clear()
        else:
            screen = Screen(name=nome_tela)
            self.manager.add_widget(screen)

        #Execura os calculos
        calculos = Calculos(self.constantes_lidas, self.distancias_lidas)
        indutancia = calculos.calculo_indutancia()
        capacitancia = calculos.calculo_capacitancia(True)

        lista_tratada = []
        unidade = "H/m H Ω/m Ω F/m F Ω/m Ω S".split()
        num = unidades.para_notacao_cientifica(indutancia[1], unidade[1], 4)
        for i, numero in enumerate(list(indutancia) + list(capacitancia)):
            try:
                num = unidades.para_notacao_cientifica(numero, unidade[i], 4)
                num = str(num).replace(".", ",")
                lista_tratada.append(num)
            except Exception as e:
                lista_tratada.append(numero)
                print("Erro", e)

        descricao = "Indutancia,Indutancia_Total,Reatancia_Indutiva,Reatancia Indutiva Total".split(
            ",")
        descricao += "Capacitancia,Capacitancia Total,Reatancia Capacitiva,Reatancia Capacitiva Total, Susceptancia Capacitiva".split(
            ",")
        dic = [(f"Descrição {i}", f"Valor {i}") for i in range(1, 20)]

        valores = list(zip(descricao, lista_tratada))

        #print(valores)
        dic = dict(valores)
        for i in range(1, 4):
            txt = " " * i
            dic[txt] = ""

        relatorio = GeraRelatorioWidget(Window.size, nome_tela, "Relatórios",
                                        dic)
        relatorio.ids[f"{nome_tela}_botao_voltar"].bind(
            on_release=self.button_relatorio_voltar)

        tipo = self.constantes_lidas[0]

        relatorio.ids[f"{nome_tela}_botao_home"].bind(
            on_release=self.button_voltar_home_e_apaga_insercoes(tipo))

        screen.add_widget(relatorio)
        self.manager.current = nome_tela

    def ler_entrada_dados(self, tipo: str):
        """
        :param tipo: str ["simples", "duplo", "medidas"]
        :param constantes: list
        :return: list
        """
        numero_condutores = 0

        if tipo == "simples":
            constantes = NOMES_CONSTANTES["simples"]
        elif tipo == "duplo":
            constantes = NOMES_CONSTANTES["duplo"]
        else:
            texto = f"tipo nao percence a " + ", \"{}\"" * 3
            raise ValueError(texto.format("simples", "duplo"))

        constantes_lidas = []
        self.constantes_lidas_para_salvar = [tipo]

        logs = []
        texto_log = "O campo [b]{}[/b] {}"

        simetria = False

        nome_tela = "obtem_medidas"
        if tipo != "medidas":
            constantes_lidas = [tipo]  # [f"\"{tipo}\""]
            nome_tela = f"circuito_{tipo}"

        for nome in constantes[1:]:
            id = f"{nome_tela}_{nome}"
            texto_label = " ".join(nome.split("_"))

            if nome == "CONDUTORES_SIMETRICOS":
                if self.manager.ids[id].active:
                    lido = "1"
                    simetria = True
                else:
                    lido = "0"
                    simetria = False
                constantes_lidas.append(lido)
                self.constantes_lidas_para_salvar.append(lido)
                continue
            lido = str(self.manager.ids[id].text)
            self.constantes_lidas_para_salvar.append(lido)
            lido = lido.replace(",", ".")

            try:
                lido = unidades.de_notacao_cientifica(lido)
                lido = str(lido)
            except:
                pass

            if lido == "":
                logs.append(texto_log.format(texto_label, "está vazio"))
            elif nome == "NUMERO_CONDUTORES":
                try:
                    lido = int(lido)
                    numero_condutores = lido
                    if lido <= 0:
                        logs.append(
                            texto_log.format(texto_label,
                                             "deve ser maior que 0"))
                    if lido > 15:
                        logs.append(
                            texto_log.format(texto_label,
                                             "deve ser menor ou igual a 15"))
                except:
                    logs.append(texto_log.format(texto_label, "não é inteiro"))

            elif nome != "NOME":

                try:
                    lido = float(lido)
                except:
                    logs.append(texto_log.format(texto_label, "não é real"))

            constantes_lidas.append(lido)

        self.NOME = constantes_lidas[1]

        if simetria and numero_condutores > 4:
            logs.append(
                "Ainda não há implementação para calculos com mais de 4 consdutores simétricos"
            )

        if logs:
            popup = LogPopup(Window.size, logs, opacity=.75)
            popup.open()
        elif numero_condutores > 1:
            self.constantes_lidas = constantes_lidas
            self.constroi_tela_inserir_medidas(numero_condutores)
            self.numero_condutores = numero_condutores
            self.manager.current = "inserir_distancias"

        elif numero_condutores == 1:
            self.distancias_lidas = []
            self.constantes_lidas = constantes_lidas
            self.constroi_tela_gera_relatorio()

    def ler_entrada_distancias(self):
        nome_tela = "inserir_distancias"

        simetria = int(self.constantes_lidas[-1])

        if simetria:
            if self.numero_condutores > 4:
                raise NotImplementedError(
                    "Codigo no modulo Calculos nao implementado ... Parando ainda no modulo main"
                )
            nomes_campos = ["Distancia entre os contutores"]
            keys = ["TEXT_INPUT"]

        else:
            nomes_campos = [
                f"Distancia entre os cabos {i + 1} e {j + 1}"
                for i in range(self.numero_condutores)
                for j in range(i + 1, self.numero_condutores)
            ]
            keys = [f"TEXT_INPUT{i}" for i, j in enumerate(nomes_campos)]

        distancias_lidas = []
        self.distancias_lidas_para_salvar = []

        logs = []
        texto_log = "O campo [b]{}[/b] {}"
        for nome, campo in zip(keys, nomes_campos):
            lido = str(self.manager.ids[f"{nome_tela}_{nome}"].text)
            self.distancias_lidas_para_salvar.append(lido)
            lido = lido.replace(",", ".")

            try:
                lido = unidades.de_notacao_cientifica(lido)
                lido = str(lido)
            except:
                ...

            if lido == "":
                logs.append(texto_log.format(campo, "está vazio"))
            else:
                try:
                    lido = float(lido)
                except:
                    logs.append(texto_log.format(campo, "nao é real"))

            distancias_lidas.append(lido)
        # print(distancias_lidas)
        self.distancias_lidas = distancias_lidas

        if logs:
            popup = LogPopup(Window.size, logs, opacity=.75)
            popup.open()
        else:
            self.distancias_lidas = distancias_lidas
            self.constroi_tela_gera_relatorio()