JavaFX:MVC模式学习01-使用PropertyValueFactory将模型与视图绑定

PropertyValueFactory类是“TableColumn cell value factory”,绑定创建列表中的项。示例如下:

 TableColumn<Person,String> firstNameCol = new TableColumn<Person,String>("First Name");firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));

JavaFX在使用MVC模式绑定数据时,要注意模型中属性与视图中列的绑定。在前面的例子中,Person类是TableView视图绑定的列表的项(items),String和LocalDate是TableColumn中项数据的类型(firstName、lastName是StringProperty,birthDate是ObjectProperty)。

Person类必须是public,“First Name”是在TableView中显示的表头内容。PropertyValueFactory类的构造方法传入参数“firstName”创建实例,在列表项Person类中寻找与对应的无参属性方法firstNameProperty(方法firstNameProperty必须与传入的参数firstName对应,应该是通过反射方式进行名称对应。firstNameProperty方法可以对应任何名称的属性字段,例如firstNameABC属性字段都可以,对应的无参数属性方法为firstNameABCProperty())返回ObservableValue<String>。

如果Person类中没有与“firstName”对应的无参firstNameProperty方法,PropertyValueFactory类则会扫描Person类中是否有返回值是String类型的无参方法getFirstName()或无参方法isFirstName()(注意返回属性方法和返回String方法的命名区别,String方法已get开头)。如果有上述方法(无参方法getFirstName()或无参方法isFirstName()),则方法会被调用,返回被ReadOnlyObjectWrapper包装的值,值填充“Table Cell”。这种情况下,TableCell无法给包装的属性注册观察者观察数据变化状态。这种情况与调用firstNameProperty方法不同。
 

另:

TableView<S>是JavaFX的视图类,通过绑定模型显示。

// 类TableView构造函数。
TableView(ObservableList<S> items)TableView()

TableView绑定模型。

// 模型。
ObservableList<Person> teamMembers = FXCollections.observableArrayList(members);// 方法一:构造函数绑定模型。
TableView<Person> table = new TableView<>(teamMembers);// 方法二:方法setItems绑定模型。
TableView<Person> table = new TableView<>();
table.setItems(teamMembers);

Person类及创建模型:

 public class Person {private StringProperty firstName;public void setFirstName(String value) { firstNameProperty().set(value); }public String getFirstName() { return firstNameProperty().get(); }public StringProperty firstNameProperty() {if (firstName == null) firstName = new SimpleStringProperty(this, "firstName");return firstName;}private StringProperty lastName;public void setLastName(String value) { lastNameProperty().set(value); }public String getLastName() { return lastNameProperty().get(); }public StringProperty lastNameProperty() {if (lastName == null) lastName = new SimpleStringProperty(this, "lastName");return lastName;}public Person(String firstName, String lastName) {setFirstName(firstName);setLastName(lastName);}}// 创建模型。
List<Person> members = List.of(new Person("William", "Reed"),new Person("James", "Michaelson"),new Person("Julius", "Dean"));

将数据列与视图绑定:

 TableColumn<Person, String> firstNameCol = new TableColumn<>("First Name");firstNameCol.setCellValueFactory(new PropertyValueFactory<>(members.get(0).firstNameProperty().getName())));TableColumn<Person, String> lastNameCol = new TableColumn<>("Last Name");lastNameCol.setCellValueFactory(new PropertyValueFactory<>(members.get(0).lastNameProperty().getName())));table.getColumns().setAll(firstNameCol, lastNameCol);

运行结果:

以上是JavaFX官方api示例。以下是我自己写的测试代码。

类AgeCategory,年龄段枚举:

package javafx8.ch13.tableview01;/*** @copyright 2003-2023* @author    qiao wei* @date      2023-12-30 18:19* @version   1.0* @brief     年龄段枚举。* @history   */
public enum AgeCategoryEnum {BABY,CHILD,TEEN,ADULT,SENIOR,UNKNOWN
}

Person类。

