LVGL V8

2023-10-26

本文适用于LVGL V8版本

LVGL simulator vs2019

官方工程 lv_sim_visual_studio
使用注意事项:
1、将官方工程从github上下载下来,最好使用git 将整个工程clone下来,因为工程内部有依赖,如果只是将工程Download下来,无法正常运行。

git clone --recurse-submodules https://github.com/lvgl/lv_sim_visual_studio.git

2、工程Clone下来后,需要根据不同的平台配置
在这里插入图片描述
3、在点击生成时,总是需要很长时间,并提示无法下载数据包“VC-LTL”
解决办法:
1、删除LVGL.Simulator.vcxproj中的(用记事本打开)
<Import Project="Mile.Project\Mile.Project.Runtime.VC-LTL.props" />
在这里插入图片描述
2、下载新的VC-LTL
VC-LTL
将VC-LTL Binary下载并解压至D:\Src\VC-LTL(具体位置无任何要求),双击D:\Src\VC-LTL\Install.cmd即可。

脚本会在HKCU\Code\VC-LTL创建注册表。

将属性表VC-LTL helper for Visual Studio.props复制到你的工程目录,你可以打开属性管理器(视图 - 属性管理器),然后Release配置上右键添加现有属性表,然后选择VC-LTL helper for Visual Studio.props即可
在这里插入图片描述

Boxing model

在这里插入图片描述

Alignment

在这里插入图片描述

字体

font awesome

Font Awesome
Font Awesome download
1001fonts
Monospaced Font 等宽字体
里飞网-LVGL
LvglFontTool V0.4在lvglv8中使用

emoji

OpenSansEmoji

图标

https://materialdesignicons.com/
https://fontello.com/
https://www.iconfont.cn/
https://www.softicons.com/

chart

通过lv_obj_set_style_size设置数据点的显示大小,设置为0,不显示。

	lv_chart_set_type(chart1, LV_CHART_TYPE_LINE );
 	/*Set point size to 0 so the lines are smooth */
 	lv_obj_set_style_size(chart1, 0, LV_PART_INDICATOR);

通过lv_obj_set_style_pad_gap设置数据之间显示间隔(用于一个图表显示多个系列)

 lv_chart_set_type(chart2, LV_CHART_TYPE_BAR);
 /* 设置同一x值之间的间距 */
 lv_obj_set_style_pad_gap(chart2, 0, LV_PART_ITEMS);
  /* 设置相邻x值之间的间距 */
 lv_obj_set_style_pad_gap(chart2, 2, LV_PART_MAIN);

