Esempio n. 1
0
    def rearrange_layout_of_tab(self) -> None:
        # Todo: Limit to Toplevel/Add another limit, otherwise the ui will
        # turn crowded
        self.check_boxes = []
        for id_el in self.all_ids:
            new_checkbox = sg.Checkbox(text=self.id_collecion_name_dict[id_el],
                                       key=f"-checkbox-{id_el}-",
                                       default=id_el in self.valid_ids)
            new_checkbox.any = {"collection_id": id_el}
            self.check_boxes.append(new_checkbox)

        self.rows = []

        checkbox_frame = sg.Frame(title="Active Collections:",
                                  layout=[self.check_boxes])

        self.rows.append([checkbox_frame])

        self.rows.append([
            sg.Text(f"Current Exercise: \n {self.current_human_id} ",
                    justification="center")
        ])
        if self.display_solution:
            self.rows.append([self.exercise_image, self.solution_image])
        else:
            self.rows.append([self.exercise_image])
        self.rows.append([self.btn_show_solution])
Esempio n. 2
0
def selectMetricsToCollectPopup(
    listOptions, listAlreadySelectedValues
):  #opens "select metrics" dialog window, returns the checked values.
    checkBoxColumn = [[
        pygui.Checkbox(
            text=str(option),
            key=str(option),
            default=(True if (option in listAlreadySelectedValues) else False))
    ] for option in listOptions if option not in ["unixTime"]]
    checkWindow = pygui.Window(
        title="Select metrics to be collected",
        layout=[[pygui.Text("Selct metrics to be collected")],
                [
                    pygui.Column(checkBoxColumn,
                                 size=(300, 300),
                                 scrollable=True)
                ],
                [
                    pygui.Button("OK"),
                    pygui.Button("Select all"),
                    pygui.Button("Select none")
                ]])  #create window

    #main window loop
    event, values = checkWindow.read()
    if (event == "Select all"):
        checkWindow.close()
        return selectMetricsToCollectPopup(listOptions, listOptions)
    if (event == "Select none"):
        checkWindow.close()
        return selectMetricsToCollectPopup(listOptions, {})
    if event in [pygui.WIN_CLOSED,
                 "OK"]:  #if window is closed or "OK" button pressed
        checkWindow.close()  #close window we opened earlier
        return [key for key in values if values[key]] + ["unixTime"]
Esempio n. 3
0
    def restore_from_seed(self):
        logger.debug('In restore_from_seed')
        from mnemonic import Mnemonic
        MNEMONIC = Mnemonic(language="english")

        info1 = (
            "Please enter your BIP39 seed phrase in order to restore your wallet."
        )
        layout = [[sg.Text("Enter Seed")], [sg.Text(info1)],
                  [sg.InputText(key='seed')],
                  [
                      sg.Checkbox('Extends this seed with custom words',
                                  key='use_passphrase')
                  ], [sg.Button('Back'), sg.Button('Next')]]
        window = sg.Window("Satochip-Bridge: Enter seed",
                           layout,
                           icon=self.satochip_icon)
        while True:
            event, values = window.read()
            if event == 'Next':
                if not MNEMONIC.check(
                        values['seed']):  # check that seed is valid
                    self.client.request(
                        'show_error', "Invalid BIP39 seed! Please type again!")
                else:
                    break
            else:  #  event=='Back'
                break
        window.close()
        del window

        # logger.debug("Event:"+str(type(event))+str(event))
        # logger.debug("Values:"+str(type(values))+str(values))
        return (event, values)
Esempio n. 4
0
def HowDoI():
    '''
    Make and show a window (PySimpleGUI form) that takes user input and sends to the HowDoI web oracle
    Excellent example of 2 GUI concepts
        1. Output Element that will show text in a scrolled window
        2. Non-Window-Closing Buttons - These buttons will cause the form to return with the form's values, but doesn't close the form
    :return: never returns
    '''
    # -------  Make a new Window  ------- #
    sg.ChangeLookAndFeel('GreenTan')            # give our form a spiffy set of colors

    layout =  [
                [sg.Text('Ask and your answer will appear here....')],
                [sg.Output(size=(900, 500), font=('Courier', 10))],
                [ sg.Spin(values=(1, 4), initial_value=1, size=(50, 25), key='Num Answers', font=('Helvetica', 15)),
                  sg.Text('Num Answers',font=('Helvetica', 15), size=(170,22)), sg.Checkbox('Display Full Text', key='full text', font=('Helvetica', 15), size=(200,22)),
                sg.T('Command History', font=('Helvetica', 15)), sg.T('', size=(100,25), text_color=sg.BLUES[0], key='history'), sg.Stretch()],
                [sg.Multiline(size=(600, 100), enter_submits=True, focus=True, key='query', do_not_clear=False), sg.Stretch(),
                sg.ReadButton('SEND', button_color=(sg.YELLOWS[0], sg.BLUES[0]), bind_return_key=True),
                sg.Button('EXIT', button_color=(sg.YELLOWS[0], sg.GREENS[0])), sg.Stretch()]
              ]

    window = sg.Window('How Do I ??',
                       default_element_size=(100, 25),
                       # element_padding=(10,10),
                       icon=DEFAULT_ICON,
                       font=('Helvetica',14),
                       default_button_element_size=(70,50),
                       return_keyboard_events=True,
                       no_titlebar=False,
                       grab_anywhere=True,)

    window.Layout(layout)
    # ---===--- Loop taking in user input and using it to query HowDoI --- #
    command_history = []
    history_offset = 0
    while True:
        event, values = window.Read()
        if event in ['SEND', 'query']:
            # window.FindElement('+OUTPUT+').Update('test of output')                       # manually clear input because keyboard events blocks clear

            query = values['query'].rstrip()
            # print(query)
            QueryHowDoI(query, values['Num Answers'], values['full text'])  # send the string to HowDoI
            command_history.append(query)
            history_offset = len(command_history)-1
            window.FindElement('query').Update('')                       # manually clear input because keyboard events blocks clear
            window.FindElement('history').Update('\n'.join(command_history[-3:]))
        elif event is None or event == 'EXIT':            # if exit button or closed using X
            break
        elif 'Up' in event and len(command_history):                                # scroll back in history
            command = command_history[history_offset]
            history_offset -= 1 * (history_offset > 0)      # decrement is not zero
            window.FindElement('query').Update(command)
        elif 'Down' in event and len(command_history):                              # scroll forward in history
            history_offset += 1 * (history_offset < len(command_history)-1) # increment up to end of list
            command = command_history[history_offset]
            window.FindElement('query').Update(command)
        elif 'Escape' in event:                            # clear currently line
            window.FindElement('query').Update('')
Esempio n. 5
0
File: ip.py Progetto: sg-ja/IP-GUI
def init_gui():
    global window
    global adapters
    global values

    sg.theme("Reddit")

    layout_frame = [
        [sg.Checkbox("DHCP", key="DHCP", enable_events=True)],
        [sg.Text("")],
        [sg.Text("IP: ", size=(15, 1)),
         sg.Input(size=(15, 1), key="IP")],
        [sg.Text("Sub: ", size=(15, 1)),
         sg.Input(size=(15, 1), key="SUB")],
        [
            sg.Text("Gateway: ", size=(15, 1)),
            sg.Input(size=(15, 1), key="GATE")
        ],
    ]

    layout = [[
        sg.Combo(adapters, enable_events=True, key="DROP", readonly=True),
    ], [
        sg.Frame(
            "Network",
            layout_frame,
        ),
    ], [sg.Button("Update", size=(15, 1), key="UPDATE")]]

    window = sg.Window("IP", layout, icon="favicon.png")

    window.read(1)
    update_text(window, 0)
Esempio n. 6
0
def gui_select_tracks(tracks: List[dict], start_time: int, config: dict) -> dict:
    chataigne_path_cfg = config.get("chataigneProjectPath")
    if not chataigne_path_cfg: chataigne_path_cfg = ""

    start_time_cfg = config.get("startTime")
    if not start_time_cfg: start_time_cfg = start_time

    tracks_cfg = config.get("tracks")
    if tracks_cfg is None: tracks_cfg = {}

    layout = [[sg.Text('Chataigne base project:')],
              [sg.Input(chataigne_path_cfg, key='-CH_PATH-'), sg.FileBrowse()],
              [sg.Text('Start time'), sg.Input(default_text=start_time_cfg, key='-START_TIME-')],
              [sg.Text('Select tracks, DMX channel')]]

    for i, track in enumerate(tracks):
        track_cfg = tracks_cfg.get(track["name"])

        if track_cfg is None:
            include = False
            dmx = None
        else:
            include = track_cfg["include"]
            dmx = track_cfg["dmx"]

        if dmx is None:
            dmx = ""

        layout.append(
            [sg.Checkbox(track["name"], default=include, key=f"-TRACK_{i}-"), sg.Input(dmx, key=f"-DMX_{i}-")])

    layout.append([sg.Submit("Convert selected tracks!", bind_return_key=True)])

    window = sg.Window('Select DMX tracks', layout)

    event, values = window.read()
    window.close()

    if event == None: exit()

    start_time_cfg = re.sub('[^0-9]', '', values["-START_TIME-"])
    start_time_cfg = int(start_time_cfg) if start_time_cfg else start_time

    config = {"chataigneProjectPath": values["-CH_PATH-"],
              "startTime": start_time_cfg,
              "tracks": {}}

    for i, track in enumerate(tracks):
        checked = values[f'-TRACK_{i}-']
        dmx = re.sub('[^0-9]', '', values[f'-DMX_{i}-'])
        dmx = int(dmx) if dmx else None
        config["tracks"][track["name"]] = {"include": checked, "dmx": dmx}

    return config
