wxPython 最好的实时绘图小部件是什么?

2024-02-06

我想使用 Python 和 wxPython 显示一个包含一条或两条曲线、每秒最多 50 个样本的实时图表。 该小部件应支持 Win32 和 Linux 平台。

欢迎任何提示。

编辑添加:

我不需要以 50 fps 更新显示,但需要在两条曲线上显示最多 50 个数据样本,并具有合理的显示更新率(5..10 fps 应该没问题)。

编辑添加:

我在一个项目中使用了 mathplotlib,并取得了良好的成功。 然后我为其他项目选择了 wx.lib.plot,我发现它更简单,但更容易使用并且消耗更少的 CPU 周期。由于 wx.lib 作为标准 wxPython 发行版的一部分,因此特别易于使用。


如果您希望以最少的代码占用获得高性能,那么 Python 的内置绘图库 tkinter 就是最好的选择。无需编写特殊的 C/C++ 代码或使用大型绘图包即可获得比 50 fps 更好的性能。

以下代码在 2.2 GHz Core 2 duo 上以 400 fps 的速度滚动 1000x200 带状图,在 3.4 GHz Core i3 上以 1000 fps 的速度滚动。中心例程“scrollstrip”在右边缘绘制一组数据点和相应的颜色以及可选的垂直网格条,然后将带状图向左滚动 1。要绘制水平网格条,只需将它们包含在数据和颜色中数组作为常量以及变量数据点。

from tkinter import *
import math, random, threading, time

class StripChart:

    def __init__(self, root):
        self.gf = self.makeGraph(root)
        self.cf = self.makeControls(root)
        self.gf.pack()
        self.cf.pack()
        self.Reset()

    def makeGraph(self, frame):
        self.sw = 1000
        self.h = 200
        self.top = 2
        gf = Canvas(frame, width=self.sw, height=self.h+10,
                    bg="#002", bd=0, highlightthickness=0)
        gf.p = PhotoImage(width=2*self.sw, height=self.h)
        self.item = gf.create_image(0, self.top, image=gf.p, anchor=NW)
        return(gf)

    def makeControls(self, frame):
        cf = Frame(frame, borderwidth=1, relief="raised")
        Button(cf, text="Run", command=self.Run).grid(column=2, row=2)
        Button(cf, text="Stop", command=self.Stop).grid(column=4, row=2)
        Button(cf, text="Reset", command=self.Reset).grid(column=6, row=2)
        self.fps = Label(cf, text="0 fps")
        self.fps.grid(column=2, row=4, columnspan=5)
        return(cf)

    def Run(self):
        self.go = 1
        for t in threading.enumerate():
            if t.name == "_gen_":
                print("already running")
                return
        threading.Thread(target=self.do_start, name="_gen_").start()

    def Stop(self):
        self.go = 0
        for t in threading.enumerate():
            if t.name == "_gen_":
                t.join()

    def Reset(self):
        self.Stop()
        self.clearstrip(self.gf.p, '#345')

    def do_start(self):
        t = 0
        y2 = 0
        tx = time.time()
        while self.go:
            y1 = 0.2*math.sin(0.02*math.pi*t)
            y2 = 0.9*y2 + 0.1*(random.random()-0.5)
            self.scrollstrip(self.gf.p,
               (0.25+y1,   0.25, 0.7+y2,   0.6,     0.7,   0.8),
               ( '#ff4', '#f40', '#4af', '#080', '#0f0', '#080'),
                 "" if t % 65 else "#088")

            t += 1
            if not t % 100:
                tx2 = time.time()
                self.fps.config(text='%d fps' % int(100/(tx2 - tx)))
                tx = tx2