设置X轴坐标,索引值是偶数的不显示

 lv_obj_add_event_cb(chart2, chart_event_cb, LV_EVENT_ALL, NULL);
 static void chart_event_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t * obj = lv_event_get_target(e);
    if(code == LV_EVENT_DRAW_PART_BEGIN) {
        lv_obj_draw_part_dsc_t * dsc = lv_event_get_param(e);
        /*Set the markers' text*/
        if(dsc->part == LV_PART_TICKS && dsc->id == LV_CHART_AXIS_PRIMARY_X) {
            if(lv_chart_get_type(obj) == LV_CHART_TYPE_BAR) {
              /* 设置X轴坐标,索引值是偶数的不显示 */
                if (dsc->value%2==0)
                {
                    lv_snprintf(dsc->text, dsc->text_length, "%s"," ");
                }
                //lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]);
            } else {
                const char * month[] = {"Jan", "Febr", "March", "Apr", "May", "Jun", "July", "Aug", "Sept", "Oct", "Nov", "Dec"};
                lv_snprintf(dsc->text, dsc->text_length, "%s", month[dsc->value]);
            }
        }

CHART_AXIS

如果要显示坐标轴的值,必须为坐标轴留出显示空间,可通过grid设置。
lv_obj_t *chart1 = lv_chart_create( parent );chart1的空间只是用于显示图表并不包括坐标轴的显示

static lv_coord_t grid_chart_row_dsc[] = {40, LV_GRID_FR( 1 ), LV_GRID_TEMPLATE_LAST};
static lv_coord_t grid_chart_col_dsc[] = {80, LV_GRID_FR( 1 ),80, LV_GRID_TEMPLATE_LAST};
 lv_chart_set_axis_tick( chart1, LV_CHART_AXIS_PRIMARY_Y, 10, 5, 9, 2, true, 80 );
 lv_chart_set_axis_tick( chart1, LV_CHART_AXIS_SECONDARY_Y, 10, 5, 9, 2, true, 80 );

chart bar 大小设置

bar 的大小由lv_chart_set_point_count(chart, point_num);v_chart_set_zoom_x(chart, factor);lv_obj_set_style_pad_gap(chart2, 0, LV_PART_ITEMS);lv_obj_set_style_pad_gap(chart2, 2, LV_PART_MAIN);四者共同决定。
当chart大小设定后,如果不设置lv_chart_set_zoom_x,LVGL根据pad_gap的大小及point_count,平均分配每个bar的宽度。
当设定lv_chart_set_zoom_x后,相当于将chart的宽度放大,此时会出现滚动条,在point_count不变的情况下,bar的宽度会增大。

lable

  1. Text recolor
    In the text, you can use commands to recolor parts of the text. For example: “Write a #ff0000 red# word”. This feature can be enabled individually for each label by lv_label_set_recolor() function.
    注意事项:
    #ff0000之后必须留空格,否则无法识别指令,结束符#不用留空格
    在这里插入图片描述
#include "../../lv_examples.h"
#if LV_USE_LABEL && LV_BUILD_EXAMPLES

/**
 * Show line wrap, re-color, line align and text scrolling.
 */
void lv_example_label_1(void)
{
    lv_obj_t * label1 = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label1, LV_LABEL_LONG_WRAP);     /*Break the long lines*/
    lv_label_set_recolor(label1, true);                      /*Enable re-coloring by commands in the text*/
    lv_label_set_text(label1, "#0000ff Re-color# #ff00ff words# #ff0000 of a# label, align the lines to the center "
                              "and wrap long text automatically.");
    lv_obj_set_width(label1, 150);  /*Set smaller width to make the lines wrap*/
    lv_obj_set_style_text_align(label1, LV_TEXT_ALIGN_CENTER, 0);
    lv_obj_align(label1, LV_ALIGN_CENTER, 0, -40);


    lv_obj_t * label2 = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(label2, LV_LABEL_LONG_SCROLL_CIRCULAR);     /*Circular scroll*/
    lv_obj_set_width(label2, 150);
    lv_label_set_text(label2, "It is a circularly scrolling text. ");
    lv_obj_align(label2, LV_ALIGN_CENTER, 0, 40);
}

#endif

Text recolor
In the text, you can use commands to recolor parts of the text. For example: “Write a #ff0000 red# word”. This feature can be enabled individually for each label by lv_label_set_recolor() function.

textarea

 ta = lv_textarea_create( lv_scr_act() );
  lv_obj_add_style( ta, &init_style, 0 );
  lv_obj_set_size( ta, SCR_TOTAL_HOR_RES, SCR_TOTAL_VER_RES );
  /* 修改光标的透明度 */
  lv_obj_set_style_bg_opa ( ta, LV_OPA_COVER, LV_PART_CURSOR );
  /* 修改光标的颜色 */
  lv_obj_set_style_bg_color( ta, lv_palette_lighten( LV_PALETTE_ORANGE, 1 ), LV_PART_CURSOR );
  lv_obj_set_style_bg_color( ta, SCR_BG_COLOR, LV_PART_MAIN );
  lv_obj_set_style_pad_all ( ta, 50, LV_PART_MAIN );
  lv_obj_set_style_pad_gap( ta, 10, LV_PART_MAIN );
  lv_obj_set_style_text_color( ta, lv_color_white(), LV_PART_MAIN );

