Esempio n. 1
0
def janelareceita(
    NOME, RECEITA_IMAGEM, RECEITA_INGREDIENTES, RECEITA_CATEGORIAS, RECEITA_MODOPREPARO
):
    window.Disable()
    LAYOUT2 = [
        [sg.Stretch(), sg.Text(NOME, font=("SegoeUI bold", 24)), sg.Stretch()],
        [sg.HorizontalSeparator()],
        [
            sg.Column(
                [
                    [sg.Stretch(), sg.Image(data=RECEITA_IMAGEM), sg.Stretch()],
                    [sg.Text("Ingredientes:")],
                    [sg.Listbox(RECEITA_INGREDIENTES)],
                    [sg.Text("Categorias:")],
                    [sg.Listbox(RECEITA_CATEGORIAS)],
                ]
            ),
            sg.VerticalSeparator(),
            sg.Column(
                [[sg.Text("MODO DE PREPARO:")], [sg.Multiline(RECEITA_MODOPREPARO)]]
            ),
        ],
    ]
    window2 = sg.Window(
        "Livro de Receitas",
        layout=LAYOUT2,
        size=(1200, 600),
        keep_on_top=True,
    )
    while 1:
        event2, values2 = window2.read()
        if event2 == sg.WINDOW_CLOSED:
            break
        window2.close()
    window.Enable()
Esempio n. 2
0
def main():
    # Define theme for the GUI
    sg.theme('Light Grey 1')
    # Create a list of all of the accounts in the userdata file.
    account_names = userdata.get_names()
    # Define the icon in base64 format - this is the FontAwesome arrows-alt icon.
    # Create a column for the account list and the post GUI.
    acct_col = [[sg.Text('Select accounts to post to:')],
                [sg.Listbox(values=account_names, size=(20, 12))]]
    post_col = [[sg.Text('Subject/Content Warning (leave blank for none)')],
                [sg.Input(size=(50, 1))], [sg.Text("What's on your mind?")],
                [sg.Multiline(size=(50, 15))],
                [
                    sg.Text(justification='right',
                            key='-CHARS-',
                            margins=(10, 10, 10, 10)),
                    sg.Button("Post!", size=(10, 1))
                ]]
    # Combine both columns in one layout, and define the layout in the main window.
    layout = [[sg.Column(acct_col), sg.Column(post_col)]]
    window = sg.Window('Cross - A Mastodon/Hubzilla cross-poster',
                       layout,
                       icon=common.fa_arrows)

    # Start an loop that watches for window events and post length.
    while True:
        # This will update the post length counter every 20 milliseconds if I'm understanding correctly.
        # And, of course, will also do the event listening and monitor the values of the different items.
        event, values = window.read(timeout=20)
        if event in (None, 'Post!'):
            if event == 'Post!':
                # If we get here, the user pressed the post button.
                # Let's do a few sanity checks - first, let's make sure an account was selected to post to.
                if not values[0]:
                    # If we're here, no accounts were selected.
                    sg.popup_ok(
                        "You didn't select any accounts!\n"
                        "Try selecting an account before posting.\n",
                        title="Error making post",
                        icon=common.fa_arrows)
                # Next, let's make sure they actually wrote a post.
                elif values[2] == "":
                    # They didn't actually write a post. Error out and let them know why.
                    sg.popup_ok(
                        "You didn't actually write a post, silly!\n"
                        "Try writing one first.",
                        title="Error making post",
                        icon=common.fa_arrows)
                # We /should/ be good to continue at this point.
                else:
                    userdata.post_sel_accts(values[0], values[1], values[2])
                    # And once we get here, we're done! Print a thank-you message in the console, break, and exit.
                    print()
                    print("Done! Thank you for using Cross.")
            # We've either finished posting or the user closed the window. Either way, let's break.
            break
        # If we get here, we're not breaking or posting, so update the post length counter with
        # the combined length of the subject/content warning and the post.
        window['-CHARS-'].update(str(len(values[1]) + len(values[2])))
    window.close()
Esempio n. 3
0
def make_layout():
    layout = [
        [sg.Menu(make_menu(), key="-menu-")],
        [sg.Stretch(), sg.Text("Star Wars Dice Roller", font=FONT_HEADING), sg.Stretch()],
        [sg.HorizontalSeparator()]
    ]
    active = 0
    col_layout = [[],[]]
    for stat,val in character["stats"].items():
        col_layout[active].extend(make_stat_section(stat,val))
        if active == 0:
            active = 1
        else:
            active = 0
    layout.append([
        sg.Column(layout=col_layout[0]),
        sg.Column(layout=col_layout[1]),
        sg.Column(layout=[
            [sg.HorizontalSeparator(),],
            [
                sg.Stretch(),
                sg.Text(text="Action Modifiers", font=FONT_HEADING),
                sg.Stretch(),
            ],
            [
                sg.Text(text="Advantages",font=FONT_STAT),
                sg.Stretch(),
                sg.Slider(range=(0,5), default_value=0,orientation="h",size=(45, 10),key="adv",background_color="skyblue",enable_events=True),
                sg.Text(text="+",font=FONT_LOG),
                sg.Text(text="0", key="curr_adv",font=FONT_LOG),
                sg.Text(text="d",font=FONT_LOG),
            ],
            [
                sg.Text(text="Penalties",font=FONT_STAT),
                sg.Stretch(),
                sg.Slider(range=(0,5), default_value=0,orientation="h",size=(45, 10),key="pen",background_color="pink",enable_events=True),
                sg.Text(text="-",font=FONT_LOG),
                sg.Text(text="0", key="curr_pen",font=FONT_LOG),
                sg.Text(text="d",font=FONT_LOG),
            ],
            [sg.HorizontalSeparator(),],
            [sg.Text(text="Result", font=FONT_HEADING),sg.Stretch()],
            [sg.Text(text="Roll something!",key="-result-",font=FONT_RESULT,size_px=(650,100) , relief=sg.RELIEF_RIDGE)],
            [sg.HorizontalSeparator()],
            [sg.Text(text="Results Log", font=FONT_HEADING),sg.Stretch()],
            [sg.Text(text="",key="-resultlog-",font=FONT_LOG,relief=sg.RELIEF_SUNKEN)],
        ],size=(90,90)),
        sg.Column(layout=make_weapon_section(character["weapons"]))
    ])
    return layout