#            time.sleep(0.001)

    def clearstrip(self, p, color):  # Fill strip with background color
        self.bg = color              # save background color for scroll
        self.data = None             # clear previous data
        self.x = 0
        p.tk.call(p, 'put', color, '-to', 0, 0, p['width'], p['height'])

    def scrollstrip(self, p, data, colors, bar=""):   # Scroll the strip, add new data
        self.x = (self.x + 1) % self.sw               # x = double buffer position
        bg = bar if bar else self.bg
        p.tk.call(p, 'put', bg, '-to', self.x, 0,
                  self.x+1, self.h)
        p.tk.call(p, 'put', bg, '-to', self.x+self.sw, 0,
                  self.x+self.sw+1, self.h)
        self.gf.coords(self.item, -1-self.x, self.top)  # scroll to just-written column
        if not self.data:
            self.data = data
        for d in range(len(data)):
            y0 = int((self.h-1) * (1.0-self.data[d]))   # plot all the data points
            y1 = int((self.h-1) * (1.0-data[d]))
            ya, yb = sorted((y0, y1))
            for y in range(ya, yb+1):                   # connect the dots
                p.put(colors[d], (self.x,y))
                p.put(colors[d], (self.x+self.sw,y))
        self.data = data            # save for next call

def main():
    root = Tk()
    root.title("StripChart")
    app = StripChart(root)
    root.mainloop()

main()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wxPython 最好的实时绘图小部件是什么? 的相关文章

  • 从框架中获取可调用对象

    给定框架对象 由sys getframe http docs python org library sys html sys getframe 例如 我可以获得底层的可调用对象吗 代码解释 def foo frame sys getfram
  • MacOS Big Sur 中的 NPM 错误“找不到 Python 可执行文件”

    我已经花了整整一周的时间寻找这个问题的答案 但没有成功 我查看了每个 StackOverflow 帖子 Google 的每一篇文章以及我能找到的每个相关的 Github 问题 大多数相关错误似乎都比较旧 所以我想知道我的问题是否由于我使用的
  • TemplateSyntaxError:“settings_tags”不是有效的标签库

    当我尝试运行此测试用例时 出现此错误 这是在我的 django 应用程序的tests py 中编写的 def test accounts register self self url http royalflag com pk accoun
  • 如何使用 Pycharm 运行 fast-api 服务器?

    我有一个简单的 API 函数 如下所示 from fastapi import FastAPI app FastAPI app get async def read root return Hello World 我正在使用启动服务器uvi
  • 在Python中,如何通过去掉括号和大括号来打印Json

    我想以一种很好的方式打印 Json 我想去掉方括号 引号和大括号 只使用缩进和行尾来显示 json 的结构 例如 如果我有一个像这样的 Json A A1 1 A2 2 B B1 B11 B111 1 B112 2 B12 B121 1
  • Python MySQLdb:connection.close() VS。光标.close()

    如果我使用MySQLdb通过Python连接到MySQL Server 我创建一个connection and a cursor像这样 connection MySQLdb connect cursor connection cursor
  • pandas DataFrame 中行的高效成对比较

    我目前正在处理一个较小的数据集 大约 900 万行 不幸的是 大多数条目都是字符串 即使强制类别 框架在内存中也只有几 GB 我想做的是将每一行与其他行进行比较 并对内容进行直接比较 例如 给定 A B C D 0 cat blue old
  • Python正则表达式替换引号中的文本(引号本身除外)

    例如 我有一个测试字符串 content I opened my mouth Good morning I said cheerfully 我想使用正则表达式删除双语音标记之间的文本 但不删除语音标记本身 所以它会返回 I opened m
  • 如何使用 Python 在表单中选择选项?

    我想知道如何以格式如下的形式选择选项 td align left td
  • Flask 和 Reactjs 抛出 JSX 转换错误

    我已经开始将 ReactJS 与 Python Flask 后端结合使用 通过 Flask 渲染模板时 我在 Chrome 控制台中收到以下客户端错误 错误 找不到模块 jstransform visitors es6 templates
  • Python 模块 BeautifulSoup 提取锚点 href

    我正在使用 BeautifulSoup 模块通过以下方式从 html 选择所有 href def extract links html soup BeautifulSoup html anchors soup findAll a print
  • 在 Python 中引发异常的正确方法是什么? [复制]

    这个问题在这里已经有答案了 这是简单的代码 import sys class EmptyArgs StandardError pass if name main The first way to raise an exception if
  • 在添加数据之前使用 Python gdata 清除工作表中的行

    我有一个 Google 电子表格 我使用 python 脚本和 gdata 库填充值 如果我多次运行脚本 它会将新行附加到工作表中 我希望脚本在填充之前首先清除行中的所有数据 这样每次运行时我都会有一组新的数据脚本 我尝试过使用 Updat
  • 使用张量流导出神经网络的权重

    我使用张量流工具编写了神经网络 一切正常 现在我想导出神经网络的最终权重以制定单一的预测方法 我怎样才能做到这一点 您需要在训练结束时使用以下命令保存模型tf train Saver https www tensorflow org ver
  • python 中“重载”函数的最佳方法? [复制]

    这个问题在这里已经有答案了 我正在尝试在 python 中做这样的事情 def foo x y do something at position x y def foo pos foo pos x pos y 所以我想根据我提供的参数数量调
  • 将整数转换为特定格式的十六进制字符串

    我是 python 新手 有以下问题 我需要将整数转换为 6 个字节的十六进制字符串 例如 281473900746245 gt xFF xFF xBF xDE x16 x05 十六进制字符串的格式很重要 int 值的长度是可变的 格式 0
  • 如何使用 Matplotlib 可视化标量二维数据?

    所以我有一个网格网格 矩阵 X 和 Y 以及标量数据 矩阵 Z 我需要将其可视化 最好是一些 2D 图像 在各点处带有颜色 显示 Z 值 我做了一些研究 但没有找到任何能完全满足我想要的效果的东西 pyplot imshow Z 看起来不错
  • Docker Python 脚本找不到文件

    我已经成功构建了一个 Docker 容器 并将应用程序的文件复制到 Dockerfile 中的容器中 但是 我正在尝试执行引用输入文件 在 Docker 构建期间复制到容器中 的 Python 脚本 我似乎无法弄清楚为什么我的脚本告诉我它无
  • Python 中的可逆 STFT 和 ISTFT

    有没有通用的形式短时傅立叶变换 https en wikipedia org wiki Short time Fourier transform与内置于 SciPy 或 NumPy 或其他什么中的相应逆变换 这是pyplotspecgram
  • Python 子进程:无法转义引号

    我知道以前曾问过类似的问题 但它们似乎都是通过重新设计参数的传递方式 即使用列表等 来解决的 但是 我这里有一个问题 因为我没有这个选项 有一个特定的命令行程序 我使用的是 Bash shell 我必须向其传递带引号的字符串 它不能不被引用