lv_obj_set_align 、lv_obj_align、lv_obj_align_to区别

void lv_obj_set_align(struct _lv_obj_t * obj, lv_align_t align)用于设置obj在父控件中的对齐方式,没有偏移。
void lv_obj_align(struct _lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs)=lv_obj_set_align(obj, align) + lv_obj_set_pos(obj, x_ofs, y_ofs),用于设置obj在父控件中的对齐方式及偏移值。
void lv_obj_align_to(struct _lv_obj_t * obj, const struct _lv_obj_t * base, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs)用于设置obj相对base的对齐方式及偏移值。

/**
 * Change the alignment of an object.
 * @param obj       pointer to an object to align
 * @param align     type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used.
 */
void lv_obj_set_align(struct _lv_obj_t * obj, lv_align_t align);

/**
 * Change the alignment of an object and set new coordinates.
 * Equivalent to:
 * lv_obj_set_align(obj, align);
 * lv_obj_set_pos(obj, x_ofs, y_ofs);
 * @param obj       pointer to an object to align
 * @param align     type of alignment (see 'lv_align_t' enum) `LV_ALIGN_OUT_...` can't be used.
 * @param x_ofs     x coordinate offset after alignment
 * @param y_ofs     y coordinate offset after alignment
 */
void lv_obj_align(struct _lv_obj_t * obj, lv_align_t align, lv_coord_t x_ofs, lv_coord_t y_ofs);

/**
 * Align an object to an other object.
 * @param obj       pointer to an object to align
 * @param base      pointer to an other object (if NULL `obj`s parent is used). 'obj' will be aligned to it.
 * @param align     type of alignment (see 'lv_align_t' enum)
 * @param x_ofs     x coordinate offset after alignment
 * @param y_ofs     y coordinate offset after alignment
 * @note            if the position or size of `base` changes `obj` needs to be aligned manually again
 */
void lv_obj_align_to(struct _lv_obj_t * obj, const struct _lv_obj_t * base, lv_align_t align, lv_coord_t x_ofs,lv_coord_t y_ofs);

lv_obj_set_style_pad_right

lv_obj_set_style_pad_right设置的是当前控件的孩子距离边框的偏移,如下代码表示:btn1的孩子距离按键右边框偏移为10,按键内部一般会有label,就是创建的label会距离右边框偏移为10。

lv_obj_set_style_pad_right(btn1,10,LV_PART_MAIN);

arc

  lv_obj_t *arc = lv_arc_create( parent );
  /* 设置arc大小 */
  lv_obj_set_size( arc, size, size );
  /* 设置背景arc颜色  */
  lv_obj_set_style_arc_color( arc, color, LV_PART_MAIN );
  /* 设置前景arc颜色 */
  lv_obj_set_style_arc_color( arc, color, LV_PART_INDICATOR );
  /* 设置背景arc宽度 */
  lv_obj_set_style_arc_width( arc, 5, LV_PART_MAIN );
  /* 设置前景arc宽度 */
  lv_obj_set_style_arc_width( arc, 5, LV_PART_INDICATOR );
  /* 设置前景arc开合角度 */
  lv_arc_set_angles( arc, 0, 310 );
  /* 设置背景arc开合角度 */
  lv_arc_set_bg_angles( arc, 0, 310 );
  /* 设置arc旋转角度 */
  lv_arc_set_rotation( arc, 25 );
  /* 删除knob显示 */
  lv_obj_remove_style( arc, NULL, LV_PART_KNOB ); /*Be sure the knob is not displayed*/
//  lv_obj_clear_flag(arc, LV_OBJ_FLAG_CLICKABLE);  /*To not allow adjusting by click*/
  lv_obj_align( arc, align, x_ofs, y_ofs );

Layouts

lv_obj_set_flex_flow(obj, flex_flow)