Esempio n. 4
0
 def first_menu(self):
     layout = [
         [g.T('Charlatano GUI Settings v1.1', font=('Arial', 15))],
         [g.T('Made by Max Bridgland', font=('Arial', 10))]
     ]
     count = 0
     col1 = []
     col2 = []
     for k, v in self.parser.current_settings.items():
         title = str(k[0].upper() + k[1:].lower().replace('_', ' '))
         if (count % 2) == 0:
             col1.append([
                 g.B(' ' + title + ' ', key=k)
             ])
             count += 1
         else:
             col2.append([
                 g.B(' ' + title + ' ', key=k)
             ])
             count += 1
     layout.append([
         g.Column(col1), g.Column(col2)
     ])
     layout.append([
         g.Button('Close'), g.Button('Restart Charlatano', key='__RESTART__'), g.Button('Start Charlatano', key='__START__')
     ])
     window = g.Window('Charlatano GUI Settings', no_titlebar=True, grab_anywhere=True, keep_on_top=True, layout=layout)
     charla = Runner()
     while True:
         event, values = window.Read()
         print(event)
         if event == 'Close':
             window.Close()
             exit()
         elif event == '__START__':
             if charla.running and charla.proc:
                 charla.killCharlatano()
                 window.FindElement('__START__').Update('Start Charlatano')
             else:
                 charla.runCharlatano()
                 window.FindElement('__START__').Update('Stop Charlatano')
         elif event == '__RESTART__':
             charla.restartCharlatano()
             if charla.running:
                 window.FindElement('__START__').Update('Stop Charlatano')
         else:
             window.Close()
             self.settings_gui(event)
Esempio n. 5
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. 6
0
def make_edit_layout():
    layout = [
        [sg.Menu(make_menu(), key="-menu-")],
        [sg.Stretch(), sg.Text("Star Wars Dice Roller", font=FONT_HEADING), sg.Stretch()],
        [sg.HorizontalSeparator()]
    ]
    active = 0
    col_layout = [[],[]]
    for stat,val in character["stats"].items():
        col_layout[active].extend(make_edit_stat_section(stat,val))
        if active == 0:
            active = 1
        else:
            active = 0
    layout.append([
        sg.Column(layout=col_layout[0]),
        sg.Column(layout=col_layout[1]),
        sg.Column(layout=make_edit_weapons_section(character["weapons"]))
    ])
    return layout
Esempio n. 7
0
def login_window():
    submitButton = [[
        sg.Button(button_text="Submit",
                  auto_size_button=True,
                  button_color=('#FFFFFF', '#483D8B'),
                  focus=True)
    ]]
    cancelButton = [[
        sg.Button(button_text="Cancel",
                  auto_size_button=True,
                  button_color=('#FFFFFF', '#483D8B'))
    ]]

    loginLayout = [
        [sg.Text('Tracker Interface - Login')],
        [sg.Text('Username')],
        [sg.InputText()],
        [sg.Text('Password')],
        [sg.InputText(password_char="*")],  # password_char hides text with *
        [sg.Column(submitButton),
         sg.Column(cancelButton)]
    ]

    # Names window as 'Tracker Interface - Login' and assigns its layout to loginLayout.
    window = sg.Window('Tracker Interface - Login',
                       icon="SEAL.jpg").Layout(loginLayout)

    # Reads button events and values entered, stores them in variables.
    event, values = window.Read()

    # If cancel button is pressed, the program is closed.
    if event == "Cancel":
        print("THIS SHOULD CLOSE")
        window.Close()
        driver.close()
        exit()
    elif event == "Submit":
        window.Close()
    # Store username and password variables for later use in login.

    return values
Esempio n. 8
0
    def settings_gui(self, setting):
        layout = [
            [g.T(setting[0].upper() + setting[1:], font=('Arial', 15))]
        ]
        count = 0
        col1 = []
        col2 = []
        col3 = []
        col4 = []
        for k, v in self.parser.current_settings[setting].items():
            if count == 0:
                col1.append([
                    g.T(str(k[0].upper() + k[1:].lower().replace('_', ' '))), g.Input(str(v.replace('\n', '')), key=k)
                ])
                count += 1
            elif count == 1:
                col2.append([
                    g.T(str(k[0].upper() + k[1:].lower().replace('_', ' '))), g.Input(str(v.replace('\n', '')), key=k)
                ])
                count += 1
            elif count == 2:
                col3.append([
                    g.T(str(k[0].upper() + k[1:].lower().replace('_', ' '))), g.Input(str(v.replace('\n', '')), key=k)
                ])
                count = 0
        layout.append([
            g.Column(col1), g.Column(col2), g.Column(col3)
        ])
        layout.append([
            g.Button('Back'), g.B('Save')
        ])
        window = g.Window(setting[0].upper() + setting[1:], no_titlebar=True, grab_anywhere=True, keep_on_top=True, layout=layout)
        while True:
            event, values = window.Read()
            if event == 'Back':
                window.Close()
                self.first_menu()
            if event == 'Save':
                self.parser.update_settings(setting, values)

