finplot 作为布局中的小部件

Posted

技术标签:

【中文标题】finplot 作为布局中的小部件【英文标题】:finplot as a widget in layout 【发布时间】:2021-01-12 09:15:15 【问题描述】:

我正在尝试将finplot、https://pypi.org/project/finplot/ 作为小部件添加到我的 UI 中的一个布局中。我为finplot 创建了一个小部件并将其添加到布局中的小部件中,但出现以下错误:

self.tab1.layout.addWidget(self.tab1.fplt_widget)
TypeError: addWidget(self, QWidget, stretch: int = 0, alignment: Union[Qt.Alignment, Qt.AlignmentFlag] = Qt.Alignment()): argument 1 has unexpected type 'PlotItem'

这是我使用的代码。

import sys
from PyQt5.QtWidgets import *
import finplot as fplt
import yfinance


# Creating the main window
class App(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = 'PyQt5 - QTabWidget'
        self.left = 0
        self.top = 0
        self.width = 600
        self.height = 400
        self.setWindowTitle(self.title)
        self.setGeometry(self.left, self.top, self.width, self.height)

        self.tab_widget = MyTabWidget(self)
        self.setCentralWidget(self.tab_widget)

        self.show()

    # Creating tab widgets


class MyTabWidget(QWidget):
    def __init__(self, parent):
        super(QWidget, self).__init__(parent)
        self.layout = QVBoxLayout(self)

        # Initialize tab screen
        self.tabs = QTabWidget()
        self.tabs.setTabPosition(QTabWidget.East)
        self.tabs.setMovable(True)

        self.tab1 = QWidget()

        self.tabs.resize(600, 400)

        # Add tabs
        self.tabs.addTab(self.tab1, "tab1")


        self.tab1.layout = QVBoxLayout(self)
        self.tab1.label = QLabel("AAPL")
        self.tab1.df = yfinance.download('AAPL')
        self.tab1.fplt_widget = fplt.create_plot_widget(self.window())
        fplt.candlestick_ochl(self.tab1.df[['Open', 'Close', 'High', 'Low']])
        self.tab1.layout.addWidget(self.tab1.label)
        self.tab1.layout.addWidget(self.tab1.fplt_widget)
        self.tab1.setLayout(self.tab1.layout)

        # Add tabs to widget
        self.layout.addWidget(self.tabs)
        self.setLayout(self.layout)


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

【问题讨论】:

【参考方案1】:

create_plot_widget()函数创建了一个不能添加到布局的PlotItem,解决方法是使用一些QWidget,可以将PlotItem的内容显示为PlotWidget

import pyqtgraph as pg

# ...

self.tab1.df = yfinance.download("AAPL")
self.tab1.fplt_widget = pg.PlotWidget(
    plotItem=fplt.create_plot_widget(self.window())
)
fplt.candlestick_ochl(self.tab1.df[["Open", "Close", "High", "Low"]])

【讨论】:

感谢您的快速回答。如何显示整个 x 轴?该图似乎只显示了前五个数据点。有数百个数据点。是否有任何参数可以传递以显示全部?【参考方案2】:

要添加小部件,请使用您创建的轴的小部件成员,如下所示:

self.tab1.layout.addWidget(self.tab1.fplt_widget.ax_widget)
self.window().axs = [self.tab1.fplt_widget] # required property of window

要让窗口在显示时正确缩放 X 轴,请在此处调用 show()

self.setCentralWidget(self.tab_widget)
fplt.show(qt_exec=False)
self.show()

【讨论】:

我日日夜夜地尝试找出如何处理您的杰出模块。我很高兴您创建了它,并且很高兴看到新版本和一些文档。总之,我可以说谢谢,伙计。你对这个问题的回答是正确的,但是当我用三个 finplot 小部件制作一个应用程序时,只有最后一个显示正确的十字准线和完整的图表,而其他的没有工作的十字准线,他们一开始也没有显示一个好的图表(只是几支蜡烛)。您可以在下图中看到它。我该如何解决? i.stack.imgur.com/PPipU.png @Seyfi 感谢您的客气话!当人们没有打电话给finplt.show(qt_exec=True),而是只调用了他们自己的Qt 节目时,我已经看到了这个问题。您是否尝试过我的第二个示例中的代码? 是的。我已经尝试将有问题的代码与您的全部答案结合起来,并在self.show() 之前致电fplt.show(qt_exec=False)。我可以缩小并查看完整的图表,但我想在第一个视图中看到一个好的图表。并且有十字准线问题(不工作的十字准线问题)。 此外,在我将上述问题与您的答案混合测试后,我根据该代码编写了自己的代码。 这不是正确的论坛,但我需要查看您的代码以了解发生了什么。最好的建议是删除一个接一个的东西以提取包含错误的最小的可重现代码。如果还是找不到错误,我去看看。

以上是关于finplot 作为布局中的小部件的主要内容,如果未能解决你的问题,请参考以下文章

如何切换网格布局中的小部件可见性?

如何将旧的小部件迁移到新的小部件

PyQt4 - 自定义小部件类结构?

将 headerView 添加到小部件上的小部件中的 listView 调整大小 android

我如何获得在内部布局中的小部件尺寸

如何访问作为 List 中的 Box 的小部件