lv_obj_set_flex_flow用于设置obj的孩子是如何布局的,使用该函数会自动将obj的布局方式修改为LV_LAYOUT_FLEX,不需要手动设置lv_obj_set_layout布局方式。

/*
The possible values for flex_flow are:
LV_FLEX_FLOW_ROW Place the children in a row without wrapping
LV_FLEX_FLOW_COLUMN Place the children in a column without wrapping
LV_FLEX_FLOW_ROW_WRAP Place the children in a row with wrapping
LV_FLEX_FLOW_COLUMN_WRAP Place the children in a column with wrapping
LV_FLEX_FLOW_ROW_REVERSE Place the children in a row without wrapping but in reversed order
LV_FLEX_FLOW_COLUMN_REVERSE Place the children in a column without wrapping but in reversed order
LV_FLEX_FLOW_ROW_WRAP_REVERSE Place the children in a row with wrapping but in reversed order
LV_FLEX_FLOW_COLUMN_WRAP_REVERSE Place the children in a column with wrapping but in reversed order
*/
void lv_obj_set_flex_flow(lv_obj_t * obj, lv_flex_flow_t flow)
{
    lv_obj_set_style_flex_flow(obj, flow, 0);
    lv_obj_set_style_layout(obj, LV_LAYOUT_FLEX, 0);
}

速度优化

  1. 优化图像计算速度
    开启 LV_USE_GPU_STM32_DMA2D,使用DMA2D硬件计算。
    在lv_gpu_stm32_dma2d.c中,使能lv_gpu_stm32_dma2d_fill_mask
  2. 优化数据传输速度
    在my_disp_flush中使用DMA (MEM2MEM 模式)传输,替代for循环发送。
static void my_disp_flush( lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p )
{
  int32_t x, y;
  /*It's a very slow but simple implementation.
   *`set_pixel` needs to be written by you to a set pixel on the screen*/
  lcd_block_write( area->x1, area->x2, area->y1, area->y2 );
//  for( y = area->y1; y <= area->y2; y++ )
//  {
//    for( x = area->x1; x <= area->x2; x++ )
//    {
      set_pixel( x, y, *color_p );
//      lcd_set_color( ( uint16_t )( color_p->full ) );
//      color_p++;
//    }
//  }
  HAL_DMA_Start( &hdma_memtomem_dma1_stream3, ( uint32_t )color_p, BANK1_LCD_DATA_REG, ( area->x2 - area->x1 + 1 ) * ( area->y2 - area->y1 + 1 ) );

  if( HAL_DMA_PollForTransfer( &hdma_memtomem_dma1_stream3, HAL_DMA_FULL_TRANSFER, 10 ) == HAL_OK )
  {
    lv_disp_flush_ready( disp );       /* Indicate you are ready with the flushing*/
  }

//    lv_gpu_stm32_dma2d_copy((lv_color_t *)BANK1_LCD_DATA_REG,area->x2 - area->x1 + 1,color_p,area->x2 - area->x1 + 1,area->x2 - area->x1 + 1,area->y2 - area->y1 + 1);
//  MX_DMA2D_Init();
//  HAL_DMA2D_Start(&hdma2d, (uint32_t)color_p, BANK1_LCD_DATA_REG, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1 );
//
//  if( HAL_DMA2D_PollForTransfer( &hdma2d, 10 ) == HAL_OK )
//  {
//    lv_disp_flush_ready( disp );       /* Indicate you are ready with the flushing*/
//  }
}

内存溢出

