【问题标题】:Getting variables from another python file. No attribute error从另一个 python 文件中获取变量。无属性错误
【发布时间】:2018-07-16 00:08:29
【问题描述】:

我正在尝试为我的 Python 项目设置一个变量文件。 我有一个运行良好的函数:

def resize_window(self):
    size_object = QDesktopWidget().screenGeometry(-1)  # active screen
    screen_width = size_object.width()
    screen_height = size_object.height()

但是,当我尝试将其设置在单独的文件中以进行调用时,出现错误。

AttributeError: type object 'ScreenSize' 没有属性 'screen_width'

这是我的单独文件的外观:

class ScreenSize(object):
def __init__(self, screen_width, screen_height):
    self.screen_width = screen_width
    self.screen_height = screen_height
    self.resize_window()

def resize_window(self):
    size_object = QDesktopWidget().screenGeometry(-1)  # active screen
    screen_width = size_object.width()
    screen_height = size_object.height()

电话:

self.frame_top.setMinimumSize(QtCore.QSize(3/4* ScreenSize.screen_width, 1/10*ScreenSize.screen_height))
    self.frame_top.setMaximumSize(QtCore.QSize(3/4*ScreenSize.screen_width, 1/10*ScreenSize.screen_height))

错误是:AttributeError: type object 'ScreenSize' has no attribute 'screen_width'

如果我只用这个设置课程:

class ScreenSize(object):
screen_width = 500
screen_height = 300

它有效。所以我的问题是从类中调用该函数。 提前感谢您的帮助。

【问题讨论】:

  • 缩进看起来不正确,令人困惑。
  • 一个类与该类的实例不同。您在实例self 上设置属性,所以ScreenSize 类当然没有它们。那就是您做错了,但是问题中没有足够的信息来告诉您如何正确地做。您实际上不必为了分隔文件而将内容放入类中。
  • 尝试使用self.screen_width。将self. 用于class 的所有变量。

标签: python function class attributes pyqt5


【解决方案1】:

当你将你的类声明为

class ScreenSize(object):
    screen_width = 500
    screen_height = 300

变量属于类而不是类的实例。从这个意义上说,在这个类中包含函数等同于根本不将变量或函数包装在一个类中,因为 Python 中的脚本本质上只是一个类。

如果你想创建你的设置类的实例,你需要在你的类中声明的函数调用中使用self,然后创建该类的一个实例来检索值而不是类本身:

class ScreenSize(object):
    def __init__(self, screen_width, screen_height):
        self.screen_width = screen_width
        self.screen_height = screen_height
        self.resize_window()

    def resize_window(self):
        size_object = QDesktopWidget().screenGeometry(-1)  # active screen
        self.screen_width = size_object.width()
        self.screen_height = size_object.height()

screen_size = ScreenSize()

查看Python Classes 了解有关如何实现类的更多信息。

此外,正如 @gilch 在 cmets 中所指出的,如果您只想要它们的一个实例,则这些值不需要在一个类中:

# settings.py
screen_width = 500
screen_height = 300

def resize_window(self):
    size_object = QDesktopWidget().screenGeometry(-1)  # active screen
    screen_width = size_object.width()
    screen_height = size_object.height()

假设 settings.py 与 main 位于同一目录中:

#  main.py
import settings

print(settings.screen_width)
settings.resize_window()

【讨论】:

  • 感谢您的建议。我真的很喜欢 settings.py 的方法。它完全实现了我所追求的。但是,当我运行它时,它返回 500 的 screen_width (初始设置),但我期望从 size_object 检索到的实际屏幕宽度在 1000 左右。我错过了什么?
  • 嗨,如果您对这个答案感到满意,您能否将其标记为这样以结束此问题。谢谢!
【解决方案2】:

根据建议,我通过创建单独的 .py 文件来实现它

def screen_width(self):
   size_object = PyQt5.QtWidgets.QDesktopWidget().screenGeometry(-1)  # active screen
   scr_width = size_object.width()
   return scr_width

感谢您为我指明正确的方向。

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 2011-07-06
    • 2023-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    相关资源
    最近更新 更多