# runCharlatano()
Esempio n. 9
0
def selectPlotPopup(listOptions):
    optionsColumn = lambda groupID: [[
        pygui.Radio(
            text=str(option), key=str(option) + str(groupID), group_id=groupID)
    ] for option in listOptions]
    xColumn = pygui.Column([[pygui.Text("x axis")]] + optionsColumn("x"),
                           size=(300, 300),
                           scrollable=True)
    yColumn = pygui.Column([[pygui.Text("y axis")]] + optionsColumn("y"),
                           size=(300, 300),
                           scrollable=True)
    plotWindow = pygui.Window(title="Select metrics to be plotted",
                              layout=[[xColumn, yColumn],
                                      [pygui.Button("Plot")]])

    #main loop
    while True:
        event, values = plotWindow.read()
        if (event == "Plot"):
            #get the keys
            xmetric = ""
            ymetric = ""
            for (key, value) in values.items():
                if value:
                    if key[-1] == "x":
                        xmetric = key[:-1]
                    else:
                        ymetric = key[:-1]

            #get the data
            xdata = []
            ydata = []
            for data in [(xdata := [], xmetric), (ydata := [], ymetric)]:
                for frame in dataLog:
                    data[0].append(frame[data[1]])

            #plot the data
            plt.plot(xdata, ydata)
            plt.xlabel(xmetric)
            plt.ylabel(ymetric)
            plt.show()
Esempio n. 10
0
 def GraphColumn(name, key):
     col = sg.Column([[
         Txt(name, key=key + '_TXT_'),
     ],
                      [
                          sg.Graph((GRAPH_WIDTH, GRAPH_HEIGHT), (0, 0),
                                   (GRAPH_WIDTH, 100),
                                   background_color='black',
                                   key=key + '_GRAPH_')
                      ]],
                     pad=(2, 2))
     return col
Esempio n. 11
0
def create_conf_window(parser):
    sg.theme(parser.get('gui_settings','theme'))

    def TextLabel(text): return sg.Text(text+':', justification='r', size=(25,1))
    
    layout = [
        [sg.Text('Choose Configuration', font = 'Any 20', justification='c')],
        [sg.Text('')],
        [TextLabel('Output Directory'), sg.Input(key='-OUTDIR-'), sg.FolderBrowse(target='-OUTDIR-')],
        [TextLabel('FASTQ Files Directory'), sg.Input(key='-FASTQ-'), sg.FolderBrowse(target='-FASTQ-')],
        [TextLabel('Spectra Files Directory'), sg.Input(key='-SPECTRA-'), sg.FolderBrowse(target='-SPECTRA-')],
        [sg.Text('')],
        [TextLabel('Trinity'), sg.Input(key='-TRINITY-'), sg.FileBrowse(target='-TRINITY-')],
        [TextLabel('hg19'), sg.Input(key='-HG19-'), sg.FileBrowse(target='-HG19-')],
        [TextLabel('SearchGUI'), sg.Input(key='-SEARCHGUI-'), sg.FileBrowse(target='-SEARCHGUI-')],
        [TextLabel('PeptideShaker'), sg.Input(key='-PEPTIDE-'), sg.FileBrowse(target='-PEPTIDE-')],
        [TextLabel('ACTG'), sg.Input(key='-ACTG-'), sg.FolderBrowse(target='-ACTG-')],
        [sg.Text('')],
        [TextLabel('Transcriptome GTF'), sg.Input(key='-GTF-'), sg.FolderBrowse(target='-GTF-')],
        [TextLabel('Reference genome'), sg.Input(key='-REF-'), sg.FolderBrowse(target='-REF-')],
        [TextLabel('Mapping Method'), sg.Combo(['PV','PS','VO','SO'],key='-MAP-')],
        [TextLabel('Protein Database'), sg.Input(key='-DB-'), sg.FileBrowse(target='-DB-')],
        [TextLabel('Serialization File'), sg.Input(key='-SER-'), sg.FileBrowse(target='-SER-')],
        [sg.Text('')],
        [TextLabel('Bamstats'), sg.Input(key='-BAMSTATS-'), sg.FileBrowse(target='-BAMSTATS-')],
        [TextLabel('BAM Files'), sg.Input(key='-BAM-'), sg.FolderBrowse(target='-BAM-')],
        [TextLabel('BED File'), sg.Input(key='-BED-'), sg.FileBrowse(target='-BED-')],
        [sg.Text('')],
        [TextLabel('DeNoPro Location'), sg.Input(key='-DENOPRO-'), sg.FolderBrowse(target='-DENOPRO-')],
        [sg.Text('')],
        [TextLabel('Theme'), sg.Combo(sg.theme_list(), size=(17, 0.8), key='-THEME-')],
        [sg.Text('')],
        [sg.Text('')],
        [sg.Button('Save'), 
            sg.InputText('', do_not_clear=False, visible=False, key='-filename-',enable_events=True),
            sg.FileSaveAs('Save As'),sg.Button('Exit')]
    ]

    window = sg.Window("Config", keep_on_top=True).Layout([[sg.Column(layout,size = (680,720),scrollable=True)]]).Finalize()

    for k,v in conf_keys.items():
        try:
            window[conf_keys[k][2]].update(value=parser.get(v[0],k))
        except Exception as e:
            print(f'Problem updating GUI window from config. Key = {k}')
    return window