lvgl V7.7.2内存泄漏问题
当连续退出进入界面时,内存溢出
LVGL:Out of memory,can‘t allocate a new buffer (increase your LV_MEM_SIZE/heap size
内存溢出解决办法及设计

  1. 在退出页面时,使用lv_obj_clean删除页面所有的控件。如果不删除页面控件,连续多次退出进入界面后页面控件会不断的申请内存,内存会溢出。
  2. 在创建页面控件style时,先使用lv_style_reset复位style,再lv_style_init设置样式。如果直接使用lv_style_init创建,连续多次退出进入界面后lv_style_init会不断的申请内存,内存会溢出。
    使用lv_obj_set_style_xx创建的为当前控件独有的Local style,会随着控件的删除而自动删除,不需要手动删除该style(local styles are allocated automatically, and freed when the object is deleted)

lv_table 内存泄漏

LVGL v8.1.0 lv_table 内存泄漏问题

自定义控件

  1. 在“lv_widgets.h”中添加控件头文件位置
    在这里插入图片描述
  2. 在“lv_theme_default.c”中添加控件初始样式
    在这里插入图片描述
  3. 在“lv_conf.h”中添加控件使能配置

在这里插入图片描述

LVGL 样式

  1. 通用样式初始化
    lv_disp_drv_register–>lv_theme_default_init–>style_init(使用lv_style_set_xxx给样式添加内容,此时只是初始化了样式,并没有将样式绑定到控件)
  2. 绑定样式到控件(以textarea举例)
    lv_textarea_create–>lv_obj_class_init_obj–>lv_theme_apply–>apply_theme–>theme.apply_cb–>theme_apply(lv_theme_default.c)(此时使用lv_obj_add_style给控件添加样式)

修改控件指定状态样式

lv_obj_set_style_XXX(xxx, xxx, LV_PART_XXX| LV_STATE_XXX);
LV_PART_XXX用来指示设置的是控件的哪个部分(LV_PART_MAIN表示控件本身)
LV_STATE_XXX用来指示设置的是何状态(如果不写,就是LV_STATE_DEFAULT)

The objects can be in the combination of the following states:

LV_STATE_DEFAULT (0x0000) Normal, released state

LV_STATE_CHECKED (0x0001) Toggled or checked state

LV_STATE_FOCUSED (0x0002) Focused via keypad or encoder or clicked via touchpad/mouse

LV_STATE_FOCUS_KEY (0x0004) Focused via keypad or encoder but not via touchpad/mouse

LV_STATE_EDITED (0x0008) Edit by an encoder

LV_STATE_HOVERED (0x0010) Hovered by mouse (not supported now)

LV_STATE_PRESSED (0x0020) Being pressed

LV_STATE_SCROLLED (0x0040) Being scrolled

LV_STATE_DISABLED (0x0080) Disabled state

LV_STATE_USER_1 (0x1000) Custom state

LV_STATE_USER_2 (0x2000) Custom state

LV_STATE_USER_3 (0x4000) Custom state

LV_STATE_USER_4 (0x8000) Custom state

An object can be in a combination of states such as being focused and pressed at the same time. This is represented as LV_STATE_FOCUSED | LV_STATE_PRESSED.
lv_obj_set_style_bg_color(slider, lv_color_red(), LV_PART_INDICATOR | LV_STATE_FOCUSED);

LVGL无法正常运行

LVGL在执行时,如果控件嵌套很多,LVGL的函数会递归调用,会大量使用stack,如果stack分配不足,会导致堆栈溢出

  1. 在使用FreeRTOS时,stack是由FreeRTOS已分配的内存来分配的,不受系统stack影响
 osThreadDef( gui_task, gui_process_task, osPriorityAboveNormal, 0, 1000 );
 osThreadCreate( osThread( gui_task ), NULL );
  1. 使用裸机,不使用RTOS时,函数调用的堆栈是从系统stack分配的,此时需要加大系统stack,否则可能会出现堆栈溢出
    在这里插入图片描述

在这里插入图片描述

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

LVGL V8 的相关文章

  • LVGL 源码分析大全

    LVGL 源码分析大全目录 1 概述 2 已完成源码分析文章列表 2 1 硬件抽像层 hal 2 2 核心框架 core misc 2 3 定制功能 2 4 内部接口 2 5 案例讲解 2 6 其它 3 样式 4 组件 5 主题 6 开发环
  • 【Qt教程】3.1 - Qt5 event事件、Label控件的鼠标事件捕获

    1 event简介 事件 event 是由系统或者Qt本身在不同的时刻发出的 当用户按下鼠标 敲下键盘 或者是窗口需要重新绘制的时候 都会发出一个相应的事件 一些事件在对用户操作做出响应时发出 如键盘事件等 另一些事件则是由系统自动发出 如
  • LVGL v7 使用心得及工具分享

    1 v7与v8的区别 对于v7来说 并没有v8优化的那么全面和完善 有些好用的功能在v7中也并未实现 但这并不代表v7就不好 在稳定性和兼容性这方面v7做的比v8好很多 虽然现在大多数都能上v8 其次v7与v8是两个大版本变动 很多API都
  • 【Qt教程】2.6 - Qt5 自定义控件封装

    自定义控件是将原有控件组合 封装 并填入自定义功能 留出适当的函数接口 方便其他控件的调用 设计窗口时 可以将控件拖入 方便模块化设计 GitHub代码仓库 Qt学习例程 1 建立工程 新建自定义控件 创建widget工程 新建控件 Add
  • LVGL7.5版本 触摸与键盘输入(API)对接(一)

    LVGL7 5版本 触摸与键盘输入 LVGL7 5版本 触摸与键盘输入 API 对接 一 前言 一 indev输入设备的种类介绍 二 移植Touchpad与Keypad Touchpad Keypad Keypad测试示例 本篇完 LVGL
  • LVGL8学习之row and a column layout with flexbox

    这一篇来学习一下基于flexbox 柔性盒子 简单行和列布局 还是通过codeblock来模拟代码的运行 可设置layout对象内部的水平和竖直填充 以及布局内各item之间的间隔填充 代码如下 void lv flex layout te
  • LCD 亮度相关(背光) 正负压相关

    LCD 亮度相关 背光 kernel msm 3 18 drivers video msm mdss mdss fb c 调用led classdev register 注册lcd backlight sys class leds lcd
  • Python GUI 设计(一)———Tkinter窗口创建、组件布局

    本篇开始介绍用Python的Tkinter模块来设计图形化界面 尽量用简洁的语言和实例让读者能看明白 轻松入门 1 1 创建窗口 tkinter模块是Pyhton自带的标准GUI库 可以直接导入 导入tkinter模块后 可以使用下面的方法
  • Unity3D笔记第三天——GUI

    GUI GUI是Graphical User Interface的缩写 Unity的图形界面系统能容易和快速创建出各种交互界面 与传统的方法 创建GUI对象 标出位置 再写对应的事件函数不同 只需要用很少的代码 就可以把这些工作搞定 原理是
  • LCD和LED屏幕的工作原理总结

    1 点阵取模原理之横向取模与纵向取模 1 1 针式打印机 针式打印机16针是纵向排列 每次打印垂直的16bit 然后右移一bit 继续下列打印 字节的MSB表示最上面的点 字节LSB表示最下面的点 由于汉字字模的点阵是横向排列的 而提供给打
  • 使用RT-Thread studio 把LVGL移植到RT-Thread 上

    使用RT Thread studio 移植 LVGL到RT Thread中 其实RT Thread 移植LVGL 官方已经出来很多教程 但是但是他出的教程都是基于一些他们适配的BSP 但是其他不适配的怎么办呢 当然是手搓了 前期准备 1 在
  • LVGL 8.1.0 父子控件之间坐标偏移的处理

    8 1 0版本去掉了fit配置 而系统样式会自带偏移处理 为了解决这一问题 可以使用样式padding来处理 lv style set pad
  • 我所理解的DRM显示框架

    什么是DRM DRM全称是DirectRenderingManager 是linux主流的一种显示框架 支持多图层合成 为用户图层提供统一的API libdrm 来访问GPU 实现统一管理 它是为了解决多个程序对video card访问协同
  • 用Java开发贪食蛇小游戏

    用Java开发贪食蛇小游戏 一 实验内容 1 实现贪吃蛇游戏基本功能 屏幕上随机出现一个 食物 称为豆子 上下左右控制 蛇 的移动 吃到 豆子 以后 蛇 的身体加长一点 得分增加 蛇 碰到边界或 蛇头与蛇身相撞 蛇死亡 游戏结束 为游戏设计
  • flutter之BottomNavigationBar

    1 BottomNavigationBar BottomNavigationBar即是底部导航栏控件 显示在页面底部的设计控件 用于在试图切换 底部导航栏包含多个标签 图标或者两者搭配的形式 简而言之提供了顶级视图之间的快速导航 2 构造函
  • YOLOv8目标检测PySide6 GUI可视化界面

    课程链接 https edu csdn net course detail 38552 YOLOv8目标检测PySide6 GUI可视化界面效果图如下 YOLOv8目标检测PySide6 GUI可视化界面支持本地图片和视频推理 摄像头实时视
  • QT实现电子时钟

    QT实现电子时钟 实现方法 实现效果 代码 头文件 源文件 实现方法 主窗口QDialog调用QLCDNumber窗口 实现效果 代码 头文件 dialog h ifndef DIALOG H define DIALOG H include
  • 使用 PyQt 处理 SQL 数据库:基础知识

    目录 Connecting PyQt to an SQL Database 创建数据库连接 处理多个连接 使用不同的 SQL Divers 打开数据库连接 Running SQL Queries With PyQt 执行静态 SQL 查询
  • 使用 Python、PyQt 和 SQLite 构建联系簿

    目录 演示 Python 联系手册 项目概况 先决条件 Step 1 Creating the Contact Book s Skeleton App With PyQt 构建通讯录项目 创建应用程序的主窗口 编码和运行应用程序 第 2 步
  • 使用 Tkinter 进行 Python GUI 编程

    目录 Building Your First Python GUI Application With Tkinter 添加小部件 检查你的理解情况 Working With Widgets 使用标签小部件显示文本和图像 使用按钮小部件显示可

随机推荐

  • Unity3D——在Unity3D中使用关键帧动画的注意事项

    1 记录Animation动画复位的一个注意事项 最近想做一个动画的分步播放 但是在实现动画复位时发现以前用的动画复位的代码不起作用了 Animation AnimationObj GetComponent
  • DLLNotFoundException:xxx tolua... 错误打印

    一 DLLNotFoundException介绍 首先区分一个问题只要是与DLLNotFoundException相关的必然是丢失了DLL文件 不管是安卓还是Window还是Mac原理都是一样的 二 Plugins文件夹 既然是跟DLLNo
  • docker 安装 nginx-proxy-manager

    一 拉取镜像 docker pull jc21 nginx proxy manager 二 部署运行 docker run restart always name nginxmanager d p 80 80 p 81 81 p 443 4
  • Ubuntu14.04 安装Android studio

    Ubuntu14 04 安装Android studio Android Studio 官方 Android IDE Android Studio 提供用于为各类 Android 设备开发应用的最快速的工具 利用世界一流的代码编辑 调试 性
  • Linux字符设备驱动file_operations详解

    struct file operations struct file operations在Fs h这个文件里面被定义的 如下所示 struct file operations struct module owner 拥有该结构的模块的指针
  • Js中的枚举

    原文见 Js中的枚举 在JavaScript目前的版本中 没有枚举这个概念 当然 ECMA 262第三版中已经将enum作为关键字保留 然而 如同JavaScript中没有class一样 但我们仍然可以通过间接的方式 JSON来实现它 如下
  • 合并Dwg文件

    尝试用 NET平台C 写个打开其他DWG文件并读取所有内容 打包成块后再插入当前文档的程序 1 打开其他指定文件没问题 2 打包成块程序这里出了问题3 但若是直接在当前文档创建直线 再运行打包成块程序就没问题 不知道是何原因 可有大神出来指
  • 快手磁力金牛和小店通的区别

    手磁力金牛平台是全新电商营销平台磁力金牛 磁力金牛平台将集合快手粉条 小店通 真正打通公域私域流量 实现全站数字化营销 核心提示 磁力金牛平台整合了小店通 粉条的投放链路 公域私域流量融合 磁力金牛平台整合了小店通 粉条的投放链路 公域私域
  • win7 svn服务器搭建过程

    svn简介 https baike baidu com item subversion 7818587 fr aladdin SVN服务端分为 Subversion和VisualSVN Server 这里 我选择了VisualSVN Ser
  • Java笔记:UDP基础使用与广播

    文章目录 目的 作为客户端使用 作为服务器使用 广播 广播地址获取 广播功能演示 总结 目的 UDP是比较基础常用的网络通讯方式 这篇文章将介绍Java中UDP基础使用的一些内容 本文中使用 Packet Sender 工具进行测试 其官网
  • Java使用DES加密解密

    一 DES算法 DES Data Encryption Standard 数据加密标准 它是由IBM公司研制的一种对称密码算法 DES是一个分组加密算法 典型的DES以64位分组对数据加密 加密和解密用的是用一个算法 总长度64位 8字节
  • Spring:基于xml文件的控制反转(ioc)

    1 环境搭建 导入spring使用最基本的坐标
  • VMware Workstation 不可恢复错误: (vmx)

    errors VMware Workstation 不可恢复错误 vmx Exception 0xc0000006 disk error while paging has occurred 日志文件位于 K vmware centos vm
  • 运用决策表设计测试用例

    逻辑关系 逻辑关系 logic relationship 即 依赖关系 在项目管理中 指表示两个活动 前导活动和后续活动 中一个活动的变更将会影响到另一个活动的关系 强制依赖关系 所做工作中固有的依赖关系 可自由处理的依赖关系 由项目队伍确
  • MyBatis:尝试解决Spring Boot集成MyBatis 懒加载时序列化失败的三种方法以及原因FAIL_ON_EMPTY_BEANS

    MyBatis 解决No serializer found for class org apache ibatis executor loader javassist JavassistProxyFactory EnhancedResult
  • python3 Flask 简单入门(MVC模板类)

    跟上一篇文章一样的内容 Flask默认支持的模板是jinja2 jinja2简单实用 1 在Jinja2模板中 我们用 name 表示一个需要替换的变量 很多时候 还需要循环 条件判断等指令语句 在Jinja2中 用 表示指令 2 循环输出
  • win10 装黑苹果 完整教程

    一 材料准备 1 虚拟机软件VMware 2 适用于Windows版本的VMware解锁安装Mac OS的补丁 3 Mac OS X 10 10的黑苹果镜像 以上材料我都为你贴心地准备齐了 在我的云盘获取 链接 https pan baid
  • VUE3+Element-Plus form表单封装

    VUE3 Element Plus form表单封装 新建form组件页面 创建index vue 新建form组件页面 在components中创建新组件 将需要的form表单中常用的UI组件引入 vue3创建组件和vue2中多少有点区别
  • 大学《数据库原理与技术》复习题(二)

    数据库复习题 一 选择题 1 B 是按照一定的数据模型组织的 长期存储在计算机内 可为多个用户共享的数据的集合 A 数据库系统 B 数据库 C 关系数据库 D 数据库管理系统 2 数据库系统的基础是 A 数据结构 B 数据库管理系统 C 操
  • LVGL V8

    本文适用于LVGL V8版本 LVGL simulator vs2019 官方工程 lv sim visual studio 使用注意事项 1 将官方工程从github上下载下来 最好使用git 将整个工程clone下来 因为工程内部有依赖