python每秒随机获取10到30之间的一个浮点数,展出一个滚动的折线图,x轴刻度为时间,设置上限为20,下限为15,超过上限或者低于下限的值,改变颜色,每个数据点要有数值标识,pySimpleGUI建立一个界面,有开始,暂停,继续,退出,四个按钮来控制实时折线图
时间: 2024-05-07 14:18:09 浏览: 27
好的,我明白了你的要求。为了实现这个功能,我们需要使用Python的time、random和matplotlib库,以及PySimpleGUI库来构建图形用户界面。
以下是实现该功能的代码和说明:
```python
import time
import random
import matplotlib.pyplot as plt
import PySimpleGUI as sg
# 定义常量
UPPER_LIMIT = 20
LOWER_LIMIT = 15
ROLLING_WINDOW = 10 # 滚动窗口大小,即展示10秒钟的数据
INTERVAL = 1 # 每秒更新一次数据
# 初始化数据
data = [random.uniform(10, 30) for _ in range(ROLLING_WINDOW)]
colors = ['blue'] * ROLLING_WINDOW
# 初始化图形界面
layout = [
[sg.Canvas(size=(400, 300), key='canvas')],
[sg.Button('开始'), sg.Button('暂停'), sg.Button('继续'), sg.Button('退出')]
]
window = sg.Window('实时折线图', layout, finalize=True)
canvas = window['canvas'].TKCanvas
fig, ax = plt.subplots()
ax.set_ylim([10, 30])
ax.set_xlim([0, ROLLING_WINDOW])
line, = ax.plot(range(ROLLING_WINDOW), data, color='blue')
# 更新数据
def update_data():
global data, colors
value = random.uniform(10, 30)
data.append(value)
data.pop(0)
if value > UPPER_LIMIT:
colors.append('red')
colors.pop(0)
elif value < LOWER_LIMIT:
colors.append('green')
colors.pop(0)
else:
colors.append('blue')
colors.pop(0)
# 更新图形
def update_figure():
global line
line.set_ydata(data)
line.set_color(colors)
canvas.draw()
# 主循环
running = False
paused = False
while True:
event, values = window.read(timeout=INTERVAL * 1000)
if event == sg.WINDOW_CLOSED or event == '退出':
break
elif event == '开始':
running = True
elif event == '暂停':
running = False
paused = True
elif event == '继续':
running = True
paused = False
if running:
update_data()
update_figure()
elif paused:
time.sleep(INTERVAL)
# 关闭图形界面
window.close()
```
代码中,首先我们定义了一些常量,包括上限、下限、展示窗口大小和更新间隔等。然后初始化了数据和颜色,以及图形界面。在更新数据和更新图形的函数中,我们对数据进行了更新,并将其展示在图形界面上。
主循环中,根据不同的按钮事件来控制程序的运行状态。如果是开始按钮,则将程序的运行状态设置为True;如果是暂停按钮,则将程序的运行状态设置为False,并将暂停状态设置为True;如果是继续按钮,则将程序的运行状态设置为True,并将暂停状态设置为False。当程序处于运行状态时,每秒钟更新一次数据,并更新图形;当程序处于暂停状态时,程序会等待一秒钟后再继续。
最后,在程序结束时,我们需要关闭图形界面。
希望能够帮助到你!
阅读全文