Esempio n. 12
0
def Window():
    col_prop = [
        [
            sg.T(' k [W/(m·K)]', size=(10, 1)),
            sg.In('', size=(15, 1), justification='right', key='-k-'),
            sg.Button('Temperature Dependant', size=(18, 1), key='-loadk-'),
            sg.Button('📊', size=(4, 1), key='-plotk-')
        ],
    ]

    menu_def = [['File', ['Load', 'Save', 'Exit']], ['Help', ['About']]]

    layout = [[sg.Menu(menu_def)], [sg.Column(col_prop)]]
    window = sg.Window('Name!', layout)

    kparams = np.array([['', '']])

    while True:
        event, values = window.read()
        if event in (None, 'Exit'):
            break
        if event == '-loadk-':
            try:
                tpar = kWindow(kparams)
                if tpar is not None: kparams = tpar
            except:
                pass
        if event == '-plotk-':
            if kparams[0, 0] == '' and values['-k-'] == '':
                sg.PopupOK(
                    'You need to define the «Thermal Conductivity» first!',
                    title='Warning')
            elif values['-k-'] != '':
                plotk(float(values['-k-']))
            else:
                plotk(kparams)
    window.close()
Esempio n. 13
0
import PySimpleGUIQt as sg


layout_room_changer = sg.Column(key='room_changer', layout=[
    [sg.Button('Room 1', key='room_changer_1', button_color=('#212121', '#69F0AE')),
     sg.Button('Room 2', key='room_changer_2', button_color=('#ffffff', '#212121')),
     sg.Button('Room 3', key='room_changer_3', button_color=('#ffffff', '#212121')),
     ],
    [sg.Button('Room 5', key='room_changer_5', button_color=('#ffffff', '#212121')),
    [sg.Button('Room 8', key='room_changer_8', button_color=('#ffffff', '#212121')),
     ],
])
Esempio n. 14
0
                          border_width=0,
                          key='settings',
                          tooltip="Choose playlists to display below.")
            ],
            [
                sg.Listbox(values=[" "],
                           key="chosenplaylists",
                           font="ProximaNova 13",
                           size_px=(136, 90),
                           select_mode='single',
                           background_color="transparent",
                           text_color=sg.theme_text_color())
            ]]

overlay = [[
    sg.Column(playlist, element_justification="l"),
    sg.Column(header, element_justification="l")
],
           [
               sg.Button('',
                         image_data=notliked,
                         button_color=(sg.theme_background_color(),
                                       sg.theme_background_color()),
                         key='notliked',
                         pad=(20, 0),
                         tooltip="Add current song to liked songs"),
               sg.Button('',
                         image_data=liked,
                         button_color=(sg.theme_background_color(),
                                       sg.theme_background_color()),
                         key='liked',
Esempio n. 15
0
                  default_value=85)
    ],
    [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
    [
        sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'),
                   size=(200, 100),
                   select_mode=sg.LISTBOX_SELECT_MODE_EXTENDED),
        sg.Stretch(),
        sg.Frame('Labelled Group', [[
            sg.Slider(range=(1, 100),
                      orientation='v',
                      default_value=25,
                      tick_interval=25),
            sg.Slider(range=(1, 100), orientation='v', default_value=75),
            sg.Slider(range=(1, 100), orientation='v', default_value=10),
            sg.Column(column1, background_color='lightblue')
        ]],
                 background_color='black'),
        sg.Stretch()
    ], [sg.Text('_' * 50, justification='c')], [sg.Text('Choose A Folder')],
    [
        sg.Text('Your Folder'),
        sg.InputText('Default Folder', size=(300, 22)),
        sg.FolderBrowse(),
        sg.Stretch()
    ], [sg.Submit(tooltip='Click to submit this form', ),
        sg.Cancel()]
]

window = sg.Window('Everything bagel',
                   grab_anywhere=False,
Esempio n. 16
0
                  visible=False),
        sg.Button('Exit',
                  size=(20, 1.5),
                  pad=(20, 3),
                  key='ext',
                  font=("Helvetica", 14),
                  visible=False)
    ],
    [
        sg.Txt(descr,
               size=(36, 3),
               pad=(38, 4),
               font="Helvetica 12",
               key='desc')
    ],
    [sg.Column(recommendations_window, key='list', visible=False)],
    [
        sg.Button('Submit preferences',
                  font=("Helvetica", 14),
                  key='submit',
                  size=(40, 1.5),
                  pad=(60, 2),
                  visible=False)
    ],
    [sg.Column(col, key='COL', visible=False)],
]

window = sg.Window('Song Recommender',
                   resizable=True).Layout(layout).Finalize()
tx_keys = [
    'usr_tx', '_OUTPUT_', '_IN_', 'etr_btn', 'loc_tz', 'loca', 'time_tx',
Esempio n. 17
0
        sg.Button("Pesquisar", size=(10, 1), key="pesq_ingred"),
    ],
    [sg.Text("Resultados:")],
    [sg.Listbox([], enable_events=True, key="resultados")],
]
ABA1_COL2 = [
    [
        sg.Text("Listar todos os ingredientes:"),
        sg.Button("Listar", size=(10, 1), key="con_lista_ingredientes"),
        sg.Text("Listar todas as categorias:"),
        sg.Button("Listar", size=(10, 1), key="con_lista_cat"),
    ],
    [sg.Listbox([], key="con_ingredientes_listbox", enable_events=True),
     sg.Listbox([], key="con_cat_listbox", enable_events=True)],
]
ABA1_COLS = [[sg.Column(ABA1_COL1), sg.Column(ABA1_COL2)]]
ABA1 = sg.Tab(title="Consultar uma receita", layout=ABA1_COLS)
ABA2_COL1 = [
    [sg.Text("Nome:"), sg.Input(key="in_nome")],
    [
        sg.Text("Foto:  "),
        sg.Input(key="in_foto"),
        sg.FileBrowse(
            "Procurar",
            file_types=(("Imagem", "*.jpg;*.jpeg;*.png;*.JPG;*.JPEG;*.PNG"),),
            size=(10, 1),
        ),
    ],
    [sg.Text("Ingredientes separado por vírgula. Exemplo: cebola, alho, arroz...:")],
    [sg.Input(key="in_ingredientes")],
    [sg.Text("Categorias. Exemplo: assado, salgado, doce...:")],
Esempio n. 18
0
import PySimpleGUIQt as sg


layout_room_8 = sg.Column(key='room_8', visible=False, layout=[
    [sg.Button(key='room_8_light', button_color=('#212121', '#212121'), size_px=(400, 200))],
    [sg.Button('Turn On', key='room_8_turn_on', button_color=('#212121', '#69F0AE')),
     sg.Button('Turn Off', key='room_8_turn_off', button_color=('#212121', '#EF5350'))],
])
Esempio n. 19
0
    def gui(dark=False):
        if 'win' in sys.platform:
            titlebar = True
        else:
            titlebar = False
        if dark:
            background_color = "#262626"
            input_elements_background_color = "#262626"
            button_color = ('white', '#171717')
            text_color = "white"
            text_element_background_color = "#262626"
            input_text_color = "white"
        else:
            background_color = 'white'
            input_elements_background_color = '#474747'
            button_color = ('black', 'white')
            text_color = 'black'
            text_element_background_color = 'white'
            input_text_color = 'black'
        g.SetOptions(
            background_color=background_color,
            input_elements_background_color=input_elements_background_color,
            button_color=button_color,
            text_color=text_color,
            text_element_background_color=text_element_background_color,
            border_width=0,
            input_text_color=input_text_color,
            auto_size_buttons=True,
            auto_size_text=True)
        layout = [[g.T('EasyModels', font=('Arial', 15))],
                  [g.T('Please pick a category from below:')]]
        cat_json = Categories.get_all_categories()
        titles = []
        cat_to_id = {
            'Computer Vision': 'computer-vision',
            'Natural Language Processing': 'natural-language-processing',
            'Generative Models': 'generative-models',
            'Reinforcement Learning': 'reinforcement-learning',
            'Unsupervised Learning': 'unsupervised-learning',
            'Audio and Speech': 'audio-speech'
        }
        for k, v in cat_json.items():
            titles.append([v['title']])
        for title in titles:
            layout.append([g.Button(str(title[0]), key=cat_to_id[title[0]])])
        layout.append([g.Cancel('Close')])

        window = g.Window('EasyModels',
                          layout=layout,
                          keep_on_top=True,
                          grab_anywhere=True,
                          no_titlebar=titlebar)

        while True:
            event, values = window.Read()
            print(event)
            if event == 'Close':
                exit()
            else:
                category_info = Categories.get_category_info(event)
                new_layout = [[g.T('Available Projects', font=('Arial', 15))]]
                col1, col2 = GUI.category_to_layout(category_info)
                new_layout.append([g.Column(col2), g.Column(col1)])
                new_layout.append([g.Cancel('Close')])
                new_window = g.Window('Projects',
                                      layout=new_layout,
                                      keep_on_top=True,
                                      grab_anywhere=True,
                                      no_titlebar=titlebar)
                while True:
                    event1, values1 = new_window.Read()
                    if event1 == 'Close':
                        new_window.Close()
                        break
                    else:
                        open_new_tab(event1)
Esempio n. 20
0
            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))
           ],
           [
               sg.Text('Path to output sound tracks'),
               sg.In(o_sound, size=(40, 1), key='outputSound'),
               sg.FileSaveAs(size=(75, 30))
           ], [sg.Button('Extract Sound', size=(100, 30))]]

layout = [[
    sg.Column(layout1, key='-COLYOLO-'),
    sg.Column(layout2, visible=False, key='-COLSound-')
],
          [
              sg.Frame(layout=[
                  [
                      sg.Button('YOLO', size=(50, 30)),
                      sg.Button('Sound', size=(60, 30)),
                      sg.Button('YOLO Saved Frames', size=(200, 30)),
                      sg.Button('Exit', size=(50, 30))
                  ],
              ],
                       title='Options',
                       title_color='red',
                       relief=sg.RELIEF_SUNKEN)
          ]]
