使用matlab GUI设计离线问卷

news2025/2/7 19:51:42

很久没有更新了。没有更新的日子,也在努力学习,坚定了继续搞科研的决心,至死不渝。希望我们每个人都能有远大的理想,并为之付出不懈的奋斗。

目录

一、为什么

二、怎么设计

1. 问题和答案的显示

2. 答案的记录和保存

三、代码

四、附言


一、为什么

问卷为什么要用离线的?

因为项目不能使用线上问卷,而纸质版的问卷,人一多,后期答案统计起来会非常费劲!所以想着弄一个离线的。

为什么要用matlab GUI?

首先,不是因为熟悉matlab GUI。本人第一次使用matlab GUI,项目中刚好要用到matlab,所以就想着用matlab GUI去设计离线问卷。

二、怎么设计

关于matlab GUI的简单操作,有很多资源可供了解,也比较简单易懂,在此就不再多说。真正难住我的是,怎么写回调函数(callback),回调函数是指当你鼠标左击按下按钮之后的操作。因为是问卷,基本只涉及:

1. 问题和答案的显示;

2. 答案的保存和记录。

1. 问题和答案的显示

问题用静态文本框显示。而且还需要在开始前给答题者提示,对问卷做一个简单的介绍,也用静态文本框表示即可。界面如下:

答案选项的话:

1. 需要输入的用可编辑文本框显示;

2. 选择题的话用一个按钮组,把ABCD等每个选项用普通按钮显示,然后一起放进那个按钮组里。

本来想的是滚动页面显示不同的问题和答案,后来在博士师兄的建议下,使用的方法是:每次完成一个题,就更新内容。提供了上一题和下一题的按钮,不过每次鼠标左击选中答案后就会自动跳转到下一个问题。

另外,还需要把答案和问题都保存成excel表格,然后再用matlab读取。

举例如下:

2. 答案的记录和保存

1. 填空题的话,答题者输入后,点击文本框下的按钮,就记录并保存为mat。

2. 选择题的话,点击每个选项对应的按钮,就以数字(A对应1,B对应2,C对应3,D对应4,以此类推)传给问题的value,而我每次只需要保存并记录显示问题的静态文本框的value值即可。

三、代码

废话不多说,上代码:

function varargout = wj_3(varargin)
% WJ_3 MATLAB code for wj_3.fig
%      WJ_3, by itself, creates a new WJ_3 or raises the existing
%      singleton*.
%
%      H = WJ_3 returns the handle to a new WJ_3 or the handle to
%      the existing singleton*.
%
%      WJ_3('CALLBACK',hObject,eventData,handles,...) calls the local
%      function named CALLBACK in WJ_3.M with the given input arguments.
%
%      WJ_3('Property','Value',...) creates a new WJ_3 or raises the
%      existing singleton*.  Starting from the left, property value pairs are
%      applied to the GUI before wj_3_OpeningFcn gets called.  An
%      unrecognized property name or invalid value makes property application
%      stop.  All inputs are passed to wj_3_OpeningFcn via varargin.
%
%      *See GUI Options on GUIDE's Tools menu.  Choose "GUI allows only one
%      instance to run (singleton)".
%
% See also: GUIDE, GUIDATA, GUIHANDLES

% Edit the above text to modify the response to help wj_3

% Last Modified by GUIDE v2.5 13-Apr-2024 09:37:41

%% 数据
global que_cnt
global answs
global answers_3
global ques

% 读取表格 注意:读取之前删除不需要的数据
[num,txt,raw] = xlsread('3.状态-特质焦虑量表(STAI).xlsx');
[num0,txt0,raw0] = xlsread('3.答案.xlsx');

ques = txt;
answs =txt0;

%%

