Python и PySide: значения переменных сбрасываются при вызове функций из другого файла

Я писал этот скрипт на Python, который в основном устанавливает фон для обоев Windows с помощью ссылок Reddit и определенных переменных, которые вы устанавливаете, таких как ссылки из горячих / лучших за все время / и т. д. и я пишу графический интерфейс с PySide для него, в настоящее время у меня есть 3 файла.

  • Файл пользовательского интерфейса, сгенерированный QtDesigner output_ui.py

  • Другой файл, взаимодействующий со сгенерированным файлом пользовательского интерфейса output.py.

  • И скрипт, который все запускает и устанавливает обои WallDit.py

Когда я запускаю файл output.py, устанавливаю значения внутри графического интерфейса, все работает правильно, значения устанавливаются нормально, но когда я нажимаю кнопку запуска, и скрипт выполняется (WallDit.py) и вызывает функции из output.py значения переменных сбрасываются до значений по умолчанию (т.е. я устанавливаю «Обои», он возвращается к значению по умолчанию «Обои + Обои»).

Например, когда я вызываю эту функцию из 1-го файла, текстовое значение строки субреддита возвращается к значению по умолчанию, а не к тому, которое фактически отображается в графическом интерфейсе:

def handle_subreddit_line(self):
    print("subreddit line in output.py: " + self.subreddit_line.text())
    return self.subreddit_line.text()

Вызов кода функции:

def get_subreddit_name():
    test = MainWindow()
    print("test: " + test.handle_subreddit_line())
    subreddit = MainWindow().handle_subreddit_line()
    return subreddit

Примечание. Когда я меняю значения, скажем, в строке subreddit_name, сигнал отправляется и выводится правильное значение, проблема начинается, когда функция вызывается из 1-го файла.

Обновление: если я вызову функцию в любом месте, значение по-прежнему сбрасывается до значения по умолчанию.

def handle_start_btn(self):
    if self.start_btn.isDown:
        print("Button pressed")
    print("inside function: " + MainWindow().handle_subreddit_line())
    import WallDit

person The Dude    schedule 04.12.2015    source источник


Ответы (1)


В WallDit.py вы инициализируете ПЯТЬ новых окон. Это означает, что у вас есть пять новых текстовых полей. Чтобы решить вашу проблему, вам нужно использовать один экземпляр, который вы создали в output.py. Например, вы можете удалить main() в WallDit.py, заставить set_wallpaper и другие функции принимать аргумент window и сделать что-то вроде этого:

def handle_start_btn(self):
    WallDit.set_wallpaper(self)

(переместите строку import в начало файла, так как WallDit теперь ничего не будет выполнять при импорте, и рекомендуется хранить все импорты там)

редактировать: конечно, вам нужно обойти window и использовать его вместо MainWindow().

person Chris Warrick    schedule 04.12.2015