Esempio n. 21
0
def displayImages():
    sg.ChangeLookAndFeel('LightGrey')

    folder = sg.popup_get_folder('Image folder to open', title='Choose Folder', default_path='')

    img_types = (".png", ".jpg", "jpeg", ".tiff", ".bmp")

    flist0 = os.listdir(folder)

    fnames = [f for f in flist0 if os.path.isfile(
        os.path.join(folder, f)) and f.lower().endswith(img_types)]

    num_files = len(fnames)                

    del flist0 

    def get_img_data(f, maxsize=(1200, 850), first=False):
        img = Image.open(f)
        img.thumbnail(maxsize)
        if first:                     
            bio = io.BytesIO()
            img.save(bio, format="PNG")
            del img
            return bio.getvalue()
        return ImageTk.PhotoImage(img)

    filename = os.path.join(folder, fnames[0])  
    image_elem = sg.Image(data=get_img_data(filename, first=True))
    filename_display_elem = sg.Text(filename, size=(80, 3))
    file_num_display_elem = sg.Text('File 1 of {}'.format(num_files), size=(15, 1))

    col = [[filename_display_elem],
        [image_elem]]

    col_files = [[sg.Text('List of images')],
                [sg.Listbox(values=fnames, change_submits=True, size=(60, 10), key='listbox')],
                [sg.Button('Next', size=(8, 1)), sg.Button('Prev', size=(8, 1)), file_num_display_elem],
                [sg.Button('Enhance Resolution', size=(16, 1))],
                [sg.Button('Exit', size=(8, 1))]]

    layoutSavedImages = [[sg.Column(col_files), sg.Column(col)]]

    window = sg.Window('Image Browser', layoutSavedImages, return_keyboard_events=True,
                    location=(0, 0), use_default_focus=False)


    i = 0
    im = 0
    while True:
        event, values = window.read()
        print(event, values)

        if event == sg.WIN_CLOSED or event == 'Exit':
            raise SystemExit()
        elif event in ('Next', 'MouseWheel:Down', 'Down:40', 'Next:34'):
            i += 1
            if i >= num_files:
                i -= num_files
            filename = os.path.join(folder, fnames[i])
        elif event in ('Prev', 'MouseWheel:Up', 'Up:38', 'Prior:33'):
            i -= 1
            if i < 0:
                i = num_files + i
            filename = os.path.join(folder, fnames[i])
        elif event == 'listbox':            
            f = values["listbox"][0]            
            filename = os.path.join(folder, f)  
            i = fnames.index(f)  
        elif event == 'Enhance Resolution':
            filename = os.path.join(folder, fnames[i])
            super_res(filename, im)
            im += 1
            print(filename)
        else:
            filename = os.path.join(folder, fnames[i])

        image_elem.update(data=get_img_data(filename, first=True))
        filename_display_elem.update(filename)
        file_num_display_elem.update('File {} of {}'.format(i+1, num_files))

    window.close()
Esempio n. 22
0
          ],
          [
              sg.Button('Detailed Info'),
              sg.Button('Delete Rows'),
              sg.Button('Disappear'),
              sg.Button('Reappear')
          ],
          [
              sg.Button('Show Sliders'),
              sg.Button('Show Buttons'),
              sg.Button('Hide Sliders'),
              sg.Button('Hide Buttons'),
              sg.Button('Exit')
          ],
          [
              sg.Column(col, key='COL', visible=False),
              sg.Column(col2, key='COL2', visible=False)
          ]]

window = sg.Window('Window Title', resizable=True).Layout(layout).Finalize()

window.Element('SLIDER').Update(visible=False)
window.Element('SLIDER').Update(visible=False)
window.Refresh()
window.Refresh()

window.Size = window.Size

num_buttons = 2
while True:  # Event Loop
    event, values = window.Read()
