Cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

How can I remotely control this program? What code do I have to inject?

from tkinter import *
from tkinter.ttk import *
from tkinter.filedialog import *
from pygame import mixer
from os import system
from tkinter.messagebox import *
from pynput.keyboard import Key,Controller
from subprocess import run, PIPE
import screen_brightness_control as sbc
keyboard = Controller()
def audioEngine():
    if mixer.get_init():
        mixer.quit()
        audioButton.config(text='Start Audio Engine')
        fileButton.config(state=DISABLED)
        playButton.config(state=DISABLED)
        pauseButton.config(state=DISABLED)
        stopButton.config(state=DISABLED)
        midifileButton.config(state=DISABLED)
        midiplayButton.config(state=DISABLED)
        midipauseButton.config(state=DISABLED)
        midistopButton.config(state=DISABLED)
    else:
        mixer.init()
        root.channel=mixer.find_channel()
        audioButton.config(text='Stop Audio Engine')
        fileButton.config(state=NORMAL)
        playButton.config(state=NORMAL)
        pauseButton.config(state=NORMAL)
        stopButton.config(state=NORMAL)
        midifileButton.config(state=NORMAL)
        midiplayButton.config(state=NORMAL)
        midipauseButton.config(state=NORMAL)
        midistopButton.config(state=NORMAL)
def volume(v):
    if v==2:
        keyboard.press(Key.media_volume_up)
        keyboard.release(Key.media_volume_up)
    elif v==1:
        keyboard.press(Key.media_volume_down)
        keyboard.release(Key.media_volume_down)
    else:
        keyboard.press(Key.media_volume_mute)
        keyboard.release(Key.media_volume_mute)
