用PyQ中的信号在类之间传递数据

2024-03-02 19:34:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个不同的类,我需要使用一个信号将变量中的文本从一个类发送到另一个类。在

第一个类是Matplotlib图形。我在导航工具栏中添加了一个QPushButton,用QLineEdit来访问QDialog(这是另一个类)。我需要使用一个变量将QLineEdit中写的文本发送到Matplotlib图的类,这样我就可以在图中创建注释了。在

以下是目前为止的代码:

class Dialog(QDialog):

  list_of_notes = []         #I create a list to add text, each time i open the QDialog

  def __init__(self):
    #A lot of stuff in here

  def printVariable(self, text):
    Dialog.lisf_of_notes.append(text)
    MatplotlibFigure().addNote()

    self.close()

class MatplotlibFigure(QMainWindow):
  def __init__(self):
    #A lot of stuff in here

   self.axes = self.figure_canvas.figure.add_subplot(111)

  def addNote(self):
   for i,s in enumerate(Dialog.list_of_notes):
     note = self.axes.annotate(i, xy=(0.2, 0.2))  #This is the note i want to create
     note.draggable()
     self.figure_canvas.draw_idle()

所以,当我按下QDialog中的“Accept”按钮时,我可以看到文本被添加到列表中,每次我打开对话框。但是,当我想从我添加到列表的最后一个对象创建注释时,在for循环中什么也不会发生。在

有什么问题吗?希望你能帮助我。在

----------------编辑-----------------------------

我做了一些修改。我创建了一个信号mysignal,以发出变量text,其中包含我在QDialog中编写的文本。在

这是修改后的代码:

^{pr2}$

所以,我打开QDialog就可以写下文本了。它被正确地添加到列表中,但是注释仍然没有在图中绘制。在


Tags: oftextin文本self列表信号matplotlib
1条回答
网友
1楼 · 发布于 2024-03-02 19:34:01

问题是代码行

MatplotlibFigure().addNote()

这一行实例化MatplotlibFigure类的一个新的实例,并调用addNote方法。但您不希望每次打开对话框时都创建一个新的图形,而是希望将注释添加到一个(大概)预先存在的MatplotlibFigure实例中。在

因为您没有显示创建QDialog的代码,所以很难建议选项,但是可以将对现有MatplotlibFigure的引用传递到QDialog的构造函数中。例如

^{pr2}$

在创建Dialog的地方修改代码,以传递对图的引用。例如my_dialog = Dialog(reference_to_my_figure)

我还想指出,在class属性中存储注释列表并不是一个特别好的编码实践。我认为您甚至不需要存储注释列表,除非您打算重用它们(每次添加新注释时,您当前的代码都会再次添加以前添加的所有注释)。类似这样的方法应该可以正常工作(如果您真的想这样做,我已经在列表中包含了可选的存储)

class Dialog(QDialog): 

  def __init__(self, my_figure):
      self.my_figure = my_figure
      ...

  def printVariable(self, text):
      self.my_figure.addNote(text)

      self.close()


class MatplotlibFigure(QMainWindow):
  def __init__(self):
      #A lot of stuff in here
      self.notes_list = []
      self.axes = self.figure_canvas.figure.add_subplot(111)

  def addNote(self, text):
      #optional
      self.notes_list.append(text)

      # now add the note to the figure
      note = self.axes.annotate(text, xy=(0.2, 0.2))  #This is the note i want to create
      note.draggable()
      self.figure_canvas.draw_idle()

但请注意,您的所有注释都将指向图(0.2,0.2)上的同一位置(我假设您将在后面的代码中修复此问题)。在

我还想推荐你做一些关于面向对象编程的Python教程,特别是关于类与实例(或对象)、类属性与实例属性以及如何设计可重用类的内容。看起来你的一些问题是因为你没有完全理解这些概念。在

相关问题 更多 >