HartX
@HartX
Студент, красавчик, плохой программист=)

Как менять окна в PySimleGui в зависимости от того что выбрано в sg.Combo?

Мне нужно создать графический интерфейс для программы которая переводит моды для игры. У переводчика есть несколько режимов и переменные на ввод тоже разные. Я хочу чтобы интерфейс менялся в зависимости от выбранного в sg.Combo. Я написал такой код:
(Класс с layout- ами)
list_commands = [COMMANDS.ADDITIONAL_ENGLISH, COMMANDS.ADDITIONAL_RUSSIAN, COMMANDS.TRANSFER_FILE,
                 COMMANDS.ALL_TRANSLATE_DIRECTRY, COMMANDS.TRANSLATE_FILE, COMMANDS.ALL_TRANSFER_DIRECTORY,
                 COMMANDS.STREAMLINE_FILE, COMMANDS.STREAMLINE_DIRECTORY, COMMANDS.SEARCH_UPDATE_STRING_FILE,
                 COMMANDS.SEARCH_UNTRANS_STRING_FILE]

class INTERFACE:
    ADD_FILE_ENG = [[sg.Combo(values=list_commands, key='MODE', default_value=COMMANDS.ADDITIONAL_ENGLISH, size=(85, 1), enable_events=True)],
        [sg.Text('Оригинальный файл:', size=(20, 1))],
        [sg.InputText(key='GENERAL_PATH', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Text('Ваш файл:', size=(20, 1))],
        [sg.InputText(key='ADDITIONAL_FILE', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Button(button_text='Выполнить')]]

    ADD_FILE_RU = [[sg.Combo(values=list_commands, key='MODE', default_value=COMMANDS.ADDITIONAL_RUSSIAN, size=(85, 1), enable_events=True)],
        [sg.Text('Оригинальный файл:', size=(20, 1))],
        [sg.InputText(key='GENERAL_PATH', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Text('Ваш файл:', size=(20, 1))],
        [sg.InputText(key='ADDITIONAL_FILE', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Button(button_text='Выполнить')]]

Смена интерфейсов
def change_interfase(self, mode):
        if mode == COMMANDS.ADDITIONAL_ENGLISH:
            window = sg.Window('LTA (localization translator assistant)', INTERFACE.ADD_FILE_ENG)
        elif mode == COMMANDS.ADDITIONAL_RUSSIAN:
            window = sg.Window('LTA (localization translator assistant)', INTERFACE.ADD_FILE_RU)

Функция которая задаёт начальный интерфейс
def get_default_interface(self):
        return sg.Window('LTA (localization translator assistant)', INTERFACE.DEFAULT, size=(700, 100))

Само переключение окон
interface = work_with_interface.get_default_interface()

while True:
    try:
        event, values = interface.read()
        #print(event, values) #debug
        if event in (None, 'Exit', 'Cancel'):
            break
        elif event =='MODE':
            interface.Close()
            interface = work_with_interface.change_interfase(values['MODE'])

Этот код работает до тех пор, пока я не выберу в sg.Combo один и тот же вариант. Тогда код ломается и выкидывает следующую ошибку:
612ba0e108aec537520143.png
Подскажите пожалуйста как это исправить?
P.S. если вам нужно больше кода, то весь проект на гите https://github.com/HartExaVersion2/FileMerger и, по идее, оно должно запускаться из коробки
  • Вопрос задан
  • 87 просмотров
Решения вопроса 1
HartX
@HartX Автор вопроса
Студент, красавчик, плохой программист=)
Дело было в том что я инициализировал ayout-ы один раз, а нужно для каждого нового переключения на режим в ComboBox. Для этого INTERFACE был переделан так:
class Interfaces:
    def get_add_file_eng(self):
        return [[sg.Combo(values=list_commands, key='MODE', default_value=COMMANDS.ADDITIONAL_ENGLISH, size=(85, 1), enable_events=True)],
        [sg.Text('Оригинальный файл:', size=(20, 1))],
        [sg.InputText(key='GENERAL_PATH', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Text('Ваш файл:', size=(20, 1))],
        [sg.InputText(key='ADDITIONAL_FILE', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Button(button_text='Выполнить')]]

    def get_add_file_ru(self):
        return [[sg.Combo(values=list_commands, key='MODE', default_value=COMMANDS.ADDITIONAL_RUSSIAN, size=(85, 1), enable_events=True)],
        [sg.Text('Оригинальный файл:', size=(20, 1))],
        [sg.InputText(key='GENERAL_PATH', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Text('Ваш файл:', size=(20, 1))],
        [sg.InputText(key='ADDITIONAL_FILE', size=(55, 1)), sg.FileBrowse(size=(10, 1), button_text='Обзор'), ],
        [sg.Button(button_text='Выполнить')]]

И потом просто переделал их вызовы
Мне это подсказали на stackoverflow: https://stackoverflow.com/questions/68990845/how-d...
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы