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
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.')