Esempio n. 1
0
class MainWindow(tk.Frame):
    def __init__(self, master, *args, **kwargs):
        super().__init__(master, *args, **kwargs)
        self.master = master

        settings = self.master.settings
        font = settings['font']

        text = settings['colors']['text']
        light = settings['colors']['light']
        dark = settings['colors']['dark']
        power = settings['colors']['power']
        app = settings['colors']['app']

        size = 20

        flat = {
            'relief': 'solid',
            'bd': 1,
            'activebackground': '#ffffff',
            'activeforeground': '#ffffff'
        }
        font = {**flat, 'font': [font, size], 'fg': text, 'bg': dark}
        arrow = {**flat, 'font': [font, size], 'fg': text, 'bg': light}
        app = {**flat, 'font': [font, size], 'fg': text, 'bg': app}
        power = {**flat, 'font': [font, 30], 'fg': text, 'bg': power}

        def set_active_bg(f):
            f['activebackground'] = f['bg']

        [set_active_bg(f) for f in [font, arrow, app, power]]

        self.roku = Roku('192.168.1.144')

        self.master.title('Roku Remote')

        self.pack(fill=tk.BOTH, expand=True)

        config_grids(self, rows=[1, 1, 1, 1, 1, 1], columns=[1, 1, 1, 1])

        self.restart_flag = False

        self.back_button = tk.Button(self,
                                     **font,
                                     text=u'\u2B60',
                                     command=self.roku.back)
        self.back_button.grid(row=0, column=1, sticky='nsew')

        self.up_button = tk.Button(self,
                                   **arrow,
                                   text=u'\u2B9D',
                                   command=self.roku.up)
        self.up_button.grid(row=0, column=2, sticky='nsew')

        self.home_button = tk.Button(self,
                                     **font,
                                     text=u'\u2302',
                                     command=self.roku.home)
        self.home_button.grid(row=0, column=3, sticky='nsew')

        self.left_button = tk.Button(self,
                                     **arrow,
                                     text=u'\u2B9C',
                                     command=self.roku.left)
        self.left_button.grid(row=1, column=1, sticky='nsew')

        self.select_button = tk.Button(self,
                                       **arrow,
                                       text='OK',
                                       command=self.roku.select)
        self.select_button.grid(row=1, column=2, sticky='nsew')

        self.right_button = tk.Button(self,
                                      **arrow,
                                      text=u'\u2B9E',
                                      command=self.roku.right)
        self.right_button.grid(row=1, column=3, sticky='nsew')

        self.replay_button = tk.Button(self,
                                       **font,
                                       text=u'\u27F2',
                                       command=self.roku.replay)
        self.replay_button.grid(row=2, column=1, sticky='nsew')

        self.down_button = tk.Button(self,
                                     **arrow,
                                     text=u'\u2B9F',
                                     command=self.roku.down)
        self.down_button.grid(row=2, column=2, sticky='nsew')

        self.options_button = tk.Button(self,
                                        **font,
                                        text=u'\u273C',
                                        command=self.roku.info)
        self.options_button.grid(row=2, column=3, sticky='nsew')

        self.rewind_button = tk.Button(self,
                                       **font,
                                       text=u'\u23EA',
                                       command=self.roku.reverse)
        self.rewind_button.grid(row=3, column=1, sticky='nsew')

        self.pause_play_button = tk.Button(self,
                                           **font,
                                           text=u'\u25B6\u2758\u2758',
                                           command=self.roku.play)
        self.pause_play_button.grid(row=3, column=2, sticky='nsew')

        self.fast_forward_button = tk.Button(self,
                                             **font,
                                             text=u'\u23E9',
                                             command=self.roku.forward)
        self.fast_forward_button.grid(row=3, column=3, sticky='nsew')

        self.volume_mute_button = tk.Button(self,
                                            **font,
                                            text='MUTE',
                                            command=self.roku.volume_mute,
                                            width=20)
        self.volume_mute_button.grid(row=4, column=1, sticky='nsew')

        self.volume_down_button = tk.Button(self,
                                            **font,
                                            text='VOL-',
                                            command=self.roku.volume_down,
                                            width=20)
        self.volume_down_button.grid(row=4, column=2, sticky='nsew')

        self.volume_up_button = tk.Button(self,
                                          **font,
                                          text='VOL+',
                                          command=self.roku.volume_up,
                                          width=20)
        self.volume_up_button.grid(row=4, column=3, sticky='nsew')

        self.search_button = tk.Button(self,
                                       **font,
                                       text=u'\u2315',
                                       command=self.roku.search,
                                       width=20)
        self.search_button.grid(row=5, column=0, sticky='nsew')

        self.search_var = tk.StringVar()
        self.previous_text = ''
        self.search_var.trace('w', self.send_text)

        self.search_frame = tk.Frame(self, bg='#000000', bd=1)
        #self.search_frame.grid(row=5, column=1, columnspan=2, sticky='nsew')
        config_grids(self.search_frame)

        self.build_search_input()

        self.backspace_button = tk.Button(self,
                                          **font,
                                          text='DEL',
                                          command=self.roku.backspace)
        self.backspace_button.grid(row=5, column=3, sticky='nsew')

        self.power_button = tk.Button(self,
                                      **power,
                                      text=u'\u23FB',
                                      command=self.roku.power)
        self.power_button.grid(row=0, column=0, rowspan=2, sticky='nsew')

        self.computer_button = tk.Button(
            self,
            **app,
            text='PC',
            command=lambda: self.launch_app('computer'))
        self.computer_button.grid(row=2, column=0, sticky='nsew')

        self.plex_button = tk.Button(self,
                                     **app,
                                     text='PLEX',
                                     command=lambda: self.launch_app('plex'))
        self.plex_button.grid(row=3, column=0, sticky='nsew')

        self.ps4_button = tk.Button(
            self,
            **app,
            text='PS4',
            command=lambda: self.launch_app('playstation'))
        self.ps4_button.grid(row=4, column=0, sticky='nsew')

        self.menu_bar = Menubar(self)
        self.master.config(menu=self.menu_bar)

        self.bindings = [
            ('<KeyPress>', self.key_press),
            ('<Left>', self.roku.left),
            ('<Right>', self.roku.right),
            ('<Up>', self.roku.up),
            ('<Down>', lambda *args: click_button(self.down_button)),
            ('<Return>', self.roku.select),
            ('-', self.roku.volume_down),
            ('+', self.roku.volume_up),
            ('=', self.roku.volume_up),
            ('<space>', self.roku.play),
            ('<BackSpace>', self.roku.back),
        ]

        self.bound = False

        self.master.bind('<FocusIn>', self.set_bindings)
        self.master.bind('<FocusOut>', self.set_bindings)

        self.master.geometry(get_geometry(settings))

    def get_geometry(self):
        if all([(key in self.master.settings) for key in ['win_x', 'win_y']]):
            self.master.geometry('{}x{}+{}+{}'.format(
                self.master.settings['win_w'], self.master.settings['win_h'],
                self.master.settings['win_x'], self.master.settings['win_y']))
        else:
            self.master.geometry('{}x{}'.format(settings['win_w'],
                                                settings['win_h']))

    def send_text(self, *args):
        text = self.search_var.get()
        diff = len(self.previous_text) - len(text)
        if diff < 0:
            new_text = text[diff]
            self.roku.literal(new_text)
        if diff > 0:
            for i in range(diff):
                self.roku.backspace()
        self.previous_text = text

    def build_search_input(self, *args):
        font = self.master.settings['font']
        ENTRY = {'font': [font, 14], 'fg': '#201d3d', 'bg': '#fcfbfd'}
        if hasattr(self, 'search_input'):
            self.search_input.destroy()

        self.search_input = tk.Entry(self,
                                     **ENTRY,
                                     bd=10,
                                     relief='flat',
                                     textvariable=self.search_var)
        self.search_input.grid(row=5,
                               column=1,
                               columnspan=2,
                               padx=1,
                               pady=1,
                               sticky='nsew')

        self.search_input.bind('<Escape>', self.build_search_input)

    def launch_app(self, ident):
        app = next((a for a in self.roku.apps if ident in a.name.lower()),
                   None)
        if app:
            app.launch()

    def key_press(self, *args):
        print(args)

    def set_bindings(self, event):
        if not self.bound:
            self.bind_keys(event)
        else:
            self.unbind_keys(event)

    def bind_keys(self, event):
        for key, func in self.bindings:
            self.master.bind(key, func)
        self.bound = True

    def unbind_keys(self, event):
        if str(event.widget) == '.!mainwindow.!entry' and self.bound:
            for key, func in self.bindings:
                self.master.unbind(key)
            self.bound = False
Esempio n. 2
0
roku = Roku(ip)

while True:
    remoteinput = input(
        'Remote Input (i.e. down, up, left, right, back, home, ok, open, text): '
    )

    if remoteinput == 'down':
        roku.down()
    elif remoteinput == 'up':
        roku.up()
    elif remoteinput == 'left':
        roku.left()
    elif remoteinput == 'right':
        roku.right()
    elif remoteinput == 'back':
        roku.back()
    elif remoteinput == 'home':
        roku.home()
    elif remoteinput == 'ok':
        roku.select()
    elif remoteinput == 'open':
        appinput = input('APP (i.e. YouTube): ')
        apptolaunch = roku[appinput]
        apptolaunch.launch()
    elif remoteinput == 'text':
        text = input('TEXT: ')
        roku.literal(text)
    else:
        print('Not a valid command.')