Esempio n. 7
0
 def approve_action(self, question):
     logger.debug('In approve_action')
     layout = [
         [sg.Text(question)],
         [
             sg.Checkbox(
                 'Skip confirmation for this connection (not recommended)',
                 key='skip_conf')
         ], [sg.Button('Yes'), sg.Button('No')]
     ]
     window = sg.Window('Satochip-Bridge: Confirmation required',
                        layout,
                        icon=self.satochip_icon)  #ok
     event, values = window.read()
     window.close()
     del window
     return (event, values)
Esempio n. 8
0
    def reset_seed_dialog(self, msg):
        logger.debug('In reset_seed_dialog')
        layout = [[sg.Text(msg)], [sg.InputText(password_char='*', key='pin')],
                  [sg.Checkbox('Also reset 2FA', key='reset_2FA')],
                  [sg.Button('Ok'), sg.Button('Cancel')]]
        window = sg.Window("Satochip-Bridge: Reset seed",
                           layout,
                           icon=self.satochip_icon)
        event, values = window.read()
        window.close()
        del window

        # logger.debug("Event:"+str(type(event))+str(event))
        # logger.debug("Values:"+str(type(values))+str(values))
        #Event:<class 'str'>Ok
        #Values:<class 'dict'>{'passphrase': 'toto', 'reset_2FA': False}
        return (event, values)
Esempio n. 9
0
    def create_seed(self, seed):
        logger.debug('In create_seed')
        warning1 = (
            "Please save these 12 words on paper (order is important). \nThis seed will allow you to recover your wallet in case of computer failure."
        )
        warning2 = ("WARNING:")
        warning3 = (
            "*Never disclose your seed.\n*Never type it on a website.\n*Do not store it electronically."
        )

        layout = [[sg.Text("Your wallet generation seed is:")],
                  [sg.Text(seed)],
                  [
                      sg.Checkbox('Extends this seed with custom words',
                                  key='use_passphrase')
                  ], [sg.Text(warning1)], [sg.Text(warning2)],
                  [sg.Text(warning3)],
                  [
                      sg.Button('Back'),
                      sg.Button('Next'),
                      sg.Button('Copy seed to clipboard')
                  ]]
        window = sg.Window("Satochip-Bridge: Create seed",
                           layout,
                           icon=self.satochip_icon)
        while True:
            event, values = window.read()
            if event == 'Back' or event == 'Next':
                break
            elif event == 'Copy seed to clipboard':
                try:
                    pyperclip.copy(seed)
                except PyperclipException as e:
                    logger.warning("PyperclipException: " + str(e))
                    self.client.request('show_error',
                                        "PyperclipException: " + str(e))
        window.close()
        del window

        logger.debug("Event:" + str(type(event)) + str(event))
        logger.debug("Values:" + str(type(values)) + str(values))
        #Event:<class 'str'>Next
        #Values:<class 'dict'>{'use_passphrase': False}
        return (event, values)
Esempio n. 10
0
    def create_cred_layout(self):
        """ Layouts in simplepyguy cannot be reused
            need to create new one when (re)-opening windows
            if valid, use configured credentials as default values
        """

        if Config.SERVER and Config.USER and Config.PW:
            self.def_server = Config.SERVER
            self.def_user = Config.USER
            self.def_pw = Config.PW

        layout = [
            [
                sg.Text("Server address: ", size=(30, 1)),
                sg.InputText(default_text=self.def_server, key="server", size=(25, 1)),
            ],
            [
                sg.Text("Disable SSL certificate check: ", size=(30, 1)),
                sg.Checkbox(
                    "(only check if using your own server)",
                    default=not Config.VERIFY_SSL_CERT,
                    key="ignore_cert",
                ),
            ],
            [
                sg.Text("Username: "******"user", size=(25, 1)),
            ],
            [
                sg.Text("Password: "******"pw", size=(25, 1)),
            ],
            [sg.Text("")],
            [
                sg.Button("Login", size=(18, 1)),
                sg.Button("Register", size=(18, 1)),
                sg.Cancel(size=(18, 1)),
            ],
        ]
        return layout
Esempio n. 11
0
def theosgui():
    nic_layout = [
        [
            gui.Text('Athena | Theos GUI',
                     font=('Arial', 13, 'bold'),
                     text_color=tcolor,
                     justification='center')
        ],
        [
            gui.Text('Developed by @maxbridgland',
                     font=('Arial', 10, 'italic'),
                     text_color=tcolor,
                     justification='center')
        ],
        [
            gui.T('New Tweak Creator',
                  font=('Arial', 13, 'bold'),
                  justification='center')
        ],
        [
            gui.T('Project Name:', justification='left'),
            gui.InputText('ExampleTweak',
                          text_color=itcolor,
                          size=(20, 1),
                          key='_PROJNAME_',
                          justification='right')
        ],
        [
            gui.T('Package Name:', justification='left'),
            gui.InputText('com.Athena.exampletweak',
                          text_color=itcolor,
                          size=(20, 1),
                          key='_PACKNAME_',
                          justification='right')
        ],
        [
            gui.T('Author Name:', justification='left'),
            gui.InputText('AthenaTeam',
                          text_color=itcolor,
                          size=(20, 1),
                          key='_AUTHNAME_',
                          justification='right')
        ], [gui.Button('Create New Package')], [gui.Text('')],
        [gui.Text('_' * 100)], [gui.Text('')],
        [
            gui.T('Tweak Compiler',
                  font=('Arial', 13, 'bold'),
                  justification='center')
        ],
        [
            gui.T('Project Directory:', justification='left'),
            gui.InputText('C:\\Example\\Tweak\\Path',
                          text_color=itcolor,
                          size=(50, 1),
                          key='_TWEAKPATH_',
                          justification='right'),
            gui.FolderBrowse()
        ],
        [
            gui.Checkbox('Install To Device (Required .bashrc setup)  ',
                         text_color=itcolor,
                         key='_INSTALL_',
                         default=False),
            gui.Checkbox('Clean Directory/Theos Cache',
                         text_color=itcolor,
                         key='_CLEAN_',
                         default=True),
            gui.Checkbox('Final Package Flag',
                         text_color=itcolor,
                         key='_FINAL_',
                         default=True)
        ],
        [
            gui.T('Theos Device IP (Enter Only If Using Install To Device): ',
                  justification='left'),
            gui.InputText('',
                          text_color=itcolor,
                          size=(20, 1),
                          justification='center',
                          key='_DEVIP_')
        ], [gui.Button('Build')], [gui.Button('Exit'),
                                   gui.Button('Donate')]
    ]
    window = gui.Window('Athena',
                        no_titlebar=True,
                        keep_on_top=True,
                        grab_anywhere=True).Layout(nic_layout)
    count = 0
    while True:
        event, values = window.Read()
        if event == 'Exit':
            window.Close()
            break
        elif event == 'Create New Package':
            if len(values['_PROJNAME_']) == 0:
                count += 1
            if len(values['_PACKNAME_']) == 0:
                count += 1
            if len(values['_AUTHNAME_']) == 0:
                count += 1
            if count >= 1:
                gui.Window('Error',
                           no_titlebar=True,
                           keep_on_top=True,
                           auto_close=True,
                           auto_close_duration=1).Layout([[
                               gui.T('Error: Missing Value! ',
                                     justification='center')
                           ]]).Read()
            createnewpkg(values['_PROJNAME_'], values['_PACKNAME_'],
                         values['_AUTHNAME_'])
        elif event == 'Build':
            if values['_TWEAKPATH_'] == '':
                gui.Window('Error',
                           no_titlebar=True,
                           keep_on_top=True,
                           auto_close=True,
                           auto_close_duration=1).Layout([[
                               gui.T('Error: Missing Tweak Path! ',
                                     justification='center')
                           ]]).Read()
            elif values['_TWEAKPATH_'] != '':
                path = values['_TWEAKPATH_']
            if values['_INSTALL_'] == True:
                install = 'install'
            elif values['_INSTALL_'] == False:
                install = ''
            if values['_CLEAN_'] == True:
                clean = 'clean'
            elif values['_CLEAN_'] == False:
                clean = ''
            if values['_FINAL_'] == True:
                final = 'FINALPACKAGE=1'
            elif values['_FINAL_'] == False:
                final = ''
            query = "make %s package %s -C %s %s" % (clean, install, path,
                                                     final)
            buildwindow(path, query)
        elif event == 'Donate':
            webbrowser.open_new_tab('https://paypal.me/AuxilumDevelopment')
