Python和PySide:从另一个文件调用函数时变量值重置

Posted

技术标签:

【中文标题】Python和PySide:从另一个文件调用函数时变量值重置【英文标题】:Python and PySide: Variable values reset when calling functions from another file 【发布时间】:2015-12-04 15:59:24 【问题描述】:

我一直在编写这个 python 脚本,它基本上通过 reddit 链接和你设置的特定变量设置你的 Windows 壁纸背景,比如来自 hot/top all time/etc 的链接。我正在为它编写一个带有 PySide 的 GUI,目前我有 3 个文件。

QtDesigner output_ui.py生成的ui文件

另一个与生成的ui文件交互的文件output.py

以及运行所有内容并设置壁纸的脚本WallDit.py

当我运行 output.py 文件时,在 GUI 中设置值一切正常,值设置正常,但是当我单击开始按钮并且脚本执行 (WallDit.py) 并从输出调用函数时.py 变量值被重置为默认值(即我设置为“壁纸”,它被设置回默认的“壁纸+壁纸”)。

例如,当我从第一个文件调用此函数时,subreddit 行文本值被设置回默认值,而不是实际显示在 GUI 上的值:

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 行,信号被发送并输出正确的值,当从第一个文件调用函数时,问题就开始了。

更新:如果我在任何地方调用该函数,该值仍会重置为默认值

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

【问题讨论】:

【参考方案1】:

WallDit.py 中,您初始化了五个新窗口。这意味着您有五个新的文本框。为了解决您的问题,您需要使用一个实例,即您在output.py 中创建的实例。例如,您可以删除WallDit.py 中的main(),使set_wallpaper 和其他函数接受window 参数,然后执行以下操作:

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

(将import 行移到文件顶部,因为WallDit 现在不会在导入时执行任何操作,最好将所有导入保留在那里)

编辑:当然,您需要传递 window 并使用它而不是 MainWindow()

【讨论】:

以上是关于Python和PySide:从另一个文件调用函数时变量值重置的主要内容,如果未能解决你的问题,请参考以下文章

python如何调用ui文件

使用重载的 PySide 信号调用 Python 函数而不传递参数

Python/pyside,pyqt(pyside,pyqt optional): 控制文本选择的函数

python - kivy:从另一个类调用函数

如何将 python 函数从另一个文件导入 django 视图

如何传递要在 Pyside2 中调用的函数?