% Begin initialization code - DO NOT EDIT
gui_Singleton = 1;
gui_State = struct('gui_Name',       mfilename, ...
                   'gui_Singleton',  gui_Singleton, ...
                   'gui_OpeningFcn', @wj_3_OpeningFcn, ...
                   'gui_OutputFcn',  @wj_3_OutputFcn, ...
                   'gui_LayoutFcn',  [] , ...
                   'gui_Callback',   []);
if nargin && ischar(varargin{1})
    gui_State.gui_Callback = str2func(varargin{1});
end

if nargout
    [varargout{1:nargout}] = gui_mainfcn(gui_State, varargin{:});
else
    gui_mainfcn(gui_State, varargin{:});
end
% End initialization code - DO NOT EDIT


% --- Executes just before wj_3 is made visible.
function wj_3_OpeningFcn(hObject, eventdata, handles, varargin)
% This function has no output args, see OutputFcn.
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)
% varargin   command line arguments to wj_3 (see VARARGIN)

% Choose default command line output for wj_3
handles.output = hObject;

% Update handles structure
guidata(hObject, handles);

% UIWAIT makes wj_3 wait for user response (see UIRESUME)
% uiwait(handles.figure1);


% --- Outputs from this function are returned to the command line.
function varargout = wj_3_OutputFcn(hObject, eventdata, handles) 
% varargout  cell array for returning output args (see VARARGOUT);
% hObject    handle to figure
% eventdata  reserved - to be defined in a future version of MATLAB
% handles    structure with handles and user data (see GUIDATA)

% Get default command line output from handles structure
varargout{1} = handles.output;






% --- Executes on button press in xia.
function xia_Callback(hObject, eventdata, handles)
global que_cnt
global answs
global answers_3
global ques

% 保存上一题的答案
disp(['上一题:',num2str(que_cnt)])
answers_3(1,que_cnt) = get(handles.Q1,'Value');

% 开始下一题
if que_cnt >= length(ques) |  que_cnt < 1
    que_cnt = 1;
    
    % 已经完成问卷
    set(handles.Q1,'Visible','off')
    set(handles.xuan_xiang,'Visible','off') 
    set(handles.submmit,'Visible','on') 
    set(handles.shang,'Visible','off') 
    set(handles.xia,'Visible','off') 

    set(handles.tishi,'String','问卷已完成,请提交!') 
    set(handles.tishi,'Visible','on') 
    set(handles.tishi,'Enable','on') 
    else
    que_cnt = que_cnt + 1;
end
disp(['下一题:',num2str(que_cnt)])

% 显示下一题的问题和答案
set(handles.Q1,'String',ques(1,que_cnt))
set(handles.radiobutton1,'String',answs{que_cnt,1})
set(handles.radiobutton2,'String',answs{que_cnt,2})
set(handles.radiobutton3,'String',answs{que_cnt,3})
set(handles.radiobutton4,'String',answs{que_cnt,4})

% --- Executes on button press in shang.
function shang_Callback(hObject, eventdata, handles)
global que_cnt
global answs
global answers_3
global ques

% 返回上一题
if que_cnt <= 1
    que_cnt = 1;
else
    que_cnt = que_cnt - 1;
end
disp(que_cnt);
% 显示上一题的问题
set(handles.Q1,'String',ques(1,que_cnt))
% 显示上一题的答案
set(handles.radiobutton1,'String',answs{que_cnt,1})
set(handles.radiobutton2,'String',answs{que_cnt,2})
set(handles.radiobutton3,'String',answs{que_cnt,3})
set(handles.radiobutton4,'String',answs{que_cnt,4})
% 保存答案
answers_3(1,que_cnt) = get(handles.Q1,'Value');

% --- Executes during object creation, after setting all properties.
function T1_CreateFcn(hObject, eventdata, handles)


% --- Executes during object creation, after setting all properties.
function Q1_CreateFcn(hObject, eventdata, handles)

% --- Executes on button press in radiobutton1.
function radiobutton1_Callback(hObject, eventdata, handles)
set(handles.Q1,'Value',1); % 把问题的的 value值分别用 1 2 3 4 表示,分别代表 A B C D
global que_cnt
global answs
global answers_3
global ques