def media(m):
if m==2:
keyboard.press(Key.media_next)
keyboard.release(Key.media_next)
elif m==1:
keyboard.press(Key.media_play_pause)
keyboard.release(Key.media_play_pause)
else:
keyboard.press(Key.media_previous)
keyboard.release(Key.media_previous) def shutdown(arg): system('shutdown -'+arg+' -t 0') def play(): try: if root.audiopaused: root.channel.unpause() else: root.channel.play(mixer.Sound(root.file)) root.audioplaying=True root.audiopaused=False except: showerror('Error', "The file can't be played or there is no file loaded.") def midiplay(): try: if root.midipaused: mixer.music.unpause() else: mixer.music.play() root.midiplaying=True root.midipaused=False except: showerror('Error', "The file can't be played or there is no file loaded.") def pause(): if root.audioplaying: root.channel.pause() root.audiopaused=True root.audioplaying=False def midipause(): if root.midiplaying: mixer.music.pause() root.midipaused=True root.midiplaying=False def stop(): root.channel.stop() root.audioplaying=False root.audiopaused=False def midistop(): mixer.music.stop() root.midiplaying=False root.midipaused=False def file(): f=askopenfilename(filetypes=[('WAV Files', '*.wav'),('MP3 Files', '*.mp3'),('M4A Files', '*.m4a'),('WMA Files','*.wma'),]) if f=='': root.file=None else: root.file=f stop() def midifile(): f=askopenfilename(filetypes=[('MIDI Files', '*.mid')]) midistop() if not f=='': mixer.music.load(f) else: mixer.music.unload() def brightness(b): if b==1 and sbc.get_brightness()<100: sbc.set_brightness(sbc.get_brightness()+1) elif sbc.get_brightness()>0: sbc.set_brightness(sbc.get_brightness()-1) bright.config(text=str(sbc.get_brightness())) def runprocess(): try: run(cmd.get()) except OSError as e: showerror("Can't Run Process", e) def detect(): bright.config(text=str(sbc.get_brightness())) root.after(100, detect) root=Tk() root.file='' root.iconbitmap('control.ico') root.audioplaying=False root.audiopaused=False root.midiplaying=False root.midipaused=False menu=Menu(root, tearoff=0) optionmenu=Menu(menu, tearoff=0) menu.add_cascade(label="Options", menu=optionmenu) root.resizable(False, False) root.title('Windows Control Center v1.0') optionmenu.add_command(label='Connect Smartphone/Smartwatch...', command=lambda: showinfo('Coming Soon', 'Connecting a smartphone/smartwatch will be supported probably in the next update.')) frame1=LabelFrame(root, text='Power Controls') frame1.grid() Button(frame1, text='Suspend', command=lambda: system('rundll32.exe powrprof.dll,SetSuspendState 0,1,0')).grid(column=0, row=0) Button(frame1, text='Power Off', command=lambda: shutdown('s')).grid(column=1, row=0) Button(frame1, text='Restart', command=lambda: shutdown('r')).grid(column=2, row=0) root.config(menu=menu) frame4=LabelFrame(root, text='User Controls') frame4.grid() Button(frame4, text='Lock', command=lambda: system('Rundll32.exe user32.dll,LockWorkStation')).grid(column=0, row=0) Button(frame4, text='Sign out', command=lambda: shutdown('l')).grid(column=1, row=0) frame2=LabelFrame(root, text='Audio Controls') frame2.grid() Button(frame2, text='+', command=lambda: volume(2))grid(column=2, row=0) Button(frame2, text='-', command=lambda: volume(1)).grid(column=1, row=0) Button(frame2, text='X', command=lambda: volume(0)).grid(column=0, row=0)
Button(frame2, text='|<<', command=lambda: media(0)).grid(column=3, row=0)
Button(frame2, text='>||', command=lambda: media(1)).grid(column=4, row=0)
Button(frame2, text='>>|', command=lambda: media(2)).grid(column=5, row=0) frame3=LabelFrame(root, text='Audio Player') frame3.grid() audioButton=Button(frame3, text='Start Audio Engine', command=audioEngine) audioButton.grid(column=0, row=0) fileButton=Button(frame3, text='File', command=file, state=DISABLED) fileButton.grid(column=4, row=0) playButton=Button(frame3, text='|>', command=play, state=DISABLED) playButton.grid(column=1, row=0) pauseButton=Button(frame3, text='||', command=pause, state=DISABLED) pauseButton.grid(column=2, row=0) stopButton=Button(frame3, text='X', command=stop, state=DISABLED) stopButton.grid(column=3, row=0) frame6=LabelFrame(root, text='MIDI Player') frame6.grid() midifileButton=Button(frame6, text='File', command=midifile, state=DISABLED) midifileButton.grid(column=4, row=0) midiplayButton=Button(frame6, text='|>', command=midiplay, state=DISABLED) midiplayButton.grid(column=1, row=0) midipauseButton=Button(frame6, text='||', command=midipause, state=DISABLED) midipauseButton.grid(column=2, row=0) midistopButton=Button(frame6, text='X', command=midistop, state=DISABLED) midistopButton.grid(column=3, row=0) frame5=LabelFrame(root, text='Display Controls') frame5.grid() ok=True try: bright=Label(frame5, text=sbc.get_brightness()) except: ok=False bright=Label(frame5, text='Not Available') bright.grid(column=1, row=0) if ok: Button(frame5, text='-', command=lambda: brightness(0)).grid(column=0, row=0) Button(frame5, text='+', command=lambda: brightness(1)).grid(column=2, row=0) else: Button(frame5, text='-', command=lambda: brightness(0), state=DISABLED).grid(column=0, row=0) Button(frame5, text='+', command=lambda: brightness(1), state=DISABLED).grid(column=2, row=0) frame7=LabelFrame(root, text='Command Prompt') frame7.grid() frame8=LabelFrame(root, text='Remote Control') frame8.grid() cmd=Entry(frame7) cmd.grid(column=0, row=0) Button(frame7, text='Run', command=runprocess).grid(column=0, row=1) allowremote=Checkbutton(frame8, text='Allow Remote Control') allowremote.grid(column=0, row=0) allowremote.config(state=DISABLED)
allowremote.state([('!alternate')]) if ok: detect() root.mainloop()

This Python program is a central control center for Windows which allows changing of brightness, volume, play/pause media, and even suspending, shutting down, and restarting your computer. How can I allow this to be remote controlled by a Fitbit smartwatch?

Best Answer
0 Votes
2 REPLIES 2

Write a clockface or app that runs on the watch.

  • Pass commands from watch to companion using messaging or file transfer.
  • Pass commands from companion to a server using fetch() or WebSockets. This is the hardest part because you need HTTPS unless you host the server on the same device as the companion.
  • Pass commands from server to your python app, perhaps by providing an API in the python app that the server can use.

It would be possible to integrate the server component into your python app, but that would mean you'd need a non-self-signed SSL certificate on your windows box.

Peter McLennan
Gondwana Software
Best Answer
0 Votes

I need to ping the main program with the command when the corresponding button is pressed in the watch app. Then the main Windows app decides what to do (e.g. shutdown, restart, change volume/brightness, etc.) What I need is the code to listen for those commands in my Windows app and the code to send the commands in the watch app.

Best Answer