Esempio n. 12
0
                     enable_events=True,
                     do_not_clear=True,
                     justification='center',
                     size=(50, 1),
                     key='-ARTIST-',
                     visible=False)
    ], [sg.Text(key='-OUTPUT-', background_color='NONE')],
    [
        sg.Button('Add Song', size=(25, 1)),
        sg.Button('Add Artist', size=(25, 1), visible=False),
        sg.Button('Submit', size=(25, 1))
    ],
    [
        sg.Checkbox("Tree Implementation",
                    default=True,
                    key='-Tree-',
                    enable_events=True,
                    background_color='NONE',
                    visible=False),
        sg.Checkbox("Map Implementation",
                    key='-Map-',
                    enable_events=True,
                    background_color='NONE')
    ],
    [
        sg.Multiline(background_color='WHITE',
                     default_text="Current Playlist:\n",
                     key='-LIKED-')
    ]
]

window = sg.Window('Playlists to improve? Let’s find your groove.',
Esempio n. 13
0
              size=(150, 30),
              text_color='green')
 ],
 [
     sg.Listbox(['Listbox Item 1', 'Listbox Item 2', 'Listbox Item 3'],
                key='+LIST+',
                size=(200, 150),
                text_color='blue'),
     sg.Slider((1, 100), orientation='v', key='+SLIDER 1+')
 ],
 [
     sg.Slider((1, 10), size=(200, 30), orientation='h', key='+SLIDER 2+'),
     sg.Stretch()
 ],
 [
     sg.Checkbox('Checkbox 1', key='+CB1+'),
     sg.Checkbox('Checkbox 2', key='+CB2')
 ],
 [sg.Checkbox('Checkbox 3'),
  sg.Checkbox('Checkbox 4')],
 [sg.Radio('Radio1', group_id=1),
  sg.Radio('Radio2', group_id=1)],
 [sg.Spin((5, 8), size=(100, 30))],
 [
     sg.Multiline('This is a Multiline Element',
                  size=(300, 300),
                  key='+MULTI+')
 ],
 [
     sg.Button('My Button', size=(120, 30)),
     sg.Exit(),
    def __init__(self, config):
        from monopolpy_companion.lib.common.run import opts_win_active
        import PySimpleGUIQt as qt
        # First we pull in the environment variables
        from monopolpy_companion.conf import conf as defaults
        import logging

        self.name = 'MonopolPyCompanion.GUI.OptionsWindow'
        log = logging.getLogger(self.name)
        log.debug(f'Logger started for {self.name}')
        self.log = log

        log.debug(f'Current active state: {opts_win_active}')
        opts_win_active = True
        log.debug(f'New active state: {opts_win_active}')
        self.active = opts_win_active

        conf = config
        self.conf = conf

        self.opts_playman_frame = [
            [qt.Button('Player Management', key='opts_playman_button')],
        ]

        self.opts_frame = [[
            qt.Checkbox('Grab anywhere',
                        default=self.is_grabby(),
                        key='grab_anywhere_box')
        ]]

        self.opts_main_frame = [[
            qt.Frame('Player Management:', self.opts_playman_frame)
        ], [qt.Frame('GUI Options', self.opts_frame)]]

        self.layout = [[
            qt.Frame('Monopolpy Companion Options:',
                     self.opts_main_frame,
                     background_color='#40bfdbae',
                     title_color='#ff000000',
                     title_location='TITLE_LOCATION_TOP',
                     relief='RELIEF_SUNKEN')
        ],
                       [
                           qt.Button('OK', key='opts_ok'),
                           qt.Cancel(key='opts_cancel'),
                           qt.Button('Apply', key='opts_apply')
                       ]]

        self.opts_win = qt.Window(
            'Monopolpy Companion Options',
            self.layout,
            grab_anywhere=self.conf['gui_settings']['grab_anywhere'],
            background_image='thing.png',
            size=(400, 200))
        from monopolpy_companion.lib.common.run import pm_active

        log.debug(
            f'Imported active state of the Player Manager window which is: {pm_active}'
        )

        while self.active:

            event, values = self.opts_win.read(timeout=100)

            if event == 'opts_ok' or event == 'opts_apply':
                log.debug('User is attempting to save config to file')
                from monopolpy_companion.lib.helpers.popup_man import nyi

                nyi('Save Config')

            if event == 'opts_ok':
                log.debug('User pressed OK in the options window')
                log.debug('Leaving window.')
                self.leave()

            if event == 'opts_playman_button' and not pm_active:
                from monopolpy_companion.lib.gui.models.windows.player_man import PlayerManagerWindow
                log.debug('User pressed the Player Manager button')
                play_man_win = PlayerManagerWindow()
                log.debug(
                    f'Player Manager active state was {play_man_win.active}')
                play_man_win.active = True

            if event is None or event == 'opts_cancel':
                log.debug('User pressed cancel in the options window')
                self.leave()
def the_gui():
    """Starts and executes the GUI

    Returns when the user exits / closes the window
    """
    ffmpeg_path = Path('ffmpeg_hevc.exe')
    settings_path = Path("settings.json")
    presets = {
        0: "placebo",
        1: "placebo",
        2: "placebo",
        3: "placebo",
        4: "veryslow",
        5: "slower",
        6: "slow",
        7: "medium",
        8: "fast",
        9: "faster",
        10: "veryfast",
        11: "superfast",
        12: "ultrafast"
    }

    # queue used to communicate between the gui and the threads
    gui_queue = queue.Queue()

    encode_queue = queue.Queue()
    encode_list = []

    encode_event = queue.Queue(
    )  # queue for handling when encodes finish and start

    # Define default settings to make it possible to generate settings.json
    settings = {"settings": {"theme": "Default1"}}

    status_deque = deque(maxlen=1)  # deque for handling the status bar element

    check_paths(ffmpeg_path, gui_queue)

    # Load settings from json if it exist
    if settings_path.exists():
        with settings_path.open() as file:
            settings = json.load(file)
            sg.change_look_and_feel(settings["settings"]["theme"])
    else:
        print("Could not find settings.json")
        write_settings(settings_path, settings)

    tooltips = {
        # ENCODE
        "tune":
        "0 = visual quality, 1 = psnr/ssim, 2 = vmaf",
        "preset":
        "Trades speed for quality and compression.\n'Veryfast' and up only works for 1080p or higher, while 'ultrafast' and 'superfast' is 4k and higher only.\nYou might have a file that is just a few pixels away fitting 1080p, and you will be limited to the 'faster' preset or slower\nBest to stay around medium unless you have a godly pc/trash pc",
        "drc":
        "Enables variable bitrate. Lets the encoder vary the targeted quality. \nIf you are unsure, leave it off",
        "qmin":
        "Minimum quality level in DRC mode. Must be lower than qmax",
        "qmax":
        "Maximum quality level in DRC mode. Must be higher than qmin",
        "qp":
        "The quality the encoder will target. Lower values result in higher quality, but much larger filesize. \nUsually stay around 20 for h.264 content, but can often go lower for mpeg2 content. Recommend 22 or 23 for 1080p with high bitrate. \nExperiment with quality by enabling test encode!",
        # FILTERS
        "sharpen":
        "How much to sharpen the image with unsharp, with a moderate impact to encode speed. \nIt is usually a good idea to sharpen the image a bit when transcoding. I recommend about 0.2 to 0.3",
        # AUDIO
        "skip_audio":
        "Enable to skip all audio tracks. Disable to passthrough audio",
        # BUTTONS
        "pause_queue":
        "Once the queue is paused the current job will finish, but the next job will not be started.",
        "start_encode":
        "Add job to queue, start it if no encode is currently running.",
        # MISC
        "test_encode":
        "Only encode part of the video. Lets you compare quality of encode to source, and estimate filesize. \nSpecify how many frames, usually 1000 is enough"
    }

    params = {
        "input": "",
        "output": "",
        "skip_audio": "",
        "qp": 20,
        "subtitles": False,
        "enable_filters": "-vf",
        "drc": 0,
        "qmin": 19,
        "qmax": 21,
        "sharpen_mode": "",
        "crop": "",
        "tune": 0,
        "preset": 7,
        "test_encode": "",
        "n_frames": "1000",
        "start_time": "00:00:00.000",
        "end_time": "",
    }

    old_params = params.copy()

    video_metadata = {
        "contains_video": False,
        "frame_count": None,
        "size": None,
        "fps": None,
        "duration": None,
        "width": None,
        "height": None,
    }

    menu_def = [['&Settings', ['&Themes', '!&Preferences', '---', 'E&xit']],
                ['&Presets', ['!&Save preset', '---', '!Preset1']]]

    drc_col = [
        [
            sg.Checkbox("Dynamic rate control",
                        key="-DRC-",
                        enable_events=True,
                        tooltip=tooltips["drc"])
        ],
        [
            sg.Text("minQP", size=(5, 1), tooltip=tooltips["qmin"]),
            sg.Spin([i for i in range(1, 51)],
                    initial_value=params["qmin"],
                    key="-QMIN-",
                    size=(5, 1),
                    enable_events=True,
                    disabled=True,
                    tooltip=tooltips["qmin"]),
            sg.Text("maxQP", size=(5, 1), tooltip=tooltips["qmax"]),
            sg.Spin([i for i in range(1, 51)],
                    initial_value=params["qmax"],
                    key="-QMAX-",
                    size=(5, 1),
                    enable_events=True,
                    disabled=True,
                    tooltip=tooltips["qmax"]),
        ],
    ]

    encoding_col = [
        [
            sg.Column([
                [sg.Text("Quality", tooltip=tooltips["qp"])],
                [
                    sg.Text("QP", size=(2, 1)),
                    sg.Spin([i for i in range(1, 51)],
                            initial_value=params["qp"],
                            key="-QP-",
                            size=(5, 1),
                            enable_events=True,
                            tooltip=tooltips["qp"])
                ],
            ]),
            sg.VerticalSeparator(),
            sg.Column(drc_col),
            sg.VerticalSeparator(),
            sg.Column([[
                sg.Text("Preset (medium)",
                        size=(10, 1),
                        key="-PRESET_TEXT-",
                        tooltip=tooltips["preset"])
            ],
                       [
                           sg.Slider(range=(0, 12),
                                     default_value=7,
                                     orientation="horizontal",
                                     key="-PRESET-",
                                     enable_events=True,
                                     tooltip=tooltips["preset"])
                       ]]),
            # sg.Column([[sg.Text("Tune", size=(5, 1), tooltip=tooltips["tune"])], [sg.DropDown([0, 1, 2], default_value=0, key="-TUNE-", enable_events=True, tooltip=tooltips["tune"])]])  # Tune is no longer an option
        ],
    ]

    audio_col = [[
        sg.Checkbox("Skip audio",
                    key="-AUDIO-",
                    enable_events=True,
                    default=False,
                    tooltip=tooltips["skip_audio"])
    ]]

    def range_with_floats(start, stop, step):
        """Func for generating a range of decimals"""
        while stop > start:
            yield round(
                start,
                2)  # adding round() to our function and rounding to 2 digits
            start += step

    filter_col = [[
        sg.Checkbox("Sharpen",
                    key="-SHARP_CONTROL-",
                    size=(8, 1),
                    enable_events=True,
                    tooltip=tooltips["sharpen"]),
        sg.Spin([i for i in range_with_floats(-1.50, 1.50, 0.05)],
                key="-SHARPEN-",
                initial_value=0.25,
                size=(6, 1),
                enable_events=True,
                disabled=True,
                tooltip=tooltips["sharpen"])
    ]]

    video_col = [[
        sg.T("Resolution"),
        sg.Input(default_text="WDxHG", disabled=True, key="-RESOLUTION-"),
        sg.T("Crop"),
        sg.Input(key="-CROP-", enable_events=True),
        sg.Button("Autocrop")
    ]]

    layout = [
        [sg.Menu(menu_def)],
        [sg.Text("Browse or drag n drop video file")],
        [
            sg.Text("Input"),
            sg.Input(key="-INPUT-", enable_events=True),
            sg.FileBrowse(enable_events=True)
        ],  #
        [
            sg.Text("Output"),
            sg.Input(key="-OUTPUT-", enable_events=True),
            sg.SaveAs(enable_events=True)
        ],
        [sg.Frame("Encode options", encoding_col)],
        [
            sg.Frame("Audio options", audio_col),
            sg.Frame("Filters", filter_col)
        ],
        [sg.Frame("Video", video_col)],
        [
            sg.Frame("Misc", [[
                sg.Checkbox("Test encode (n frames)",
                            size=(16, 1),
                            key="-TEST_ENCODE-",
                            enable_events=True,
                            tooltip=tooltips["test_encode"]),
                sg.Input(default_text=params["n_frames"],
                         size=(5, 1),
                         enable_events=True,
                         key="-TEST_FRAMES-",
                         disabled=True,
                         tooltip=tooltips["test_encode"])
            ],
                              [
                                  sg.T("Start time", size=(7, 1)),
                                  sg.Input(default_text=params["start_time"],
                                           enable_events=True,
                                           key="-START_TIME-",
                                           size=(9, 1),
                                           tooltip="Start timestamp"),
                                  sg.T("End time", size=(6, 1)),
                                  sg.Input(default_text="00:00:00.000",
                                           enable_events=True,
                                           key="-END_TIME-",
                                           size=(9, 1),
                                           tooltip="End timestamp")
                              ]])
        ],
        # [sg.Frame("Command", [[sg.Column([[sg.Multiline(key="-COMMAND-", size=(60, 3))]])]])],
        [
            sg.Frame("Queue", [[
                sg.Column([[sg.Listbox(values=[], key="-QUEUE_DISPLAY-")],
                           [
                               sg.Button("Remove task", size=(15, 1)),
                               sg.Button("UP", size=(7, 1)),
                               sg.Button("DOWN", size=(7, 1))
                           ]])
            ]])
        ],
        [
            sg.Button("Start encode / add to queue",
                      key="Start encode",
                      size=(20, 1),
                      tooltip=tooltips["start_encode"]),
            sg.Button("Stop encode", size=(20, 1)),
            sg.Button("Pause queue",
                      key="Pause queue",
                      size=(20, 1),
                      tooltip=tooltips["pause_queue"])
        ],
        [sg.T("", key="-STATUS_BOX-")],
        [sg.Output()],  # Disable this line to get output to the console
        # [sg.ProgressBar(100, key="-PROGRESSBAR-")],
        [sg.Button('Exit')],
    ]

    window = sg.Window('SVT_GUI', layout)

    encoder = threading.Thread(target=encode_thread,
                               args=(encode_queue, gui_queue, status_deque,
                                     encode_event),
                               daemon=True)
    try:
        encoder.start()
    except Exception as e:
        print('Error starting work thread. Bad input?\n ' + str(e))

    encode_queue_active.set()  # Start active

    # progressbar = window["-PROGRESSBAR-"]

    def update_command():
        window["-COMMAND-"].update(' '.join(format_command()))

    def format_command():
        input_text = ""
        output_text = ""

        if params["input"] != "":
            input_path = Path(params["input"])
            input_text = str(input_path)

        if params["output"] != "":
            output_path = Path(params["output"])
            output_text = str(output_path)

        enable_filters = params[
            "enable_filters"] if params["sharpen_mode"] != "" or params[
                "crop"] else ""  # todo: Add check for each filter here

        filters = ",".join(
            filter(None, [params["sharpen_mode"], params["crop"]]))
        print("filters: " + (filters if filters else "None"))

        n_frames = params["n_frames"] if params[
            "test_encode"] != "" else ""  # Disable vframes number if we dont want to do test encode

        # Filter list before return to remove empty strings
        return list(
            filter(None, [
                "-i", input_text, "-y", "-ss", params["start_time"],
                ("-to" if params["end_time"] else ""), params["end_time"],
                "-sn", params["skip_audio"], "-map", "0", enable_filters,
                filters, "-c:v", "libsvt_hevc", params["test_encode"],
                n_frames, "-rc",
                str(params["drc"]), "-qmin",
                str(params["qmin"]), "-qmax",
                str(params["qmax"]), "-qp",
                str(params["qp"]), "-preset",
                str(params["preset"]), output_text
            ]))

    def toggle_queue():
        if encode_queue_active.is_set():
            encode_queue_active.clear()
            window.Element("Pause queue").update("Unpause Queue")
        else:
            encode_queue_active.set()
            window.Element("Pause queue").update("Pause Queue")

    def pause_queue():
        if encode_queue_active.is_set():
            encode_queue_active.clear()
            window.Element("Pause queue").update("Unpause Queue")

    def autocrop():
        try:
            # TODO: If the video is shorter than around 16 seconds we might not get any crop values because of the low framerate and start time
            start_time = int(
                (video_metadata["duration"] / 4) /
                1000)  # Start detecting crop at 1/4 of the video duration
            command = [
                ffmpeg_path.absolute().as_posix(), "-ss",
                str(start_time), "-i",
                str(Path(params["input"])), "-t", "01:20", "-vsync", "vfr",
                "-vf", "fps=0.2,cropdetect", "-f", "null", "-"
            ]
            process = subprocess.Popen(command,
                                       stdout=subprocess.PIPE,
                                       stderr=subprocess.STDOUT,
                                       universal_newlines=True,
                                       close_fds=True)
            # out, err = process.communicate()
            crop_values = []
            for line in process.stdout:
                # print(line)
                if "crop=" in line:
                    crop_values.append(line.split("crop=")[1])

            if len(crop_values) > 0:
                most_common = max(set(crop_values), key=crop_values.count)
                print("CROP: " + most_common)
                if most_common:
                    return most_common
                else:
                    print("Could not generate a crop :(")
                    return ""

        except Exception as ex:
            print(ex.args)
        print("Could not generate a crop :(")
        return ""

    def update_queue_display():
        window.Element("-QUEUE_DISPLAY-").update(values=[
            i["status"] + " | " + i["title"] + " - " + i["uuid"]
            for i in encode_list
        ])

    def build_encode_queue():
        clear_queue(encode_queue)
        for i in encode_list:
            if i["status"] == "⏱ waiting":
                encode_queue.put(i)

    #                                                        #
    # --------------------- EVENT LOOP --------------------- #
    while True:
        event, values = window.read(timeout=100)
        if event in (None, 'Exit'):
            break

        elif event == "-INPUT-":
            window.Element("-INPUT-").update(
                background_color="white")  # Reset background color
            file_string = values["-INPUT-"].replace("file:///", "")
            input_file = Path(file_string)
            if input_file.exists() and input_file.is_file():
                params["input"] = input_file.absolute()  # Update params

                # Fill in output based on folder and filename of input
                new_file = input_file
                while new_file.exists():
                    new_file = Path(
                        new_file.with_name(new_file.stem + "_new.mkv"))
                params["output"] = str(new_file.absolute())
                window.Element("-OUTPUT-").update(str(new_file.absolute()))

                print("** Analyzing input using mediainfo... **")
                media_info = MediaInfo.parse(str(input_file.absolute()))

                for track in media_info.tracks:
                    if track:
                        if track.track_type == "General":
                            video_metadata["name"] = track.file_name_extension
                        elif track.track_type == 'Video':
                            video_metadata["contains_video"] = True
                            video_metadata["frame_count"] = track.frame_count
                            video_metadata["size"] = int(
                                track.stream_size
                            ) / 1048576 if track.stream_size else None  # in MiB
                            video_metadata["fps"] = track.frame_rate
                            video_metadata["width"] = track.width
                            video_metadata["height"] = track.height

                            # Reset the start and end time params
                            params["end_time"] = ""
                            params["start_time"] = "00:00:00.000"

                            if track.height and track.width:
                                window.Element("-RESOLUTION-").update(
                                    "%ix%i" % (track.width, track.height))

                            if track.duration:
                                video_metadata["duration"] = float(
                                    track.duration)

                                # hours, rem = divmod(float(track.duration), 3600)
                                # minutes, seconds = divmod(rem, 60)
                                milliseconds = float(track.duration)
                                seconds = (milliseconds / 1000) % 60
                                minutes = int(
                                    (milliseconds / (1000 * 60)) % 60)
                                hours = int(
                                    (milliseconds / (1000 * 60 * 60)) % 24)
                                formatted_duration = "{:0>2}:{:0>2}:{:06.3f}".format(
                                    hours, minutes, seconds)
                                print("Duration:", formatted_duration)
                                window.Element("-END_TIME-").update(
                                    disabled=False)
                                window.Element("-END_TIME-").update(
                                    formatted_duration)
                            else:
                                window.Element("-END_TIME-").update(
                                    disabled=True)

                if video_metadata["frame_count"] is None and video_metadata[
                        "contains_video"]:
                    print(
                        "Could not extract frame count, will not be able to report progress %"
                    )
                if not video_metadata["contains_video"]:
                    print(
                        "This file is either not a video file or does not contain a video stream."
                    )
                    window.Element("-INPUT-").update(background_color="red")

                print('** Analyze done **')

            else:
                print("Can't find file: " + str(input_file.absolute()))

        elif event == "-OUTPUT-":
            if values[
                    "-OUTPUT-"] == "":  # If the user clicks the saveAs button and cancels, the output string will be empty. Better to keep the old value in that case
                window.Element("-OUTPUT-").update(params["output"])
            else:
                file_string = values["-OUTPUT-"].replace("file:///", "")
                params["output"] = file_string

        ##################
        # ENCODE SETTINGS
        elif event == "-QP-":
            params["qp"] = values["-QP-"]

        elif event == "-DRC-":
            val = values["-DRC-"]
            if val:
                params["drc"] = 1
                window.Element("-QMIN-").update(disabled=False)
                window.Element("-QMAX-").update(disabled=False)
                window.Element("-QP-").update(disabled=True)
            else:
                params["drc"] = 0
                window.Element("-QMIN-").update(disabled=True)
                window.Element("-QMAX-").update(disabled=True)
                window.Element("-QP-").update(disabled=False)

        elif event == "-PRESET-":  # TODO: handle limiting preset by resolution as per https://github.com/OpenVisualCloud/SVT-HEVC/blob/master/Docs/svt-hevc_encoder_user_guide.md#encoding-presets-table
            window.Element("-PRESET_TEXT-").update("Preset ({})".format(
                presets[values["-PRESET-"]]))
            params["preset"] = values["-PRESET-"]

        elif event == "-TEST_ENCODE-":
            val = values["-TEST_ENCODE-"]
            if val:
                window.Element("-TEST_FRAMES-").update(disabled=False)
                params["test_encode"] = "-vframes"
            else:
                window.Element("-TEST_FRAMES-").update(disabled=True)
                params["test_encode"] = ""

        elif event == "-TEST_FRAMES-":
            val = ''.join(
                i for i in values["-TEST_FRAMES-"]
                if i.isdigit())  # Remove any non numbers from the input
            window.Element("-TEST_FRAMES-").update(val)
            params["n_frames"] = val

        elif event == "-START_TIME-":
            params["start_time"] = values["-START_TIME-"]

        elif event == "-END_TIME-":
            params["end_time"] = values["-END_TIME-"]

        ##################
        # AUDIO SETTINGS
        elif event == "-AUDIO-":
            if values["-AUDIO-"]:
                params["skip_audio"] = "-an"
            else:
                params["skip_audio"] = ""

        ##################
        # FILTER SETTINGS
        elif event == "-SHARPEN-":
            params["sharpen_mode"] = "unsharp=5:5:{}:5:5:{}".format(
                values["-SHARPEN-"], values["-SHARPEN-"])

        elif event == "-CROP-":
            if values["-CROP-"]:
                params["crop"] = "crop=" + values["-CROP-"]
            else:
                params["crop"] = ""

        elif event == "-SHARP_CONTROL-":
            if values["-SHARP_CONTROL-"]:
                window.Element("-SHARPEN-").update(disabled=False)
                params["sharpen_mode"] = "unsharp=5:5:{}:5:5:{}".format(
                    values["-SHARPEN-"], values["-SHARPEN-"])
            else:
                window.Element("-SHARPEN-").update(disabled=True)
                params["sharpen_mode"] = ""

        ##################
        # QUEUE BUTTONS
        elif event == "Remove task":
            if values["-QUEUE_DISPLAY-"]:
                for queue_item in values[
                        "-QUEUE_DISPLAY-"]:  # TODO: make alternative to nesting loops
                    job_id = queue_item.split()[-1]
                    for i, job in enumerate(encode_list):
                        if job["uuid"] == job_id and job[
                                "status"] != "▶ started":
                            encode_list.pop(i)

            build_encode_queue()
            update_queue_display()

        elif event == "UP":
            if values["-QUEUE_DISPLAY-"] and len(
                    values["-QUEUE_DISPLAY-"]) == 1 and len(encode_list) > 1:
                job_id = values["-QUEUE_DISPLAY-"][0].split()[-1]
                for i, job in enumerate(encode_list):
                    if job["uuid"] == job_id and i != 0:
                        encode_list.insert(i - 1, encode_list.pop(i))

                build_encode_queue()
                update_queue_display()

        elif event == "DOWN":
            if values["-QUEUE_DISPLAY-"] and len(
                    values["-QUEUE_DISPLAY-"]) == 1 and len(encode_list) > 1:
                job_id = values["-QUEUE_DISPLAY-"][0].split()[-1]
                for i, job in enumerate(encode_list):
                    if job["uuid"] == job_id and i != len(encode_list) - 1:
                        encode_list.insert(i + 1, encode_list.pop(i))

                build_encode_queue()
                update_queue_display()

        ##################
        # OTHER INTERACTS
        elif event == "Start encode":
            if not params["input"] or params["input"] == "":
                print("Missing input")
            elif not params["output"] or params["output"] == "":
                print("Missing output")
            elif not video_metadata["contains_video"]:
                print(
                    "Cannot start encode because input file does not have a video track"
                )
            else:
                finished_command = [ffmpeg_path.absolute().as_posix()
                                    ] + format_command()

                try:
                    job_id = uuid.uuid4().hex
                    encode_list.append({
                        "title":
                        video_metadata["name"],
                        "uuid":
                        job_id,
                        "status":
                        "⏱ waiting",
                        "output_file":
                        Path(params["output"]),
                        "command":
                        finished_command,
                        "metadata":
                        video_metadata,
                        "test_encode":
                        int(params["n_frames"])
                        if params["test_encode"] != "" else False
                    })
                    build_encode_queue()
                    update_queue_display()
                except Exception as e:  # TODO: make this better. Is it even needed?
                    print('Error adding job. Bad input?:\n "%s"' %
                          finished_command)

        elif event == "Stop encode":
            if encoder is not None:
                stoprequest.set()
                pause_queue()

        elif event == "Pause queue":
            toggle_queue()
            encode_queue.put(_skip)

        elif event == "Autocrop":
            crop = autocrop()
            params["crop"] = "crop=" + crop
            window.Element("-CROP-").update(crop)

        elif event == "Themes":
            theme = run_themes_window()
            # Save theme
            if theme and settings_path.exists():
                settings["settings"]["theme"] = theme
                write_settings(settings_path, settings)
                print("Changed theme to {}. Restart the program to apply.".
                      format(theme))

        try:
            window.Element("-STATUS_BOX-").update(status_deque.popleft())
        except IndexError:
            pass

        # --------------- Check for incoming messages from threads  ---------------
        try:
            message = gui_queue.get_nowait()
        except queue.Empty:  # get_nowait() will get exception when Queue is empty
            message = None  # break from the loop if no more messages are queued up

        try:
            # Check for job events
            event = encode_event.get_nowait()
            print(event)
            for i, job in enumerate(encode_list):
                if job["uuid"] == event["uuid"]:
                    item = encode_list[i]
                    item["status"] = event["event"]
                    encode_list[i] = item
                    update_queue_display()
        except queue.Empty:
            pass

        # if message received from queue, display the message in the Window
        if message:
            print("#> " + message)

        # Update display of the encode command
        # if params.items() != old_params.items():
        #     update_command()
        #     old_params = params.copy()

    # We have reached the end of the program, so lets clean up.
    window.disable()
    window.refresh()  # have to refresh window manually outside of event loop
    if encoder is not None:
        stoprequest.set()
        # Clear queue then add sentinel to make thread stop waiting
        clear_queue(encode_queue)
        encode_queue.put(_sentinel)
        encode_queue_active.set(
        )  # We have to make sure the encode queue is active for it to finish, if not it will keep waiting

        print("\n** Taking a sec to shut everything down... **\n")
        window.refresh()

        encoder.join()
        if encoder.is_alive():
            print("Thread still alive! wtf")
            window.refresh()

    window.close()
Esempio n. 16
0
class Window(object):

    active = False

    tab1_layout = [[
        psg.Checkbox('Enable SecureKill',
                     enable_events=True,
                     key='SECURE_KILL_CHECK')
    ],
                   [
                       psg.Text('Name of program to kill:',
                                visible=False,
                                key='SECURE_KILL_PROG_LABEL',
                                size=(175, 30)),
                       psg.InputText(visible=False,
                                     key='SECURE_KILL_PROG',
                                     size=(175, 30))
                   ]]

    layout = [[
        psg.TabGroup([[
            psg.Tab(
                'SecureKill',
                tab1_layout,
                tooltip='Kill a program if your IP changes.',
            )
        ]])
    ],
              [
                  psg.Button('Save and Exit', disabled=True,
                             key='SAVE_BUTTON'),
                  psg.Button('Exit', key='EXIT_BUTTON')
              ]]

    win = psg.Window('Preferences', layout=layout, size=(400, 200))

    running = False

    def run(self):
        self.running = True
        vals_last_save = None
        while self.running:
            event, values = self.win.read(100)

            if vals_last_save is None:
                vals_last_save = values

            vals_differ = (vals_last_save != values)

            save_button_color = 'green' if vals_differ else 'red'
            self.win['SAVE_BUTTON'].update(disabled=not vals_differ,
                                           button_color=('black',
                                                         save_button_color))

            cbox_now = values['SECURE_KILL_CHECK']

            self.win['SECURE_KILL_PROG_LABEL'].update(visible=cbox_now)
            self.win['SECURE_KILL_PROG'].update(visible=cbox_now)

            if event is None:
                self.running = False
                self.win.close()
            if event == 'EXIT_BUTTON':
                self.running = False
                self.win.close
                  size=(15, 15),
                  key='confidence'),
        sg.T('  ', key='_CONF_OUT_')
    ],
    [
        sg.Text('Threshold'),
        sg.Slider(range=(0, 10),
                  orientation='h',
                  resolution=1,
                  default_value=3,
                  size=(15, 15),
                  key='threshold'),
        sg.T('  ', key='_THRESH_OUT_')
    ],
    [sg.Text(' ' * 8),
     sg.Checkbox('Use webcam', key='_WEBCAM_')],
    [sg.Text(' ' * 8),
     sg.Checkbox('Write to disk', key='_DISK_')],
    [sg.OK(), sg.Cancel(), sg.Stretch()],
]

