在 Python 中共享类变量

问题描述 投票:0回答:1

在浏览了许多类变量和实例变量的帖子后,我不明白如何在类之间共享变量。

#!/usr/bin/python3
from PyQt5.QtWidgets import (QApplication)
import sys
class One():
    def __init__(self, myTextString, parent=None):
        self.mytext = myTextString
        self.printtxt()
        Main.txt = 'another string'
        self.txt2 = 'a third string'
    def printtxt(self):
        print('One',self.mytext)

class Two():
    def __init__(self, parent=None):
        self.printtxt()

    def printtxt(self):
       print('Two',One.txt) # Attribute Error
       print('Two',One.txt2) # Attribute Error

class Main():
    def __init__(self, parent = None):
       self.txt = 'a string of text'
       self.w = One(self.txt)
       self.w1 = Two()
       print(self.txt) # not changed by One

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

在上面的代码中,Main 类启动了类一和类二。虽然我可以将 self.txt 的值发送到启动的类 One,但我遇到了两个问题。

  1. 当我尝试在 Two 类的 printtxt 中打印 One 的变量时,出现属性错误:

AttributeError:类型对象“One”没有属性“mytext”

AttributeError:类型对象“One”没有属性“txt2”

  1. 当我尝试更改 One 中 Main 的 txt 变量时,它没有更改

我想与创建的所有其他类共享在任何特定类中创建的值(换句话说,在某种程度上是“全局”变量)。

Bryan Oakley 的 Tkinter 示例中的控制器概念(请参阅在 tkinter 中的两个框架之间切换?如何从类中获取变量数据?)很接近,但如果有人可以回答或指出我解释的帖子这很简单,我将不胜感激。 谢谢您的帮助。

python class variables pyqt instance
1个回答
0
投票

看来您还没有学习Python的基础知识,在开始使用pyqt之前,我建议您在开始使用pyqt创建应用程序之前通过视频教程学习Python的基础知识。

首先你应该知道,Python 中你不应该让每个类都导入每个类,因为这会产生循环错误,而是你想要一个控制数据流的主类( main.py 类)。

如果您想更改第一类中的 self.txt 并且它更改了主类中的 self.txt 那么您必须返回该值。请记住,这只是 python,还有其他方法可以使用 PyQt 信号更新值,但我目前不会担心它,因为它主要是在 GUI 和非 GUI 元素之间进行通信。不要尝试访问类一而拥有类二,而是让主类控制数据并将数据发送到类二,(您也可以发送该类的实例来访问整个类及其变量) .

这样它只发送来自第一类的 self.txt1 和 self.txt2:

#!/usr/bin/python3
from PyQt5.QtWidgets import QApplication
import sys
class One():
    def __init__(self, parent=None):
        self.txt1 = "Hello World"
        self.txt2 = "Hello World2"

    def change_text(self, text):
        self.txt = text
        self.txt = 'changed text'
        print('One: ',self.txt)

        return self.txt

class Two():
    def __init__(self, text1, text2, parent=None):
        print('Two: ',text1) 
        print('Two: ',text2) 


class Main():
    def __init__(self, parent = None):
       self.txt = 'a string of text'
       self.w = One()
       self.w1 = Two(self.w.txt1, self.w.txt2)
       self.txt = self.w.change_text(self.txt)
       print("Main: ", self.txt) 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

如果你想发送整个类,然后查找特定变量:

#!/usr/bin/python3
from PyQt5.QtWidgets import QApplication
import sys
class One():
    def __init__(self):
        self.txt1 = "Hello World"
        self.txt2 = "Hello World2"

    def change_text(self, text):
        self.txt = text
        self.txt = 'changed text'
        print('One: ',self.txt)

        return self.txt

class Two():
    def __init__(self, class_one):
        print('Two: ',class_one.txt1) 
        print('Two: ',class_one.txt2) 


class Main():
    def __init__(self):
       self.txt = 'a string of text'
       self.w = One()
       self.w1 = Two(self.w)
       self.txt = self.w.change_text(self.txt)
       print("Main: ", self.txt) 

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Main()
    sys.exit(app.exec_())

正如我在一开始所说的那样,我建议您在进入 PyQt 之前先学习 Python 的基础知识,因为它要求您至少了解创建应用程序的基础知识。

© www.soinside.com 2019 - 2024. All rights reserved.