% 保存上一题的答案
disp(['上一题:',num2str(que_cnt)])
answers_3(1,que_cnt) = get(handles.Q1,'Value');
% 开始下一题
if que_cnt >= length(ques) |  que_cnt < 1
    que_cnt = 1;
    % 已经完成问卷
    set(handles.Q1,'Visible','off')
    set(handles.xuan_xiang,'Visible','off') 
    set(handles.submmit,'Visible','on') 
    set(handles.shang,'Visible','off') 
    set(handles.xia,'Visible','off') 
    set(handles.tishi,'String','问卷已完成,请提交!') 
    set(handles.tishi,'Visible','on') 
    set(handles.tishi,'Enable','on') 
    else
    que_cnt = que_cnt + 1;
end
disp(['下一题:',num2str(que_cnt)])
% 显示下一题的问题和答案
set(handles.Q1,'String',ques{1,que_cnt})
set(handles.radiobutton1,'String',answs{que_cnt,1})
set(handles.radiobutton2,'String',answs{que_cnt,2})
set(handles.radiobutton3,'String',answs{que_cnt,3})
set(handles.radiobutton4,'String',answs{que_cnt,4})


% --- Executes on button press in radiobutton2.
function radiobutton2_Callback(hObject, eventdata, handles)
set(handles.Q1,'Value',2); % 把问题的的 value值分别用 1 2 3 4 表示,分别代表 A B C D
global que_cnt
global answs
global answers_3
global ques

% 保存上一题的答案
disp(['上一题:',num2str(que_cnt)])
answers_3(1,que_cnt) = get(handles.Q1,'Value');
% 开始下一题
if que_cnt >= length(ques) |  que_cnt < 1
    que_cnt = 1;
    % 已经完成问卷
    set(handles.Q1,'Visible','off')
    set(handles.xuan_xiang,'Visible','off') 
    set(handles.submmit,'Visible','on') 
    set(handles.shang,'Visible','off') 
    set(handles.xia,'Visible','off') 
    set(handles.tishi,'String','问卷已完成,请提交!') 
    set(handles.tishi,'Visible','on') 
    set(handles.tishi,'Enable','on') 
    else
    que_cnt = que_cnt + 1;
end
disp(['下一题:',num2str(que_cnt)])
% 显示下一题的问题和答案
set(handles.Q1,'String',ques{1,que_cnt})
set(handles.radiobutton1,'String',answs{que_cnt,1})
set(handles.radiobutton2,'String',answs{que_cnt,2})
set(handles.radiobutton3,'String',answs{que_cnt,3})
set(handles.radiobutton4,'String',answs{que_cnt,4})



% --- Executes on button press in radiobutton3.
function radiobutton3_Callback(hObject, eventdata, handles)
set(handles.Q1,'Value',3); % 把问题的的 value值分别用 1 2 3 4 表示,分别代表 A B C D
global que_cnt
global answs
global answers_3
global ques

% 保存上一题的答案
disp(['上一题:',num2str(que_cnt)])
answers_3(1,que_cnt) = get(handles.Q1,'Value');
% 开始下一题
if que_cnt >= length(ques) |  que_cnt < 1
    que_cnt = 1;
    % 已经完成问卷
    set(handles.Q1,'Visible','off')
    set(handles.xuan_xiang,'Visible','off') 
    set(handles.submmit,'Visible','on') 
    set(handles.shang,'Visible','off') 
    set(handles.xia,'Visible','off') 
    set(handles.tishi,'String','问卷已完成,请提交!') 
    set(handles.tishi,'Visible','on') 
    set(handles.tishi,'Enable','on') 
    else
    que_cnt = que_cnt + 1;