win = sg.Window('YOLO Video',
                default_element_size=(21, 1),
                text_justification='right',
                auto_size_text=False).Layout(layout)
event, values = win.Read()
if event is None or event == 'Cancel':
    exit()
write_to_disk = values['_DISK_']
use_webcam = values['_WEBCAM_']
args = values
Esempio n. 18
0
def main():
    sg.ChangeLookAndFeel('GreenTan')
    # sg.SetOptions(element_padding=(0,0))
    # ------ Menu Definition ------ #
    menu_def = [
        ['&File', ['&Open', '&Save', '&Properties', 'E&xit']],
        [
            '&Edit',
            ['&Paste', [
                'Special',
                'Normal',
            ], 'Undo'],
        ],
        ['&Toolbar', ['Command &1', 'Command &2', 'Command &3', 'Command &4']],
        ['&Help', '&About...'],
    ]

    treedata = sg.TreeData()

    treedata.Insert(
        "",
        '_A_',
        'Tree Item 1',
        [1, 2, 3],
    )
    treedata.Insert(
        "",
        '_B_',
        'B',
        [4, 5, 6],
    )
    treedata.Insert(
        "_A_",
        '_A1_',
        'Sub Item 1',
        ['can', 'be', 'anything'],
    )
    treedata.Insert(
        "",
        '_C_',
        'C',
        [],
    )
    treedata.Insert(
        "_C_",
        '_C1_',
        'C1',
        ['or'],
    )
    treedata.Insert("_A_", '_A2_', 'Sub Item 2', [None, None])
    treedata.Insert("_A1_", '_A3_', 'A30', ['getting deep'])
    treedata.Insert("_C_", '_C2_', 'C2', ['nothing', 'at', 'all'])

    for i in range(100):
        treedata.Insert('_C_', i, i, [])

    frame1 = [
        [sg.Input('Input Text', size=(250, 35)),
         sg.Stretch()],
        [
            sg.Multiline(size=(250, 75), default_text='Multiline Input'),
            sg.MultilineOutput(size=(250, 75), default_text='Multiline Output')
        ],
    ]

    frame2 = [
        [sg.Listbox(['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(200, 85))],
        [
            sg.Combo(['Combo item 1', 'Combo item 2', 'Combo item 3'],
                     size=(200, 35))
        ],
        [sg.Spin([1, 2, 3], size=(40, 30))],
    ]

    frame3 = [
        [sg.Checkbox('Checkbox1', True),
         sg.Checkbox('Checkbox1')],
        [
            sg.Radio('Radio Button1', 1),
            sg.Radio('Radio Button2', 1, default=True),
            sg.Stretch()
        ],
    ]

    frame4 = [
        [
            sg.Slider(range=(0, 100),
                      orientation='v',
                      size=(3, 30),
                      default_value=40),
            sg.Dial(range=(0, 100),
                    tick_interval=50,
                    size=(150, 150),
                    default_value=40),
            sg.Stretch()
        ],
    ]
    matrix = [[str(x * y) for x in range(4)] for y in range(3)]

    frame5 = [
        [
            sg.Table(values=matrix,
                     max_col_width=25,
                     auto_size_columns=True,
                     display_row_numbers=True,
                     change_submits=False,
                     bind_return_key=True,
                     justification='right',
                     num_rows=8,
                     alternating_row_color='lightblue',
                     key='_table_',
                     text_color='black'),
            sg.Tree(data=treedata,
                    headings=['col1', 'col2', 'col3'],
                    change_submits=True,
                    auto_size_columns=True,
                    num_rows=10,
                    col0_width=10,
                    key='_TREE_',
                    show_expanded=True,
                    size=(200, 150)),
            sg.Stretch()
        ],
    ]

    graph_elem = sg.Graph((880, 150), (0, 0), (600, 300), key='+GRAPH+')

    frame6 = [
        [graph_elem, sg.Stretch()],
    ]

    tab1 = sg.Tab('Graph Number 1', frame6)
    tab2 = sg.Tab('Graph Number 2', [[]])

    layout = [
        [sg.Menu(menu_def)],
        [
            sg.Image(data_base64=logo),
            sg.Frame('Input Text Group', frame1, title_color='red'),
            sg.Stretch()
        ],
        [
            sg.Frame('Multiple Choice Group', frame2, title_color='green'),
            sg.Frame('Binary Choice Group', frame3, title_color='purple'),
            sg.Frame('Variable Choice Group', frame4, title_color='blue'),
            sg.Stretch()
        ],
        [
            sg.Frame('Structured Data Group', frame5, title_color='red'),
        ],
        # [sg.Frame('Graphing Group', frame6)],
        [sg.TabGroup([[tab1, tab2]])],
        [
            sg.ProgressBar(max_value=600,
                           start_value=400,
                           size=(600, 25),
                           key='+PROGRESS+'),
            sg.Stretch(),
            sg.ButtonMenu('&Menu', ['Menu', ['&Pause Graph', 'Menu item']],
                          key='_MENU_'),
            sg.Button('Button'),
            sg.Button('Exit')
        ],
    ]

    window = sg.Window('Window Title',
                       font=('Helvetica', 13),
                       default_button_element_size=(100, 30),
                       auto_size_buttons=False,
                       default_element_size=(200,
                                             22)).Layout(layout).Finalize()
    graph_elem.DrawCircle((200, 200), 50, 'blue')
    i = 0
    graph_paused = False
    while True:  # Event Loop
        # sg.TimerStart()
        event, values = window.Read(timeout=0)
        if event is None or event == 'Exit':
            break
        if event == 'Button':
            print(event, values)
        if values['_MENU_'] == 'Pause Graph':
            graph_paused = not graph_paused
        if not graph_paused:
            i += 1

            if i >= 600:
                graph_elem.Move(-1, 0)
            graph_elem.DrawLine((i, 0), (i, randint(0, 300)),
                                width=1,
                                color='#{:06x}'.format(randint(0, 0xffffff)))
        window.FindElement('+PROGRESS+').UpdateBar(i % 600)

        # sg.TimerStop()
    window.Close()
Esempio n. 19
0
     sg.Multiline(size=(200, 75))
 ],
 [
     sg.Text('ListBox', size=(200, 35)),
     sg.Listbox(['Listbox 1', 'Listbox 2', 'Listbox 3'], size=(200, 85))
 ],
 [
     sg.Text('ComboBox / Dropdown', size=(200, 25)),
     sg.Combo([
         'Combo item 1',
     ], size=(200, 35))
 ], [sg.Text('Spinner', size=(200, 35)),
     sg.Spin([1, 2, 3], size=(40, 30))],
 [
     sg.Text('Checkbox', size=(200, 35)),
     sg.Checkbox('Checkbox', change_submits=True)
 ], [sg.Text('RadioButton', size=(200, 35)),
     sg.Radio('Radio Button', 1)],
 [sg.Text('Slider', size=(200, 35)),
  sg.Slider(orientation='h')],
 [sg.Text('Button', size=(200, 35)),
  sg.Button('Button')],
 [sg.Text('Table', size=(200, 35)),
  sg.Table([[0, 1, 3, 4]])],
 [
     sg.Text('Frame', size=(200, 35)),
     sg.Frame('Frame', [[sg.T('')], [sg.T('')]])
 ], [sg.Text('Stdout Output', size=(200, 35)),
     sg.Output(size=(200, 75))],
 [sg.Text('Dial', size=(200, 35)),
  sg.Dial(size=(150, 75)),
Esempio n. 20
0
                    [
                        sg.Frame(
                            'Data',
                            layout=[[
                                sg.Text('Cover data', size=(8, 1)),
                                sg.Input(key='http_cover'),
                                sg.FileBrowse()
                            ],
                                    [
                                        sg.Text('Secret data', size=(8, 1)),
                                        sg.Input(key='http_secret'),
                                        sg.FileBrowse()
                                    ],
                                    [
                                        sg.Checkbox('RSTEG',
                                                    key='rsteg',
                                                    enable_events=True),
                                        sg.Text('Retransmission probability'),
                                        sg.InputText(default_text='0.07',
                                                     enable_events=True,
                                                     key='rprob')
                                    ]],
                            visible=False,
                            key='post_details')
                    ]],
            visible=False,
            key='http_frame')
    ]

    # TCP Frame Layout
    tcp_frame = [
Esempio n. 21
0
    [sg.Spin((1, 10), size=(100, 22))],
    [sg.Spin((1, 10), size=(100, 22))],
]