Esempio n. 23
0
def mainScreen():
    p.SetOptions(background_color='white', button_color=('white', '#4286f4'))
    col1 = [[
        p.T('Choose IPSW Filepath: ',
            font=('Arial', 10, 'italic'),
            justification='left')
    ],
            [
                p.Input('', key='_IPSW_'),
                p.FileBrowse(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', key='_LATESTSEP_')],
            [
                p.T('Optional: SEP Manifest: ',
                    font=('Arial', 10, 'italic'),
                    justification='left')
            ],
            [
                p.Input('', key='_SEPMANI_'),
                p.FileBrowse(button_color=('white', '#4286f4'))
            ]]
    col2 = [[
        p.T('Choose Blobs Filepath: ',
            font=('Arial', 10, 'italic'),
            justification='left')
    ],
            [
                p.Input('', key='_BLOBS_'),
                p.FilesBrowse(button_color=('white', '#4286f4'))
            ],
            [
                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', key="_LATESTBASE_")],
            [
                p.T('Optional: Baseband Build Manifest: ',
                    font=('Arial', 10, 'italic'),
                    justification='left')
            ],
            [
                p.Input('', key='_BASEMANI_'),
                p.FileBrowse(button_color=('white', '#4286f4'))
            ], [p.Checkbox('No Baseband', key='_NOBASEBAND_')]]
    layout = [[
        p.Image(data_base64=Images.logo,
                background_color='white',
                size=(450, 100),
                click_submits=True,
                key='_IMAGE_')
    ], [p.Column(col1), p.VerticalSeparator(),
        p.Column(col2)], [p.T('Optional Flags: ', justification='center')],
              [
                  p.Checkbox('Debug', key='_DEBUG_'),
                  p.Checkbox('Update', key='_UPDATE_'),
                  p.Checkbox('Wait', key="_WAIT_")
              ], [p.Button('Exit'), p.Button('Start')], [p.Button('Donate')]]

    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 == 'Donate':
            webbrowser.open_new_tab('https://paypal.me/m4csdev')
        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()
                    os.system(query)
                    break
                elif event == 'Cancel':
                    outputscreen.Close()
                    break
    window.Close()
Esempio n. 24
0
def main():
    # set program theme
    theme_name = 'DarkPurple4'
    sg.theme(theme_name)

    os.system('color')

    # define default values for UI
    default_size_text = (30, 1)
    default_size_input = (50, 1)
    default_size_input_with_button = ((30, 1), (15, 1))

    # define file handeling modes for song duplicates
    dupli_mode = {
        'radio_move': 'Move when in other list',
        'radio_copy': 'Copy when in other list',
        'radio_download': 'Download again'
    }

    # create progress bars and their labels
    progresses = [(sg.Text(f'ProgBar {key}: None',
                           key=f'-{key}_text',
                           visible=False),
                   sg.ProgressBar(100,
                                  key=f'-{key}_progressbar',
                                  visible=False)) for key in range(1, 51)]
    # make layout
    layout = [[
        sg.Text('Username: '******'', key='username_input', enable_events=True),
        sg.Button('Check', key='username_button')
    ],
              [
                  sg.Text('Anime Music Dir: '),
                  sg.Input(ml.library_dir,
                           key='dir_input',
                           disabled=True,
                           enable_events=True),
                  sg.FolderBrowse(initial_folder=ml.get_default_dir(),
                                  key='dir_browse')
              ],
              [
                  sg.Radio(dupli_mode[key],
                           group_id='dupli',
                           key=key,
                           enable_events=True)
                  for i, key in enumerate(dupli_mode)
              ],
              [
                  sg.Text('Thread count: '),
                  sg.Combo(list(range(1, 51)),
                           default_value=1,
                           key='thread_count_combo',
                           enable_events=True)
              ],
              [
                  sg.Column(progresses,
                            scrollable=True,
                            key='progresses_column',
                            size=(700, 200))
              ], [sg.Button('Download', key='download_button')],
              [sg.Button('', visible=False, key='--PROGRESS_UPDATE--')]]

    to_disable = [
        'download_button', 'username_input', 'username_button', 'dir_input',
        'dir_browse', 'radio_move', 'radio_copy', 'radio_download'
    ]

    # make window
    window = sg.Window("MalMuzic", layout, finalize=True, resizable=False)

    # for x in range(50):
    #     progresses[x][1].UpdateBar(50)

    # set default values to UI
    layout[2][0].update(value=True)

    # set more variables
    input_default_color = sg.LOOK_AND_FEEL_TABLE[theme_name]['INPUT']
    run_thread_running = False
    run_thread: Tuple[Event, Thread] = None  # type: ignore
    to_close = False

    # helper function for main
    def check_username():
        print(f'[I] Looking for mal user "{values["username_input"]}"')
        exists = mm.user_exists(values["username_input"])
        print('[I] Username exists'
              if exists else '[I] Username doesn\'t exists')
        if not exists:
            window['username_input'].update(background_color='#FF7777')
        else:
            window['username_input'].update(
                background_color=input_default_color)
        return exists

    def get_dupli_mode():
        for i, key in enumerate(dupli_mode):
            if window[key].get():
                return i

    # UI loop
    while not to_close:
        event, values = window.read()  # type: ignore
        if event == sg.WIN_CLOSED or event is None:
            to_close = True
            if run_thread is not None:
                run_thread[0].set()
            continue
        # print('[I]', event, values[event] if event in values else '')
        if event == 'username_button':
            check_username()
        if event == 'download_button':
            if not run_thread_running:
                print('[I] Checking username')
                if not check_username():
                    continue

                ml.library_dir = values['dir_input']

                window['download_button'](
                    text=window['download_button'].ButtonText + ' Disabled')
                for dis in to_disable:
                    window[dis](disabled=True)

                run_thread = run(window,
                                 values["username_input"],
                                 progresses,
                                 window['progresses_column'],
                                 dir=ml.library_dir,
                                 thread_count=values['thread_count_combo'])
            else:
                cprint('[E] Download already running', 'red')

        if event == 'thread_count_combo':
            print(f'[I] User choose {values[event]} threads to run async')
        if event in dupli_mode:
            print(f'[I] User choose: "{dupli_mode[event]}"')
        if event == '--PROGRESS_UPDATE--':
            # progresses[values[event][0]][1].UpdateBar(values[event][2])
            for i in range(len(st.threads)):
                if st.threads[i] is not None:
                    if hasattr(st.threads[i][1], 'percent'):
                        progresses[i][1].UpdateBar(st.threads[i][1].percent)
                        progresses[i][0].update(
                            value=st.threads[i][1].request + ': ' +
                            str(st.threads[i][1].total_kb) + 'kB, ' +
                            str(round(st.threads[i][1].rate, 1)) + 'kB/s')

    if run_thread is not None:
        print('[I] Download thread still running, joining with it.')
        run_thread[1].join()

    window.close()
    print('[!] Exiting program')
Esempio n. 25
0
],
          [
              sg.InputText(basePath,
                           key='_REF_DIR_',
                           size=(50, 0.75),
                           font=("Helvetica", 12)),
              sg.FolderBrowse(initial_folder=basePath, font=("Helvetica", 16))
          ], [sg.ReadFormButton('Change Directory', font=("Helvetica", 18))]]

leftColumn = [[file_listbox_elem],
              [
                  sg.ReadFormButton('Read selected image',
                                    font=("Helvetica", 18))
              ]]

layout = [[sg.Column(topRow)], [sg.Column(leftColumn), sg.Column(rightColumn)]]

button, values = imageBrowser.Layout(
    layout).Read()  # Shows imageBrowser on screen

i = 0
keepGoing = True
filename = img_fileNames[0]  # initialize to first file

while keepGoing:
    if verbose: print('top')

    # Check for GUI buttons
    if button is None:
        if verbose: print("None\n")
        break  # do nothing; keep going
Esempio n. 26
0
 def weather_frame(self):
     layout = [[Qt.Column('Weather for ')]]
Esempio n. 27
0

prototext = resource_path("colorization_deploy_v2.prototxt")
caffemodel = resource_path("colorization_release_v2.caffemodel")
npyfile = resource_path("pts_in_hull.npy")


sg.ChangeLookAndFeel('Reddit')
sg.set_options(button_color=("0079d3", "0079d3"), button_element_size=(10, 1), text_justification="center")

col1 = [[sg.T("IMAGEM:", size=(44, 1)), sg.I(size=(0, 0), visible=False, key="img", enable_events=True), sg.FileBrowse("SELECIONAR", file_types=(("Imagem", "*.png; *.jpg; *.jpeg"),), target="img")],
        [sg.Image(filename=resource_path("placeholder.png"), key="img_display")]]
col2 = [[sg.T('RESULTADO:', size=(44, 1)), sg.I(size=(0, 0), visible=False, key="savefile", enable_events=True), sg.B("COLORIR", key="processar")],
        [sg.Image(filename=resource_path("placeholder.png"), key="img_display2", )]]

tab1_layout = [[sg.Column(col1), sg.Column(col2)],
               [sg.Exit(key="EXIT"), sg.FileSaveAs("SALVAR", file_types=(("Imagem", "*.jpg"),), target='savefile', key="savefilebrowse", disabled=True, button_color=("black","grey"))]]

tab2_layout = [[sg.T('PASTA:'), sg.I(key="pasta", size=(98,1)), sg.FolderBrowse()],
               [sg.B("COLORIR")],
               [sg.Exit(key="Exit")]]

layout = [[sg.T("\t\t\t\t\tCOLORIZADOR DE FOTOS EM PRETO E BRANCO", font=("Arial 12 bold"))],
          [sg.TabGroup([[sg.Tab('COLORIR ARQUIVO ÚNICO', tab1_layout), sg.Tab('COLORIR LOTE', tab2_layout)]])]]

window = sg.Window('Monografia do vértice genérica', layout, size=(1000, 700), auto_size_text=True, auto_size_buttons=False, resizable=False)

FileIMG = None

while True:
    event, values = window.read()
Esempio n. 28
0
                  default_value=85)
    ],
    [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
    [
        sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'),
                   size=(200, 100),
                   select_mode=sg.LISTBOX_SELECT_MODE_SINGLE),
        sg.Stretch(),
        sg.Frame('Labelled Group', [[
            sg.Slider(range=(1, 100),
                      orientation='v',
                      default_value=25,
                      tick_interval=25),
            sg.Slider(range=(1, 100), orientation='v', default_value=75),
            sg.Slider(range=(1, 100), orientation='v', default_value=10),
            sg.Column(column1, background_color='red')
        ]]),
        sg.Stretch()
    ], [sg.Text('_' * 50, justification='c')], [sg.Text('Choose A Folder')],
    [
        sg.Text('Your Folder'),
        sg.InputText('Default Folder', size=(300, 22)),
        sg.FolderBrowse(),
        sg.Stretch()
    ], [sg.Submit(tooltip='Click to submit this form', ),
        sg.Cancel()]
]