end
disp(['下一题:',num2str(que_cnt)])
% 显示下一题的问题和答案
set(handles.Q1,'String',ques{1,que_cnt})
set(handles.radiobutton1,'String',answs{que_cnt,1})
set(handles.radiobutton2,'String',answs{que_cnt,2})
set(handles.radiobutton3,'String',answs{que_cnt,3})
set(handles.radiobutton4,'String',answs{que_cnt,4})


% --- Executes on button press in radiobutton4.
function radiobutton4_Callback(hObject, eventdata, handles)
set(handles.Q1,'Value',4); % 把问题的的 value值分别用 1 2 3 4 表示,分别代表 A B C D
global que_cnt
global answs
global answers_3
global ques

% 保存上一题的答案
disp(['上一题:',num2str(que_cnt)])
answers_3(1,que_cnt) = get(handles.Q1,'Value');
% 开始下一题
if que_cnt >= length(ques) |  que_cnt < 1
    que_cnt = 1;
    % 已经完成问卷
    set(handles.Q1,'Visible','off')
    set(handles.xuan_xiang,'Visible','off') 
    set(handles.submmit,'Visible','on') 
    set(handles.shang,'Visible','off') 
    set(handles.xia,'Visible','off') 
    set(handles.tishi,'String','问卷已完成,请提交!') 
    set(handles.tishi,'Visible','on') 
    set(handles.tishi,'Enable','on') 
    else
    que_cnt = que_cnt + 1;
end
disp(['下一题:',num2str(que_cnt)])
% 显示下一题的问题和答案
set(handles.Q1,'String',ques{1,que_cnt})
set(handles.radiobutton1,'String',answs{que_cnt,1})
set(handles.radiobutton2,'String',answs{que_cnt,2})
set(handles.radiobutton3,'String',answs{que_cnt,3})
set(handles.radiobutton4,'String',answs{que_cnt,4})

% --- Executes during object creation, after setting all properties.
function xuan_xiang_CreateFcn(hObject, eventdata, handles)

% --- Executes during object creation, after setting all properties.
function tishi_CreateFcn(hObject, eventdata, handles)
% --- Executes during object creation, after setting all properties.
function tishi_DeleteFcn(hObject, eventdata, handles)


function edit1_Callback(hObject, eventdata, handles)

function edit1_CreateFcn(hObject, eventdata, handles)

if ispc && isequal(get(hObject,'BackgroundColor'), get(0,'defaultUicontrolBackgroundColor'))
    set(hObject,'BackgroundColor','white');
end


% --- Executes on button press in start.
function start_Callback(hObject, eventdata, handles)
global que_cnt
que_cnt = 1;
% 关闭提示和开始按钮
set(handles.tishi,'Visible','off') 
set(handles.start,'Visible','off') 
set(handles.tishi,'Enable','off') 
set(handles.start,'Enable','off') 

set(handles.Q1,'Visible','on')
% 可编辑文本
set(handles.edit1,'Visible','on')
set(handles.bianhao_ok,'Visible','on')


% --- Executes on button press in bianhao_ok.
function bianhao_ok_Callback(hObject, eventdata, handles)
 % 开始填写问卷
 global que_cnt
 global ques
 global answers_3
que_cnt = 2;
set(handles.Q1,'String',ques(1,que_cnt))
set(handles.xuan_xiang,'Visible','on') 
% set(handles.submmit,'Visible','on') 
set(handles.shang,'Visible','on') 
set(handles.xia,'Visible','on') 

% 把从可编辑文本框中输入的编号传给Q1,保存
set(handles.Q1,'Value',str2num(get(handles.edit1,'String')))
set(handles.edit1,'Visible','off')
set(handles.edit1,'Enable','off')
set(handles.bianhao_ok,'Visible','off')
set(handles.bianhao_ok,'Enable','off')
answers_3(1,que_cnt-1) = str2num(get(handles.edit1,'String'));


% --- Executes on button press in submmit.
function submmit_Callback(hObject, eventdata, handles)
set(handles.T1,'Visible','on') % 弹出问卷提交成功
global answers_3
save answers_3.mat answers_3 % 保存答案