layout = [
    [
        sg.Text('(Almost) All widgets in one Window!',
                justification='c',
                font=("Helvetica", 25),
                relief=sg.RELIEF_RIDGE)
    ], [sg.Text('Here is some text.... and a place to enter text')],
    [sg.InputText('This is my text', size=(400, 22))],
    [
        sg.Frame(
            layout=[[
                sg.Checkbox('Checkbox', size=(185, 22)),
                sg.Checkbox('My second checkbox!', default=True)
            ],
                    [
                        sg.Radio(
                            'My first Radio!',
                            "RADIO1",
                            default=True,
                            size=(180, 22),
                        ),
                        sg.Radio('My second Radio!', "RADIO1")
                    ],
                    [
                        sg.Radio(
                            'Third Radio!',
                            "RADIO2",
Esempio n. 22
0
def mainScreen():
    p.SetOptions(background_color='white', button_color=('white', '#4286f4'))
    layout = [
        [
            p.Image(data_base64=Images.logo,
                    background_color='white',
                    size=(450, 100),
                    click_submits=True,
                    key='_IMAGE_')
        ],
        [p.T('Required:', font=('Arial', 13, 'bold'), justification='center')],
        [p.T('▬' * 35, justification='center')],
        [
            p.T('Choose IPSW Filepath: ',
                font=('Arial', 10, 'italic'),
                justification='left')
        ],
        [
            p.Input('', key='_IPSW_'),
            p.FileBrowse(button_color=('white', '#4286f4'))
        ],
        [
            p.T('Choose Blobs Filepath: ',
                font=('Arial', 10, 'italic'),
                justification='left')
        ],
        [
            p.Input('', key='_BLOBS_'),
            p.FilesBrowse(button_color=('white', '#4286f4'))
        ],
        [
            p.T('Choose SEP Filepath: ',
                font=('Arial', 10, 'italic'),
                justification='left')
        ],
        [
            p.Input('', key='_SEP_'),
            p.FileBrowse(button_color=('white', '#4286f4'))
        ],
        [
            p.Checkbox(
                'Use Latest SEP \n(Do Not Set SEP Filepath If Using This!)',
                key='_LATESTSEP_')
        ],
        [
            p.T('Choose Baseband Filepath: ',
                font=('Arial', 10, 'italic'),
                justification='left')
        ],
        [
            p.Input('', key='_BASE_'),
            p.FileBrowse(button_color=('white', '#4286f4'))
        ],
        [
            p.Checkbox(
                'Use Latest Baseband \n(Do Not Set Baseband Filepath If Using This!)',
                key="_LATESTBASE_")
        ],
        [
            p.T('Optional: ',
                font=('Arial', 13, 'bold'),
                justification='center')
        ], [p.T('▬' * 35, justification='center')],
        [
            p.T('SEP Manifest: ',
                font=('Arial', 10, 'italic'),
                justification='left')
        ],
        [
            p.Input('', key='_SEPMANI_'),
            p.FileBrowse(button_color=('white', '#4286f4'))
        ],
        [
            p.T('Baseband Build Manifest: ',
                font=('Arial', 10, 'italic'),
                justification='left')
        ],
        [
            p.Input('', key='_BASEMANI_'),
            p.FileBrowse(button_color=('white', '#4286f4'))
        ],
        [
            p.T('Optional Flags:',
                justification='center',
                font=('Arial', 13, 'bold'))
        ], [p.T('▬' * 35, justification='center')],
        [
            p.Checkbox('Debug', key='_DEBUG_'),
            p.Checkbox('No Baseband', key='_NOBASEBAND_')
        ],
        [
            p.Checkbox('Update', key='_UPDATE_'),
            p.Checkbox('Wait', key="_WAIT_")
        ], [p.T('▬' * 35, justification='center')],
        [
            p.Button('Exit Recovery', size=(23, 1)),
            p.Button('Start', size=(23, 1))
        ], [p.Button('Exit', size=(23, 1)),
            p.Button('Donate', size=(23, 1))],
        [
            p.Button('Open TSSSaver', size=(23, 1)),
            p.Button('Open ipsw.me', size=(23, 1))
        ],
        [
            p.
            T('\nVersion: 1.0.6 | Licensed Under GNU GPLv3 | Click Here For GitHub',
              click_submits=True,
              key='_FOOTER_',
              font=('Arial', 8, 'italic'),
              justification='center')
        ]
    ]

    window = p.Window('EGTR',
                      no_titlebar=True,
                      keep_on_top=True,
                      grab_anywhere=True).Layout(layout)
    while True:
        event, values = window.Read()
        if event == 'Exit':
            window.Close()
            break
        elif event == 'Exit Recovery':
            if getTypeFutureRestore() == 1:
                futurerestore = getRealPath(DOWNLOAD_DIRECTORY +
                                            '/futurerestore')
            elif getTypeFutureRestore() == 2:
                futurerestore = getRealPath(DOWNLOAD_DIRECTORY +
                                            '/futurerestore.exe')
            os.system(futurerestore + '--exit-recovery')
            p.Window('Logs:',
                     no_titlebar=True,
                     keep_on_top=True,
                     grab_anywhere=True,
                     auto_close=True,
                     auto_close_duration=5).Layout(
                         [[p.T('Refer To The Terminal For Output ')]]).Read()
        elif event == 'Donate':
            webbrowser.open_new_tab('https://paypal.me/m4csdev')
        elif event == 'Open TSSSaver':
            webbrowser.open_new_tab('https://tsssaver.1conan.com/')
        elif event == 'Open ipsw.me':
            webbrowser.open_new_tab('https://ipsw.me')
        elif event == '_FOOTER_':
            webbrowser.open_new_tab(
                'https://github.com/M4cs/EGTR-Futurerestore')
        elif event == 'Start':
            if values['_LATESTSEP_'] == True:
                latestsep = ' --latest-sep'
                sep_path = ''
            elif values['_LATESTSEP_'] == False:
                latestsep = ''
            if values['_LATESTBASE_'] == True:
                latestbase = ' --latest-baseband'
                base_path = ''
            elif values['_LATESTBASE_'] == False:
                latestbase = ''
            if values['_IPSW_'] == '':
                p.Window('Error',
                         auto_close=True,
                         auto_close_duration=3,
                         keep_on_top=True,
                         no_titlebar=True,
                         grab_anywhere=True).Layout([[
                             p.T('Error: You must enter an IPSW! ')
                         ]]).Read()
            elif values['_IPSW_'] != '':
                ipsw_path = " " + getRealPath(values['_IPSW_'])
            if values['_SEP_'] == '':
                if values['_LATESTSEP_'] == True:
                    latestsep = '--latest-sep'
                    sep_path = ''
                elif values['_LATESTSEP_'] == False:
                    p.Window(
                        'Error',
                        auto_close=True,
                        auto_close_duration=3,
                        keep_on_top=True,
                        no_titlebar=True,
                        grab_anywhere=True
                    ).Layout([[
                        p.
                        T('Error: You must enter an SEP path or choose Use Latest! '
                          )
                    ]]).Read()
            elif values['_SEP_'] != '':
                if values['_LATESTSEP_'] == True:
                    sep_path = ''
                    latestsep = ' --latest-sep'
                elif values['_LATESTSEP_'] == False:
                    sep_path = ' -s ' + getRealPath(values['_SEP_'])
                    latestsep = ''
            if values['_BASE_'] == '':
                if values['_LATESTBASE_'] == True:
                    base_path = ''
                    latestbase = ' --latest-base'
                elif values['_LATESTBASE_'] == False:
                    p.Window(
                        'Error',
                        auto_close=True,
                        auto_close_duration=3,
                        keep_on_top=True,
                        no_titlebar=True,
                        grab_anywhere=True
                    ).Layout([[
                        p.
                        T('Error: You must enter an Base path or choose Use Latest! '
                          )
                    ]]).Read()
            elif values['_BASE_'] != '':
                if values['_LATESTBASE_'] == True:
                    base_path = ''
                    latestbase = ' --latest-base'
                elif values['_LATESTBASE_'] == False:
                    base_path = ' -b ' + getRealPath(values['_BASE_'])
                    latestbase = ''
            if values['_BLOBS_'] == '':
                p.Window('Error',
                         auto_close=True,
                         auto_close_duration=3,
                         keep_on_top=True,
                         no_titlebar=True,
                         grab_anywhere=True).Layout([[
                             p.T('Error: You must choose SHSH2 Blobs! ')
                         ]]).Read()
            elif values['_BLOBS_'] != '':
                blobs_path = ' -t' + getRealPath(values['_BLOBS_'])
            if values['_DEBUG_'] == True:
                debug = ' -d'
            elif values['_DEBUG_'] == False:
                debug = ''
            if values['_BASEMANI_'] == '':
                basemani = ''
            elif values['_BASEMANI_'] != '':
                basemani = ' -p' + values['_BASEMANI_']
            if values['_SEPMANI_'] == '':
                sepmani = ''
            elif values['_SEPMANI_'] != '':
                sepmani = ' -m ' + values['_SEPMANI_']
            if values['_NOBASEBAND_'] == True:
                nobaseband = ' --no-baseband'
                base_path = ''
                basemani = ''
            elif values['_NOBASEBAND_'] == False:
                nobaseband = ''
            if values['_UPDATE_'] == True:
                update = ' -u'
            elif values['_UPDATE_'] == False:
                update = ''
            if values['_WAIT_'] == True:
                wait = ' -w'
            elif values['_WAIT_'] == False:
                wait = ''
            if getTypeFutureRestore() == 1:
                futurerestore = getRealPath(DOWNLOAD_DIRECTORY +
                                            '/futurerestore')
            elif getTypeFutureRestore() == 2:
                futurerestore = getRealPath(DOWNLOAD_DIRECTORY +
                                            '/futurerestore.exe')
            query = futurerestore + blobs_path + base_path + sep_path + latestbase + latestsep + debug + basemani + sepmani + update + nobaseband + wait + ipsw_path
            print(query)
            outputscreen = p.Window(
                'Logs:',
                no_titlebar=True,
                keep_on_top=True,
                grab_anywhere=True
            ).Layout([[
                p.
                T('Are You Sure? You may risk bootlooping or bricking your device! '
                  )
            ], [p.Button('Cancel'), p.Button('Continue')]])
            while True:
                event, values = outputscreen.Read()
                if event == 'Continue':
                    p.Window('Logs:',
                             no_titlebar=True,
                             keep_on_top=True,
                             grab_anywhere=True,
                             auto_close=True,
                             auto_close_duration=5).Layout([[
                                 p.T('Refer To The Terminal For Output ')
                             ]]).Read()
                    outputscreen.Close()
                    os.system(query)
                    break
                elif event == 'Cancel':
                    outputscreen.Close()
                    break
    window.Close()
Esempio n. 23
0
 #  size=(8, 0.8), key='_ADDTYPE_', disabled=True),
 [
     sg.Input(key='_INPUT_', enable_events=True, background_color='white'),
     sg.FileBrowse(file_types=(("image", "*png"), ('img', "*jpg")),
                   initial_folder=None,
                   enable_events=True,
                   size=(7, 0.8))
 ],
 [
     sg.Button('Delete',
               size=(7, 1),
               disabled=True,
               key='_DELBUTTON_',
               button_color=('gray', 'gray')),
     sg.Checkbox('',
                 key='_LOCKDEL_',
                 enable_events=True,
                 background_color='Dark Grey'),
     #  sg.Text('', justification='left'),
     sg.Image(key='_IMAGE_',
              filename=empty_image,
              visible=True,
              pad=((0, 0), (0, 0))),
     sg.Image(key='_IMAGE2_',
              filename=empty_image,
              visible=True,
              pad=((0, 0), (0, 0))),
     #  sg.Image(key='_IMAGE3_', filename=empty_image, visible=True,
     #  pad=((0, 0), (0, 0))),
     #  sg.Text('', justification='right'),
     sg.Checkbox('skip',
                 key='_SKIPPROCESS_',
Esempio n. 24
0
                  key='confidence'),
        sg.T('  ', key='_CONF_OUT_')
    ],
    [
        sg.Text('Threshold'),
        sg.Slider(range=(0, 10),
                  orientation='h',
                  resolution=1,
                  default_value=3,
                  size=(15, 15),
                  key='threshold'),
        sg.T('  ', key='_THRESH_OUT_')
    ],
    [
        sg.Text(' ' * 8),
        sg.Checkbox('Write output video to disk', key='_DISK_')
    ],
    [sg.OK(size=(100, 30)), sg.Stretch()],
]

layout2 = [[
    sg.Text('Extract Audio from different sources',
            size=(50, 1),
            font=('Any', 18),
            text_color='#1c86ee',
            justification='left')
],
           [
               sg.Text('Path to input video'),
               sg.In(i_vid, size=(40, 1), key='inputSound'),
               sg.FileBrowse(size=(75, 30))