package javafx8.ch13.tableview01;import java.time.LocalDate;
import java.time.Period;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.atomic.AtomicInteger;import javafx.beans.property.ObjectProperty;
import javafx.beans.property.ReadOnlyIntegerProperty;
import javafx.beans.property.ReadOnlyIntegerWrapper;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.property.SimpleObjectProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;/*** @copyright 2003-2023* @author    qiao wei* @date      2023-12-30 18:20* @version   1.0* @brief     * @history   */
public class Person {/*** @author  qiao wei* @brief   默认构造函数。* @param   * @return  * @throws  */public Person() {this("None", "None", null);}/*** @author  qiao wei* @brief   构造函数。* @param   firstName 名。* @param   lastName 姓。* @param   birthDate 出生日期。  * @return  * @throws  */public Person(String firstName,String lastName,LocalDate birthDate) {// 用户Id由系统自动生成。this.personIdProperty = new ReadOnlyIntegerWrapper(this,"personId",personSequence.incrementAndGet());this.firstNameProperty = new SimpleStringProperty(this,"firstName",firstName);this.lastNameProperty = new SimpleStringProperty(this,"lastName",lastName);this.birthDateProperty = new SimpleObjectProperty<>(this,"birthDate",birthDate);}@Overridepublic String toString() {StringBuilder stringBuilder = new StringBuilder("[personIdProperty=");stringBuilder.append(personIdProperty.get()).append(", firstNameProperty = ").append(firstNameProperty.get()).append(", lastNameProperty = ").append(lastNameProperty.get()).append(", birthDateProperty = ").append(birthDateProperty.get()).append("]");return stringBuilder.toString();}public boolean save(List<String> errorList) {boolean isSaved = false;if (isValidPerson(errorList)) {System.out.println("Saved " + this.toString());isSaved = true;}return isSaved;}public boolean isValidPerson(Person person, List<String> errorList) {boolean isValidPerson = true;String firstName = person.firstName();if (Objects.equals(firstName, null) || 0 == firstName.trim().length()) {errorList.add("First name must contain minimum one character.");isValidPerson = false;}String lastName = person.lastName();if (Objects.equals(null, lastName) || 0 == lastName.trim().length()) {errorList.add("Last name must contain minimum one character.");isValidPerson = false;}return isValidPerson;}public boolean isValidPerson(List<String> errorList) {return isValidPerson(this, errorList);}/*** @author  qiao wei* @brief   判断录入日期是否有效。* @param   * @return  * @throws  */public boolean isValidBirthDate(LocalDate date, List<String> errorList) {if (Objects.equals(null, date)) {errorList.add("Birth date is null");return false;}if (date.isAfter(LocalDate.now())) {errorList.add(LocalDate.now().toString() + " : Birth date must not be in future.");return false;}return true;}/*** @author  qiao wei* @brief   根据年龄,返回年龄层枚举值。* @param   * @return  年龄层枚举值。根据不同年龄返回不同年龄层。* @throws  */public AgeCategoryEnum ageCategory() {if (null == birthDateProperty.get()) {return AgeCategoryEnum.UNKNOWN;}int ages = Period.between(birthDateProperty.get(), LocalDate.now()).getYears();if (0 <= ages && 2 > ages) {return AgeCategoryEnum.BABY;} else if (2 <= ages && 13 > ages) {return AgeCategoryEnum.CHILD;} else if (13 <= ages && 19 >= ages) {return AgeCategoryEnum.TEEN;} else if (19 < ages && 50 >= ages) {return AgeCategoryEnum.ADULT;} else if (50 < ages) {return AgeCategoryEnum.SENIOR;} else {return AgeCategoryEnum.UNKNOWN;}}/*** @author  qiao wei* @brief   方法命名符合***Property格式,PropertyValueFactory类构造方法通过反射调用。返回值继承接*          口ObservableValue<String>。* @param   * @return  * @throws  */public ReadOnlyStringWrapper ageCategoryProperty() {if (null == birthDateProperty.get()) {return new ReadOnlyStringWrapper(AgeCategoryEnum.UNKNOWN.toString());}int ages = Period.between(birthDateProperty.get(), LocalDate.now()).getYears();if (0 <= ages && 2 > ages) {return new ReadOnlyStringWrapper(AgeCategoryEnum.BABY.toString());} else if (2 <= ages && 13 > ages) {return new ReadOnlyStringWrapper(AgeCategoryEnum.CHILD.toString());} else if (13 <= ages && 19 >= ages) {return new ReadOnlyStringWrapper(AgeCategoryEnum.TEEN.toString());} else if (19 < ages && 50 >= ages) {return new ReadOnlyStringWrapper(AgeCategoryEnum.ADULT.toString());} else if (50 < ages) {return new ReadOnlyStringWrapper(AgeCategoryEnum.SENIOR.toString());} else {return new ReadOnlyStringWrapper(AgeCategoryEnum.UNKNOWN.toString());}}public ReadOnlyIntegerProperty personIdProperty() {return personIdProperty.getReadOnlyProperty();}public int personId() {return personIdProperty.get();}public StringProperty firstNameProperty() {return firstNameProperty;}public String firstName() {return firstNameProperty.get();}public void setFirstName(String firstNameProperty) {this.firstNameProperty.set(firstNameProperty);}public StringProperty lastNameProperty() {return lastNameProperty;}public String lastName() {return lastNameProperty.get();}public void setLastName(String lastName) {this.lastNameProperty.set(lastName);}public ObjectProperty<LocalDate> birthDateProperty() {return birthDateProperty;}public LocalDate getBirthDate() {return birthDateProperty.get();}public void setBirthDate(LocalDate birthDate) {this.birthDateProperty.set(birthDate);}/*** @date   2023-07-01 21:33* @brief  Person id。只读类型。*/private final ReadOnlyIntegerWrapper personIdProperty;/*** @date   2023-12-29 11:48* @brief  用户姓。*/private final StringProperty firstNameProperty;/*** @date   2023-12-29 11:48* @author qiao wei* @brief  用户名。*/private final StringProperty lastNameProperty;/*** @date   2023-07-01 21:33* @author qiao wei* @brief  出生日期。*/private final ObjectProperty<LocalDate> birthDateProperty;/*** @date   2023-07-01 21:34* @author qiao wei* @brief  Class field. Keeps track of last generated person id.*/private static AtomicInteger personSequence = new AtomicInteger(0);
}

Person工厂类PersonTableUtil:

package javafx8.ch13.tableview01;import java.time.LocalDate;import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;/*** @copyright 2003-2023* @author    qiao wei* @date      2023-12-30 16:59* @version   1.0* @brief     模型类。方法getPersonList返回与视图绑定的数据项列表。方法getIdColumn,getFirstNameColumn*            getLastNameColumn以列的数据格式返回列表中各项的对应值。* @history   */
public class PersonTableUtil {/*** @author  qiao wei* @brief   默认构造方法。* @param   * @return  * @throws  */public PersonTableUtil() {}/*** @author  qiao wei* @brief   返回保存类Person实例的观察者列表ObservableList。* @param   * @return  类Person实例的观察者列表。* @throws  */public static ObservableList<Person> getPersonList() {Person p1 = new Person("Ashwin","Sharan",LocalDate.of(1972, 10, 11));Person p2 = new Person("Advik","Tim",LocalDate.of(2012, 10, 11));Person p3 = new Person("Layne","Estes",LocalDate.of(2011, 12, 16));Person p4 = new Person("Mason","Boyd",LocalDate.of(1995, 4, 20));Person p5 = new Person("Babalu","Sha",LocalDate.of(1980, 1, 10));// 返回ObservableList。return FXCollections.<Person>observableArrayList(p1, p2, p3, p4, p5);}/*** @author  qiao wei* @brief   Retrieve person Id TableColumn.* @param   * @return  Id column.* @throws  */public static TableColumn<Person, Integer> getIdColumn() {/*** 创建显示的列实例。参数Person:列绑定的数据模型。参数Integer:数据模型中数据的类型,类型必须是引用类型。*  “Id”是列表头显示的内容。*/TableColumn<Person, Integer> idColumn = new TableColumn<>("Id");// 列实例通过参数“personId”绑定模型的对应属性。idColumn.setCellValueFactory(new PropertyValueFactory<>("personId"));return idColumn;}/*** @class   PersonTableUtil* @date    2023-07-05 20:51* @author  qiao wei* @version 1.0* @brief   Retrieve first name TableColumn.* @param   * @return  First name column.* @throws*/public static TableColumn<Person, String> getFirstNameColumn() {TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName1"));return firstNameColumn;}/*** @author  qiao wei* @brief   Retrieve last name TableColumn.* @param   * @return  Last name column.* @throws  */public static TableColumn<Person, String> getLastNameColumn() {TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));return lastNameColumn;}/*** @author  qiao wei* @brief   Retrieve birthdate TableColumn.* @param   * @return  Birthdate column.* @throws  */public static TableColumn<Person, LocalDate> getBirthDateColumn() {TableColumn<Person, LocalDate> birthDateColumn = new TableColumn<>("Birth Date");birthDateColumn.setCellValueFactory(new PropertyValueFactory<>("birthDate"));return birthDateColumn;}
}

运行类:

package javafx8.ch13.tableview01;import java.time.LocalDate;import javafx.application.Application;
import javafx.scene.control.Label;
import javafx.scene.control.TableColumn;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;
import javafx.scene.Scene;
import javafx.scene.control.TableView;
import javafx.scene.layout.VBox;/*** @copyright 2003-2023* @author    qiao wei* @date      2023-12-31 11:36* @version   1.0* @brief     * @history   */
public class SimplestTableView extends Application {public SimplestTableView() {}@Overridepublic void start(Stage primaryStage) throws Exception {start03(primaryStage);}public static void main(String[] args) {try {Application.launch(SimplestTableView.class, args);} catch (Exception exception) {exception.printStackTrace();}}/*** @author  qiao wei* @brief   * @param   primaryStage 主窗体。* @return  * @throws  */private void start01(Stage primaryStage) throws Exception {// Create a TableView and bind model.TableView<Person> table = new TableView<>(PersonTableUtil.getPersonList());// Add columns to the TableView in order.table.getColumns().addAll(PersonTableUtil.getIdColumn(),PersonTableUtil.getFirstNameColumn());TableColumn<Person, String> lastNameColumn = new TableColumn<>("姓");lastNameColumn.setCellValueFactory(new PropertyValueFactory<>(PersonTableUtil.getPersonList().get(0).lastNameProperty().getName()));// Add a table column in index position.table.getColumns().add(1, PersonTableUtil.getBirthDateColumn());table.getColumns().add(2, lastNameColumn);VBox root = new VBox(table);root.setStyle("-fx-padding: 10;" +"-fx-border-style: solid inside;" +"-fx-border-width: 2;" +"-fx-border-insets: 5;" +"-fx-border-radius: 5;" +"-fx-border-color: pink;");        Scene scene = new Scene(root);primaryStage.setScene(scene);primaryStage.setTitle("Simplest TableView");primaryStage.show();}/*** @author  qiao wei* @brief   设置复合表头,占位符测试。设置表头Name中包含FirstName和LastName。当表格没有内容时,显示占位符内容。* @param   primaryStage 主窗体。* @return  * @throws  */private void start02(Stage primaryStage) throws Exception {// Create a TableView with a list of persons.TableView<Person> table = new TableView<>(PersonTableUtil.getPersonList());// Placeholder。当table没有内容显示时,显示Label内容。table.setPlaceholder(new Label("No visible columns and/or data exist."));// Setup nest table header.TableColumn<Person, String> nameColumn = new TableColumn<>("Name");nameColumn.getColumns().addAll(PersonTableUtil.getFirstNameColumn(),PersonTableUtil.getLastNameColumn());// Inserts columns to the TableView.table.getColumns().addAll(PersonTableUtil.getIdColumn(), nameColumn);/*** 在指定列添加列表信息,列从0开始计数。列FirstName和列LastName设置在复合表头,只算一列。所以插入* “出生日期”列只能在0~2列。*/table.getColumns().add(2, PersonTableUtil.getBirthDateColumn());VBox root = new VBox(table);root.setStyle("-fx-padding: 10;"+ "-fx-border-style: solid inside;"+ "-fx-border-width: 2;"+ "-fx-border-insets: 5;"+ "-fx-border-radius: 5;"+ "-fx-border-color: gray;");primaryStage.setScene(new Scene(root));primaryStage.setTitle("Simplest TableView02");primaryStage.show();}/*** @author  qiao wei* @brief   将Person实例通过getItems方法添加到模型ObservableList中。* @param   primaryStage 主窗体。* @return  * @throws  */private void start03(Stage primaryStage) throws Exception {// Create a TableView instance and set Placeholder.TableView<Person> tableView = new TableView<>(PersonTableUtil.getPersonList());tableView.setPlaceholder(new Label("No rows to display"));// 调用PersonTableUtil.getIdColumn方法,返回TableColumn<Person, Integer>。TableColumn<Person, Integer> idColumn = PersonTableUtil.getIdColumn();/*** 创建TableColumn实例,参数Person表示列中显示数据来自于那里,参数String表示显示数据的类型,参数* First Name是该列显示的列表头内容。*/TableColumn<Person, String> firstNameColumn = new TableColumn<>("First Name");
//        TableColumn<Person, String> firstNameColumn = PersonTableUtil.getFirstNameColumn();/*** PropertyValueFactory的参数是Person对象的无参lastNameProperty方法(应该是通过反射方式),如果没* 有找到对应方法,则会按规则继续寻找对应方法绑定,具体资料见JavaFX文档。* In the example shown earlier, a second PropertyValueFactory is set on the second TableColumn* instance. The property name passed to the second PropertyValueFactory is lastName, which will* match the getter method getLastNameProperty() of the Person class.*/firstNameColumn.setCellValueFactory(new PropertyValueFactory<>("firstName"));TableColumn<Person, String> lastNameColumn = new TableColumn<>("Last Name");
//        lastNameColumn.setCellValueFactory(new PropertyValueFactory<>("lastName"));lastNameColumn.setCellValueFactory(new PropertyValueFactory<>(PersonTableUtil.getPersonList().get(0).lastNameProperty().getName()));TableColumn<Person, AgeCategoryEnum> ageCategoryColumn = new TableColumn<>("Age");ageCategoryColumn.setCellValueFactory(new PropertyValueFactory<>("ageCategory"));TableColumn<Person, LocalDate> birthDateColumn = new TableColumn<>("Birth Date");birthDateColumn.setCellValueFactory(new PropertyValueFactory<>("birthDate"));// 两种方式将数据列加入到实例tableView。依次加入和按列插入。tableView.getColumns().addAll(lastNameColumn, firstNameColumn, ageCategoryColumn, birthDateColumn);tableView.getColumns().add(0, idColumn);VBox root = new VBox(tableView);Scene scene = new Scene(root);primaryStage.setScene(scene);primaryStage.show();// 添加2个用户信息。tableView.getItems().add(new Person("John","Doe",LocalDate.of(2000, 8, 12)));tableView.getItems().add(new Person("123","ABC",LocalDate.of(1980, 10, 4)));}
}

在执行类的方法start03中,lastName的数据绑定没有直接使用字符串,而是使用属性lastNameProperty的名称字符串,随后字符串绑定方法lastNameProperty。

自定义PropertyValueFactory使用见JavaFX:MVC模式学习02-继承Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>>_propertyvaluefactory-CSDN博客


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/319396.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

three.js使用正方体加图片实现全景看房效果

three.js使用正方体加图片实现全景看房效果 实现方法 创建一个正方体加载6张纹理贴图正方体z轴缩放-1调整相机位置 图例 代码 <template><div class"app"><div ref"canvesRef" class"canvas-wrap"></div></div&g…

智能分析网关V4如何在播放时设置是否显示算法区域?具体操作是什么?

AI智能分析网关V4是TSINGSEE青犀视频旗下的一款高效的边缘计算分析网关&#xff0c;可实现人体行为检测、车辆事件检测、环境卫生检测与消防事件检测等&#xff0c;广泛应用在工地、工厂、园区、楼宇、校园、仓储等场景中。将智能分析网关V4结合我们的视频融合平台EasyCVR一起使…

使用FFmpeg4.3.1的SDK官方开发包编译ffmpeg.c

文章目录 前言一、前期准备1、所需文件2、编译环境 二、创建工程三、解决编译报错四、测试 ffmpeg.c 前言 本文使用官方发布的 SDK 开发包来亲手编译 ffmpeg.c 文件&#xff0c;编译成功后可以对其内部的源码按照我们的需求进行修改&#xff0c;为后面的转码器的开发做个铺垫。…

ARM Cortex-A学习(3):MMU内存管理单元

内存管理单元(MMU)负责虚拟地址到物理地址的转换。MMU通过翻译表将程序使用的虚拟地址映射到实际的物理内存位置&#xff0c;实现对内存的动态管理和隔离。这不仅允许更灵活的内存分配&#xff0c;还提高了系统的安全性和稳定性。了解MMU的工作原理对于开发底层代码、BootLoade…

工业协议转换网关:打破通信壁垒,实现设备互联

在工业自动化领域&#xff0c;各种设备和系统间的通信协议不尽相同&#xff0c;这给不同设备间的集成和数据交互带来了挑战。工业协议转换网关作为一种解决这一问题的关键设备&#xff0c;能够实现不同协议间的转换和数据传输&#xff0c;打破通信壁垒&#xff0c;提高设备的协…

HarmonyOS4 vp单位计算

我们在harmonyOS中设置宽度等单位时 需要在后面写明具体是什么单位 width("100%")这里 我们就写明了是 百分之百 如果不写 直接给数值 width(100)那么 它就会按vp去读 这里就被读为 100vp vp 之前是一种移动端宽度概念 后面鸿蒙重定义了它的概念 计算公式是 px 乘…

macbook录屏快捷键大全,教你快速录制视频

“有人知道macbook电脑有录屏快捷键吗&#xff0c;现在录屏的速度太慢了&#xff0c;每次打开都要浪费不少时间&#xff0c;要是有录屏快捷键&#xff0c;应该会快很多&#xff0c;有哪位大佬知道吗&#xff1f;教教我&#xff01;” 无论是在工作还是生活中&#xff0c;电脑已…

el-select下拉框 change事件返回该项所有数据

主要代码 value-key <template><div><el-selectv-model"value"value-key"label"placeholder"请选择"change"selectChange"><el-optionv-for"item in options":key"item.label":label"…

Python爬虫篇(四):京东数据批量采集

京东数据批量采集 ●前言 一年一度的端午节又到了&#xff0c;甜咸粽子之争也拉开了帷幕&#xff0c;它价格高昂&#xff0c;它味道鲜美&#xff0c;然而&#xff0c;默默无名的它却备受广大民众喜爱&#xff01;好家伙&#xff0c;一看就是老qq看点了 &#xff0c;那咱们能做…

电锯切割狂

欢迎来到程序小院 电锯切割狂 玩法&#xff1a;把木块切成等分的碎片&#xff0c;每关都会有切割次数&#xff0c;木块数&#xff0c;切割越均匀分数越搞&#xff0c; 有简单、正常、困难、专家版&#xff0c;快去解锁不同版本进行切割吧^^。开始游戏https://www.ormcc.com/pl…

2023到2024年:前端发展趋势展望

本文探讨了2023年至2024年之间前端领域的发展趋势。我们将关注以下几个方面的变化&#xff1a;无代码/低代码开发的兴起、WebAssembly的广泛应用、跨平台技术的发展、人工智能在前端的应用以及用户体验的不断优化。 随着技术的飞速发展&#xff0c;前端开发在推动互联网与移动应…

numpy数组05-numpy的索引和切片

numpy中可以对其中的某一行&#xff08;列&#xff09;进行数据处理。 上节课我们已经取出了CSV文件中的二维数组&#xff0c;本次对这个二维数组为例&#xff0c;进行练习操作。 示例代码如下&#xff1a; import numpy as npus_file_path "US_video_data_numbers.cs…