window = sg.Window('Everything bagel',
                   grab_anywhere=False,
                   font=('Helvetica', 12),
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. 30
0
def mainScreen():
    if os.path.exists(CONF_PATH) == True:
        config = ConfigParser()
        config.read(CONF_PATH)
        model = config['DEVICE']['model']
        ecid = config['DEVICE']['ecid']
        boardconfig = config['DEVICE']['boardconfig']
        config_loaded = True
    else:
        model = 'None - Enter Device Identifier'
        ecid = 'None - Enter ECID'
        config_loaded = False
        boardconfig = 'None - Enter Boardconfig'
    version = '1.0.1~beta'
    col1 = [[p.T('Enter Device Identifier:', justification='center')],
            [p.Input(model, do_not_clear=True, key='_ID_')]]
    col2 = [[p.T('Enter Board Config:', justification='center')],
            [p.Input(boardconfig, do_not_clear=True, key='_BOARDCONF_')]]
    logo = [[
        p.Image(data_base64=Images.logo, click_submits=True, key='_LOGO_')
    ]]
    title = [[
        p.T('Sushi | GUI Wrapper for TSSChecker',
            font=('Corbel', 15),
            text_color='#ffffff',
            justification='left')
    ], [p.T('Sushi Version: ' + version, font=('Corbel', 10))],
             [
                 p.T('Developed by @maxbridgland',
                     click_submits=True,
                     key='_TWITTER_')
             ], [p.T('Licensed Under GNU GPLv3 | Made with Python')]]
    layout = [[p.Column(logo), p.Column(title)], [p.HorizontalSeparator()],
              [p.T('Enter ECID:', justification='center')],
              [p.Input(ecid, do_not_clear=True, key='_ECID_', focus=True)],
              [p.Column(col1),
               p.VerticalSeparator(),
               p.Column(col2)],
              [
                  p.T('iOS Version To Save:', justification='center'),
                  p.Input('12.1.1',
                          size=(10, 1),
                          justification='center',
                          key='_VER_'),
                  p.Check('Save Latest Firmware', key='_LATEST_')
              ], [p.HorizontalSeparator()],
              [
                  p.Image(data_base64=Images.close_b,
                          click_submits=True,
                          key='Close'),
                  p.Image(data_base64=Images.status_b,
                          click_submits=True,
                          key='Status'),
                  p.Image(data_base64=Images.help_b,
                          click_submits=True,
                          key='Help'),
                  p.Image(data_base64=Images.start_b,
                          click_submits=True,
                          key='Start')
              ]]
    window = p.Window('Sushi',
                      no_titlebar=True,
                      keep_on_top=True,
                      grab_anywhere=True).Layout(layout)
    while True:
        event, values = window.Read()
        if event == 'Close':
            exit()
            break
        elif event == 'Help':
            helpMenu()
        elif event == 'Status':
            statusMenu()
        elif event == 'Start':
            devId = values['_ID_']
            boardconfig = values['_BOARDCONF_']
            ecid = values['_ECID_']
            if values['_LATEST_'] == True:
                latest = '-l'
                version = ''
            elif values['_LATEST_'] == False:
                latest = ''
                version = values['_VER_']
            finishedPopup(devId, ecid, boardconfig, version, latest)
            if os.path.exists(CONF_PATH) == False:
                configMenu(ecid, devId, boardconfig)
        elif event == '_LOGO_':
            webbrowser.open_new_tab('https://github.com/M4cs/Sushi')
        elif event == '_TWITTER_':
            webbrowser.open_new_tab('https://twitter.com/maxbridgland')