注意:

假如你直接运行这个代码肯定是不行的。你需要打开guide,新建一个fig,然后再根据需要修改对应的回调函数。

四、附言

谨以此抛砖引玉,初次尝试,花了三四个半天写了10份离线问卷,每份问卷要求不一,我也是焦头烂额。

以上定然还有诸多不全,有建议请各位大佬赐教。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

V神演讲展望Web3发展并认为可引入人工智能

前言 2024 香港 Web3 嘉年华期间&#xff0c;以太坊联合创始人 Vitalik Buterin 发表主旨演讲《Reaching the Limits of Protocol Design》。以下是演讲内容&#xff1a; 区块链与ZK-SNARKS 我们用来构建协议的技术类型在过去 10 年里发生了很大变化。那么&#xff0c;当 2…

德国高速主轴SycoTec代理 高精度高转速主轴一览

速科德电机科技&#xff0c;作为德国高速主轴品牌SycoTec代理以及亚太服务中心&#xff0c;一直致力于将最先进、最可靠的高速电主轴技术带给广大机械加工企业。在现代精密机械制造业中&#xff0c;高速电主轴的应用已经变得不可或缺&#xff0c;而SycoTec高速电主轴以其卓越的…

【七 (1)FineBI FCP模拟试卷-股票收盘价分析】

目录 文章导航一、字段解释二、需求三、操作步骤1、添加计算字段&#xff08;每月最后一天的收盘价&#xff09;2、绘制折线图 文章导航 【一 简明数据分析进阶路径介绍&#xff08;文章导航&#xff09;】 一、字段解释 Company Name&#xff1a;公司名称 Date&#xff1a;…

UE5 C++ 创建3DWidgete 血条 再造成伤害

一&#xff0e;创建 二&#xff0e;&#xff35;&#xff29;里声明变量 创建类 public:UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget")float CurrentHealth 100.0f;UPROPERTY(EditAnywhere,BlueprintReadWrite,Category "MyWidget"…

【嵌入式】嵌入式开发中常见的面试题(持续更新中)

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

Linux--进程间的通信--进程池

进程间的通信–匿名管道 进程池的概念 进程池是一种将多个进程组织起来以执行特定任务的机制。它由多个预先创建好的资源进程和一个管理进程组成。这些资源进程被管理进程负责分配和调度&#xff0c;用于处理任务。 当有新的任务提交时&#xff0c;管理进程会从进程池中取出一…

主线程捕获子线程异常

正常情况下使用多线程出现异常时&#xff0c;都是按照单个任务去处理异常&#xff0c;在线程间不需要通信的情况下&#xff0c;任务之间互不影响&#xff0c;主线程也不必知道子线程是否发成异常。 那么只需要处理子线程异常即可 Task.Run(() > {try{throw new Exception(&…

苍穹外卖学习记录(二)

本节&#xff0c;主要是学习业务逻辑&#xff0c;我们以菜品管理为例&#xff1a; 在实现这部分前&#xff0c;我们要完成Mybatis的配置&#xff0c;即指定映射的mapper.xml文件路径以及对应的实体类&#xff0c;这部分配置是在application.yml文件中实现的。 mybatis:#mapper…

计算机网络(四)网络层

网络层 基本概念 网络互联&#xff1a; 将两个以上的计算机网络&#xff0c;通过一定的办法&#xff0c;用一种或多种通信处理设备(即中间设备)相互连接起来&#xff0c;以构成更大的网络系统。中间设备又称中间系统或中继系统 中继系统分为4种&#xff1a; 物理层中继系统…

thinkphp 框架封装curl请求

