在浏览了许多类变量和实例变量的帖子后,我不明白如何在类之间共享变量。
#!/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,但我遇到了两个问题。
AttributeError:类型对象“One”没有属性“mytext”
AttributeError:类型对象“One”没有属性“txt2”
我想与创建的所有其他类共享在任何特定类中创建的值(换句话说,在某种程度上是“全局”变量)。
Bryan Oakley 的 Tkinter 示例中的控制器概念(请参阅在 tkinter 中的两个框架之间切换?和如何从类中获取变量数据?)很接近,但如果有人可以回答或指出我解释的帖子这很简单,我将不胜感激。 谢谢您的帮助。
看来您还没有学习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 的基础知识,因为它要求您至少了解创建应用程序的基础知识。