随机推荐

  • 解析 tcl 中的文本文件并创建键值对字典,其中值采用列表格式

    如何分离以下文本文件并仅保留相应的所需数据 例如文本文件的格式 Name Roll number Subject Experiment name Marks Result Joy 23 Science Exp related to magn
  • 在 Delphi 中使用 WinHTTP 重定向后有没有办法获取最终 URL?

    我可以使用下面的代码轻松地从 URL 获取 HTML 源代码 但是如何获取实际的 URL 本身呢 因为有时初始 URL 会经历一些重定向 而实际 URL 并不相同 我想捕获它以供使用 我似乎找不到任何关于 Delphi 中 winHTTP
  • 使用不同的顺序按多个键排序[重复]

    这个问题在这里已经有答案了 可能的重复 如何编写 Python 降序排序键函数 https stackoverflow com questions 11206884 how to write python sort key function
  • 如何一次性停止 R 中所有(多)执行的代码/命令行?

    假设我们运行多行R代码 我们怎样才能停止all行代码在进行中 Example If the following 3 lines of code are copy pasted into the R console in RStudio an
  • ie7 没有加载我的样式表

    我有一个适用于 Firefox 和 Chrome 的页面 在 IE7 中 我遇到了一个相当有趣的行为 样式表不加载 但是 如果我按 CTRL F5 就会出现这种情况 至少可以说这是非常烦人的 有人遇到过这个问题吗 有什么建议吗 仅供参考 该
  • 如何在 Meteor 中保证动态订阅的安全?

    这个问题建立在上一个问题的基础上 参见here https stackoverflow com questions 16252077 how to deal with dynamic subscriptions in meteor 动态订阅
  • 如何在基于ionic的App中获取设备的uuid和型号信息?

    我有这段代码是为了识别 获取设备信息 ionic Platform ready function will execute when device is ready or immediately if the device is alrea
  • 删除字符串中的空格

    我想删除后面的空白 n 例如 username 123 n ugas 423 n peter 23 n asd234会成为username 123 nugas 423 npeter 23 nasd234 我假设您想删除一个或多个空白字符 每
  • 如何在 Rust 中存储对结构的 void* 引用?

    我正在与一些使用标准的 C 回调进行交互void userdata方法允许您存储对某些上下文 例如结构 的引用 如何在 a 中存储对 Rust 结构的引用void 并且仍然允许它四处移动 看起来 Rust 的动作确实是动作 即这段代码失败了
  • 在 os X 10.7 Lion 上设置 Django 的最佳方法是什么?

    我正在 os X 10 7 上通过原始安装和 Xcode 4 3 设置 Python 和 Django 我尝试使用Python的默认安装 Library Frameworks Python framework Versions 2 7 li
  • 如何通过多态优雅地转换 switch+enum

    我正在尝试用类型类替换简单的枚举 也就是说 从每种类型的基派生一个类 例如 而不是 enum E BASE EB ALPHA EB BRAVO E BASE message someMessage switch message case E
  • Python Discord 机器人 - 协程从未被等待

    我正在开发一个 Discord 机器人 它在某种程度上可以工作 但每隔几分钟就会崩溃 它给了我一个错误 比如 任务已销毁但正在等待处理 我发现了我必须摆脱我的信息response request get url 并将其替换为async wi
  • 检查 C 编译器是否工作...不

    我最近卸载了 Xcode 4 2 并重新安装了 Xcode 4 3 1 已安装Command Line Tools还 错误提示 C 编译器不起作用 搜了一下这个错误 说是未安装Xcode时发生的 我缺少什么 rvm install 1 9
  • 如何将 ZonedDateTime 转换为日期?

    我正在尝试在我的数据库中设置一个与服务器无关的日期时间 我相信这样做的最佳实践是设置 UTC 日期时间 我的数据库服务器是 Cassandra Java 的数据库驱动程序仅理解日期类型 因此 假设在我的代码中我现在使用新的 Java 8 Z
  • iwlist() 命令如何扫描无线网络?

    我想知道 iwlist 命令如何在 Linux 中扫描可用的无线网络 我阅读了它的源代码 发现有一个 ioctl 调用 使用 SIOCSIWSCAN 来触发扫描 并使用 SIOCGIWSCAN 来获取扫描结果 但是这些系统调用如何捕获和分析
  • 在 JBoss 中使用多重登录模块

    我是身份验证和安全领域的新手 我正在尝试扩展我的应用程序的身份验证机制 该机制当前提供传统的用户名 密码身份验证 以提供用户通过 LDAP 服务器进行身份验证 在当前的实现中 应用程序使用j 安全检查来自服务器 API 的线程对用户进行身份
  • _CDSnapshot_[entityName]_ 的多个实例

    我看到数以千计的实例CD快照 entityName 使用 instruments 来跟踪未引用的分配时 这是什么 我认为它与 CoreData 相关 是的 这与核心数据有关 我相信这是可以预料的 请参阅我的回复 NSManagedObjec
  • 一个用户的 Python 模块导入错误,但另一个用户没有错误

    这有效 root host usr bin python26 script py Success 这会导致错误 user host usr bin python26 script py ImportError No module named
  • 从 pypi 进行 pip install 可以,但从 testpypi 失败(找不到需求)

    我正在尝试创建我的第一个 python 包 为了不搞砸整个交易 我一直在尝试将其上传到 testpypi 服务器 这似乎很顺利 sdist 创建并上传没有显示任何错误 但是 当我尝试将其安装到新的 virtualenv 时https tes
  • wxPython 最好的实时绘图小部件是什么?

    我想使用 Python 和 wxPython 显示一个包含一条或两条曲线 每秒最多 50 个样本的实时图表 该小部件应支持 Win32 和 Linux 平台 欢迎任何提示 编辑添加 我不需要以 50 fps 更新显示 但需要在两条曲线上显示