tp6 或者 tp8框架 在框架的app/common.php 文件里加一些方法就可以 app\common.php 在这个文件里加 以下代码 就可以实现基于 curl的请求方法 (记得要开启 php的curl扩展) 查看方法 cmd里输入 php -m if (!function_exists(get)) {/*** 发送get请求* param string $url 请求…

ChatGPT实用指南2024

随着ChatGPT技术的演进&#xff0c;越来越多的人开始在工作中利用此工具。以下是关于ChatGPT的实用指南&#xff0c;适合不太熟悉此技术的朋友参考。 一、ChatGPT概述 1. ChatGPT是什么&#xff1f; ChatGPT是基于OpenAI开发的GPT大型语言模型的智能对话工具。它能够通过自然语…

前端框架模板

前端框架模板 1、vue-element-admin vue-element-admin是基于element-ui 的一套后台管理系统集成方案。 **功能&#xff1a;**https://panjiachen.github.io/vue-element-admin-site/zh/guide/#功能 **GitHub地址&#xff1a;**GitHub - PanJiaChen/vue-element-admin: :t…

网盘——添加好友

关于添加好友&#xff0c;过程如下&#xff1a; A、首先客户端A发送加好友的请求&#xff0c;发送的信息包括双方的用户名 B、当服务器收到请求之后&#xff0c;服务器将数据库中在线用户查找出来&#xff0c;如果客户端B已经是你的好友了&#xff0c;服务器告诉客户端A他已经…

【深度学习】深度学习md笔记总结第5篇:神经网络与tf.keras,学习目标【附代码文档】

深度学习笔记完整教程&#xff08;附代码资料&#xff09;主要内容讲述&#xff1a;深度学习课程&#xff0c;深度学习介绍要求,目标,学习目标,1.1.1 区别,学习目标,学习目标。TensorFlow介绍&#xff0c;2.4 张量学习目标,2.4.1 张量(Tensor),2.4.2 创建张量的指令,2.4.3 张量…

Sublime Text下载,安装,安装插件管理器,下载汉化插件

SublimeTest官网 © Sublime Text中文网 下载安装 一路点击安装即可 安装插件管理器 管理器官网安装 - 包控制 (packagecontrol.io) 手动安装将3 位置点击网址下载 再打开SublimeTest 点击 选择第一个Browse Packages..... 将会跳转到文件夹中 进入上一个文件夹 在进入…

【模拟】Leetcode 提莫攻击

题目讲解 495. 提莫攻击 算法讲解 前后的两个数字之间的关系要么是相减之差 > 中毒时间 &#xff0c;要么反之 那即可通过示例&#xff0c;进行算法的模拟&#xff0c;得出上图的计算公式 class Solution { public:int findPoisonedDuration(vector<int>& time…

MySql 安装,小白也可以学会成功安装的保姆级教程

MySql 安装 文章目录 MySql 安装1.Mysql下载1.1 访问下载链接1.2 选择合适版本1.3 下载安装包 2.MySql安装3.安装成功检测验证3.1 mysql自带控制台验证3.2 win系统控制台进入验证 4. mysql 配置path5. navicat 连接 mysql 1.Mysql下载 1.1 访问下载链接 MySQL Downloads 这里…

定时器、PWM定时器、UART串口通信

我要成为嵌入式高手之4月15日ARM第八天&#xff01;&#xff01; ———————————————————————————— 定时器 S3C2440A 有 5 个 16 位定时器。其中定时器 0、1、2 和 3 具有脉宽调制&#xff08;PWM&#xff09;功能。定时器 4 是一个无 输出引脚的内部…

电商技术揭秘二十五:电商平台的智能库存管理与优化

相关系列文章 电商技术揭秘一&#xff1a;电商架构设计与核心技术 电商技术揭秘二&#xff1a;电商平台推荐系统的实现与优化 电商技术揭秘三&#xff1a;电商平台的支付与结算系统 电商技术揭秘四&#xff1a;电商平台的物流管理系统 电商技术揭秘五&#xff1a;电商平台…

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费&#xff0c;从而定位到有性能问题的操作&#xff0c;指导用户去优化。 开启ET工具 INI参数&#xff1a; ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…