arduino tft 方向_ESP32在Arduino環境下玩轉 LVGL,ESP32移植LVGL詳細教程

微信關注?“DLGG創客DIY”設為“星標”,重磅干貨,第一時間送達。
?

轉載自慕容流年 https://me.csdn.net/qq_41868901

?

1. LVGL簡介

LittlevGL是一個免費的開源圖形庫,提供了創建嵌入式GUI所需的一切,具有易于使用的圖形元素、漂亮的視覺效果和低內存占用。77f3cbb1214c1a44ffb3b1971650831f.gif使用效果可以去:LittlevGL開源GUI看看,使用效果真的很是驚艷,這里使用群友的一張圖來看看近年來各種GUI圖形庫的發展趨勢:1f043d8cb48f50e1dcb0b445e33c4ed2.png

2. 演示效果

對于「ESP32」上使用「LVGL」,我在三種設備上進行了測試,屏幕驅動型號分別為:「1.14寸ST7789V」「3.5寸ILI9488」「3.5寸ST7796S」,為了方便對比,我在他們上邊創建了同樣的儀表控件,下面請看演示效果:

  1. 「我自己的小手表」我在前幾個月基于ESP32制作的小手表,集成多種功能,硬件資源有:「1.14寸屏幕」「自動下載電路」「溫濕度」「RTC時鐘」「大氣壓計」「光亮度傳感」「加速度計」「撥輪按鍵」「TFT卡」「蜂鳴器」「振動馬達」「WS2812RGB燈」「鋰電池管理」,可以說是可以滿足目前的開發要求了;「項目地址 :」 「ESP32-Watch」e455d086a94b9a06c5dcb8d7fe96bf98.png

  2. 「啟明云端GUI開發板」該開發板是「啟明云端」公司推出的一款基于ESP32的GUI開發板,搭載了「3.5寸ST7796S屏幕」「FT6336U電容觸摸」,開發平臺為自研的「8ms創新視界」拖拽式平臺,有點類似「Mixly」吧,具體使用效果請查看:ESP32GUI開發板
    屏幕和觸摸的驅動,我也進行了移植和修改,下面放出修改后的庫:
    ==①「3.5寸ST7796S屏幕驅動」==? ? ? ? ? ? ? ? ? ? ? ? ? ??? ==②「FT6336U電容觸摸驅動」==
    移植了LVGL儀表盤的演示效果:

    a7c59111643c02294f5e9295566643f6.png

  3. 「3.5寸ILI9488屏幕」這種屏幕相信某寶能隨處買到了,屏幕硬件為:「3.5寸ILI9488屏幕」「XPT2046電阻觸摸」,屏幕分辨率為480x320,在初始化觸摸屏時,也要注意觸摸分辨率也要初始化為480x320,并設置好觸摸方向,下面看演示效果:99249e22d9fc11ce02f2c1fcd390dd2a.png

看完這些演示,你應該明白我為什么使用LVGL了吧,同樣的GUI源碼可以很方便的在各種移植了LVGL的硬件上使用,達到同樣的演示效果,這是我最喜歡的part了

3. 開始移植

3.1 源碼準備

3.1.1 目前「lvgl」在GitHub上已經有了Arduino上的庫支持,庫名字為 「lv_arduino」進去后你可以發現該庫已經有很多版本了,可以根據自己的喜好下載,并放入到你的「Arduino」「Library」文件夾下:

  1. 「lv_arduino V2.1.5」 版本對應的 「LVGL」 版本為V6,適合已經習慣 「LittlevGL V6」 的老師傅們了。

  2. 「lv_arduino V3.0.1」 版本對應的 「LVGL」 版本為V7,適合正在學習的新人們,但是無法兼容老版本的GUI程序。

3.1.2 完成以上操作,你可以根據你選擇的 「lv_arduino」 ?版本下載 「LVGL」 的例程進行學習,版本對應關系請看上述“1和2”,例程鏈接為:「lv_examples」

3.1.3 ?「lv_arduino」 給出的 examples 使用的是 ?「TFT_eSPI」 庫,這個庫刷屏速度比其他庫要快,配合 lv_arduino 的例程可以直接使用。

3.2 學習文檔

  1. LVGL V7.3.1開發文檔
  2. LVGL V7.1.0開發文檔
  3. LVGL V6.1.2開發文檔

當然,嫌麻煩的,可以把文檔下載下來,進去之后頁面頂部有PDF下載按鈕。但是,這種英文文檔對我們來說著實不友好,尤其是我這種英語四級還沒通過的zhazha,還記得我之前提過GUI代碼是通用的嘛,因此你可以學習其他廠商的LVGL教程,畢竟GUI代碼通用,只是接口移植部分不一樣而已。

  1. 正點原子手把手教你學littleVGL【輕量級開源GUI】
  2. 微雪電子 STM32之littlevGL系列教程

3.3 移植

==由于屏幕眾多,就不一一演示移植過程了,下面就以最簡單的 「3.5寸 ILI9488」屏幕為例,「lv_arduino」 庫版本為 「lv_arduino V3.0.1」 ,購買鏈接就不放出來了,大家通過圖片在某寶搜索即可,尺寸隨意,但是我感覺3.5寸顯示更漂亮:==96b94318f291f15d7aba5555a26dd19b.png屏幕的引腳說明為:a69bcc5ec30484328cc195168d658339.png

【屏幕驅動】:「TFT_eSPI」
【觸摸驅動】:「TFT_Touch」
【LVGL庫】:「lv_arduino」

3.3.1 ?第1步(下載庫)

「TFT_eSPI」「TFT_Touch」「lv_arduino」 三個庫放入到你的「Arduino」「Library」文件夾下。

3.3.2 ?第2步(修改屏幕驅動庫TFT_eSPI)

打開「Arduino」「Library」文件夾下的「TFT_eSPI」目錄,打開 「User_Setup_Select.h」 文件:

將第22行的

#include????????????//?Default?setup?is?root?library?folder`??

注釋掉為

//#include????????????//?Default?setup?is?root?library?folder`??

將第47行的

//#include????????????//?Setup?file?for?ESP32?and?ILI9488?SPI?bus?TFT`??

取消注釋為

#include????????????//?Setup?file?for?ESP32?and?ILI9488?SPI?bus?TFT`??

完成以上操作后打開 「User_Setups」 目錄下的 「Setup21_ILI9488.h」 文件:

將其內容刪掉并修改為:

//?See?SetupX_Template.h?for?all?options?available

#define?ILI9488_DRIVER

//#define?TFT_INVERSION_OFF

#define?TFT_MISO?19?//?(leave?TFT?SDO?disconnected?if?other?SPI?devices?share?MISO)
#define?TFT_MOSI?23
#define?TFT_SCLK?18
#define?TFT_CS????15??//?Chip?select?control?pin
#define?TFT_DC????2??//?Data?Command?control?pin
#define?TFT_RST???4??//?Reset?pin?(could?connect?to?RST?pin)
#define?TFT_BL????21?//背光引腳

#define?LOAD_GLCD???//?Font?1.?Original?Adafruit?8?pixel?font?needs?~1820?bytes?in?FLASH
#define?LOAD_FONT2??//?Font?2.?Small?16?pixel?high?font,?needs?~3534?bytes?in?FLASH,?96?characters
#define?LOAD_FONT4??//?Font?4.?Medium?26?pixel?high?font,?needs?~5848?bytes?in?FLASH,?96?characters
#define?LOAD_FONT6??//?Font?6.?Large?48?pixel?font,?needs?~2666?bytes?in?FLASH,?only?characters?1234567890:-.apm
#define?LOAD_FONT7??//?Font?7.?7?segment?48?pixel?font,?needs?~2438?bytes?in?FLASH,?only?characters?1234567890:.
#define?LOAD_FONT8??//?Font?8.?Large?75?pixel?font?needs?~3256?bytes?in?FLASH,?only?characters?1234567890:-.
#define?LOAD_GFXFF??//?FreeFonts.?Include?access?to?the?48?Adafruit_GFX?free?fonts?FF1?to?FF48?and?custom?fonts

#define?SMOOTH_FONT


//?#define?SPI_FREQUENCY??20000000
//?#define?SPI_FREQUENCY??27000000
//?#define?SPI_FREQUENCY??40000000
//?#define?SPI_FREQUENCY??80000000

#define?SPI_FREQUENCY??60000000

//?Optional?reduced?SPI?frequency?for?reading?TFT
#define?SPI_READ_FREQUENCY??16000000

#define?SPI_TOUCH_FREQUENCY??2500000

3.3.3 ?第3步(ESP32與屏幕接線)

屏幕引腳ESP32引腳
VCC5V
GNDGND
CSIO15
RESETIO4
DC/RSIO2
SDI(MOSI)IO23
SCKIO18
LEDIO21
SDO(MISO)IO19
————
T_CLKIO25
T_CSIO26
T_DINIO27
T_DOIO14
T_IRQ不接

3.3.4 第4步 (測試例程)

/**
*?@name:liuzewen
*?@title:lvgl_test
*?@time:2020/8/14
*/
#include?
#include?
#include?
#include?
#include?

#define?LVGL_TICK_PERIOD?60

TFT_eSPI?tft?=?TFT_eSPI();?/*?TFT?instance?*/
static?lv_disp_buf_t?disp_buf;
static?lv_color_t?buf[LV_HOR_RES_MAX?*?10];

lv_obj_t?*?slider_label;
int?screenWidth?=?480;
int?screenHeight?=?320;

//觸摸
#define?DOUT?14??/*?Data?out?pin?(T_DO)?of?touch?screen?*/
#define?DIN??27??/*?Data?in?pin?(T_DIN)?of?touch?screen?*/
#define?DCS??26??/*?Chip?select?pin?(T_CS)?of?touch?screen?*/
#define?DCLK?25??/*?Clock?pin?(T_CLK)?of?touch?screen?*/
TFT_Touch?touch?=?TFT_Touch(DCS,?DCLK,?DIN,?DOUT);
int?X_Raw?=?0,?Y_Raw?=?0;

#if?USE_LV_LOG?!=?0
/*?Serial?debugging?*/
void?my_print(lv_log_level_t?level,?const?char?*?file,?uint32_t?line,?const?char?*?dsc){

??Serial.printf("%s@%d->%s\r\n",?file,?line,?dsc);
??delay(100);
}
#endif

/*?Display?flushing?*/
void?my_disp_flush(lv_disp_drv_t?*disp,?const?lv_area_t?*area,?lv_color_t?*color_p){
??uint16_t?c;

??tft.startWrite();?/*?Start?new?TFT?transaction?*/
??tft.setAddrWindow(area->x1,?area->y1,?(area->x2?-?area->x1?+?1),?(area->y2?-?area->y1?+?1));?/*?set?the?working?window?*/
??for?(int?y?=?area->y1;?y?<=?area->y2;?y++)?{
????for?(int?x?=?area->x1;?x?<=?area->x2;?x++)?{
??????c?=?color_p->full;
??????tft.writeColor(c,?1);
??????color_p++;
????}
??}
??tft.endWrite();?/*?terminate?TFT?transaction?*/
??lv_disp_flush_ready(disp);?/*?tell?lvgl?that?flushing?is?done?*/
}

bool?my_touchpad_read(lv_indev_drv_t?*?indev_driver,?lv_indev_data_t?*?data){
????uint16_t?touchX,?touchY;

????bool?touched?=?touch.Pressed();//檢測觸摸是否按下
????//獲取屏幕坐標
????touchX?=?touch.X();
????touchY?=?touch.Y();

????if(!touched)
????{
??????return?false;
????}

????if(touchX>screenWidth?||?touchY?>?screenHeight)
????{
??????Serial.println("Y?or?y?outside?of?expected?parameters..");
??????Serial.print("y:");
??????Serial.print(touchX);
??????Serial.print("?x:");
??????Serial.print(touchY);
????}
????else
????{

??????data->state?=?touched???LV_INDEV_STATE_PR?:?LV_INDEV_STATE_REL;?
??
??????/*Save?the?state?and?save?the?pressed?coordinate*/
??????//if(data->state?==?LV_INDEV_STATE_PR)?touchpad_get_xy(&last_x,?&last_y);
?????
??????/*Set?the?coordinates?(if?released?use?the?last?pressed?coordinates)*/
??????data->point.x?=?touchX;
??????data->point.y?=?touchY;
??
??????Serial.print("Data?x");
??????Serial.println(touchX);
??????
??????Serial.print("Data?y");
??????Serial.println(touchY);

????}

????return?false;?/*Return?`false`?because?we?are?not?buffering?and?no?more?data?to?read*/
}

lv_obj_t?*?gauge1;
long?date?=?0;
uint8_t?date_cotter?=?0;

void?setup()?{

??//屏幕背光采用PWM調光
??ledcSetup(10,?5000/*freq*/,?10?/*resolution*/);
??ledcAttachPin(TFT_BL,?10);
??analogReadResolution(10);
??ledcWrite(10,1023);

??Serial.begin(115200);?/*?prepare?for?possible?serial?debug?*/

??lv_init();

??#if?USE_LV_LOG?!=?0
????lv_log_register_print_cb(my_print);?/*?register?print?function?for?debugging?*/
??#endif
??
??//屏幕初始化
??tft.begin();?/*?TFT?init?*/
??tft.setRotation(1);

??//觸摸初始化
??touch.setCal(481,?3395,?755,?3487,?480,?320,?1);
??//旋轉
??touch.setRotation(3);

??lv_disp_buf_init(&disp_buf,?buf,?NULL,?LV_HOR_RES_MAX?*?10);

??//顯示刷新接口
??lv_disp_drv_t?disp_drv;
??lv_disp_drv_init(&disp_drv);
??disp_drv.hor_res?=?screenWidth;
??disp_drv.ver_res?=?screenHeight;
??disp_drv.flush_cb?=?my_disp_flush;
??disp_drv.buffer?=?&disp_buf;
??lv_disp_drv_register(&disp_drv);

??//觸摸板輸入接口
??lv_indev_drv_t?indev_drv;
??lv_indev_drv_init(&indev_drv);?????????????/*Descriptor?of?a?input?device?driver*/
??indev_drv.type?=?LV_INDEV_TYPE_POINTER;????/*Touch?pad?is?a?pointer-like?device*/
??indev_drv.read_cb?=?my_touchpad_read;??????/*Set?your?driver?function*/
??lv_indev_drv_register(&indev_drv);?????????/*Finally?register?the?driver*/

???//放置儀表盤控件
????static?lv_color_t?needle_colors[1];
????needle_colors[0]?=?LV_COLOR_PURPLE;
????//gauge控件
????gauge1?=?lv_gauge_create(lv_scr_act(),?NULL);
????lv_gauge_set_needle_count(gauge1,?1,?needle_colors);
????lv_obj_set_size(gauge1,?300,?300);
????lv_obj_align(gauge1,?NULL,?LV_ALIGN_CENTER,?0,?0);
????//設置儀表指針指向的值
????lv_gauge_set_value(gauge1,?0,?0);

????date?=?millis();
}

void?loop()?{
??lv_task_handler();?/*?let?the?GUI?do?its?work?*/
??delay(5);
??if(millis()-date>20)
??{
????date?=?millis();
????date_cotter++;
????date_cotter?=?date_cotter>100?0:date_cotter;
????//刷新儀表指針指向的值
????lv_gauge_set_value(gauge1,?0,?date_cotter);
????Serial.printf("date_cotter:?%d\n",date_cotter);
??}
}

上傳程序到你的ESP32開發板,即可看到屏幕上出現儀表控件,并且指針也在轉圈圈,哈哈!

3.3.5 第5步 (跑一下官方demo)

最后在啟明云端的板子和3.5寸的ILI9488屏幕上跑一下LVGL官方的demo程序lv_demo_widgets(),下面放出演示效果:5b75502e88db833ff3f83d177c1c7fd7.png23fbb68c2b64f807e80fad49732f805d.png

3.3.6 第6步 (注意事項)

==如果你按照過程操作,卻未看到預想的效果,請注意重新認真看一遍本文檔,并留意其中每一句話。==

?

轉載自慕容流年 https://me.csdn.net/qq_41868901

?

0f2dd2f6ea3b6f28642cab5d90734ab2.png

56a5911f7d7ab532fe0be9652cc61d88.png你點的每個在看,我都當成喜歡

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/528884.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/528884.shtml
英文地址,請注明出處:http://en.pswp.cn/news/528884.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

linux內核開文件系統,內核必須懂(二): Linux文件系統初探

目錄前言文件系統結構新建文件和inode文件創建過程inode解析打開文件參考最后前言這次來說文件系統. 文件系統是非常重要的, 提高磁盤使用率, 減小磁盤磨損等等都是文件系統要解決的問題. 市面上的文件系統也是數不勝數, 比較常用的像ext4, xfs以及ntfs等等, 國內的像鵝廠的tfs…

gps衛星位置計算程序matlab_科研項目 | BD/ GPS衛星導航仿真測試系統研究

一、項目背景在移動互聯和互聯網的時代&#xff0c;衛星導航定位已經成為生活中不可或缺的部分。目前&#xff0c;我國的交通、銀行、電力、采礦、測繪等部門以及大眾化市場都需要大量的定位、授時服務。許多企業也形成了覆蓋衛星導航相關材料及元器件、衛星導航芯片、衛星導航…

linux docker權限,linux - 如何解決ubuntu中的docker權限問題? - Ubuntu問答

問題描述我已經按照here的說明安裝了docker。我使用Ubuntu Trusty 14.04 (LTS) (64-bit)。安裝過程中的一切都很好。另外&#xff0c;命令$ sudo docker run -i -t ubuntu /bin/bash可以很好地完成(在打開的控制臺中鍵入”exit”之后。但是當我嘗試執行其他操作時&#xff0c;我…

python虛擬人臉生成_GitHub - 597111463/seeprettyface-generator-yellow: 這是一個用StyleGAN訓練出的黃種人人臉生成器...

黃種人人臉生成器注明&#xff1a;之前做的一些有意思的人臉生成器&#xff0c;現在全部開源分享出來。它的主要作用是可生成制作各類型的人臉素材&#xff0c;供我們任意使用且無須擔心人臉版權的問題。在定制人臉上&#xff0c;開源的全系列生成器包括&#xff1a;黃種人臉生…

Linux輸入密碼接口,Linux下搭建接口自動化測試平臺

前言我們今天來學習一下在Linux下如何搭建基于HttpRunner開發的接口自動化測試平臺吧&#xff01;需要在Linux上提前準備的環境(下面是本人搭建時的環境)&#xff1a;1&#xff0c;Python 3.6.8 (可參考隨筆&#xff1a;Linux學習6-安裝Python3.6)2&#xff0c;MySQL 5.7(可參考…

python構建字典實現英文大寫字母與ascii編碼的轉換_Python:將復雜的字符串字典從Unicode轉換為ASCII...

作為從JSON API調用解析的多級字典,我有很多輸入.字符串都是unicode,這意味著有很多ustuff like this.我正在使用jq來處理結果,需要將這些結果轉換為ASCII.我知道我可以編寫一個函數來像這樣轉換它:def convert(input):if isinstance(input, dict):ret {}for stuff in input:r…

linux下查看windows文件夾大小,如何從Windows命令行檢查文件夾的大小?

我意識到這個問題要求使用進行文件大小分析CMD line。但是&#xff0c;如果您愿意使用它&#xff0c;PowerQuery (Excel add-in, versions 2010)則可以創建一些非常引人注目的文件大小分析。下面的腳本可以粘貼到空白查詢中&#xff1b;您唯一需要做的就是添加一個名為“ param…

python多進程傳遞參數_急急急, Python 多進程,如何傳遞 epoll?

102019-06-16 15:39:41 08:00NoAnyLove 好的好的&#xff0c;我查了下&#xff0c;說 IPC 或向 worker 參數傳遞的東西必須要能 pickle&#xff0c;不然就報錯&#xff0c;那就是 select.epoll 是不支持的。error&#xff1a;TypeError: cant pickle select.epoll objects。代碼…

linux查看一小時之內的日志,linux – 在[timespan]內(例如最后一小時)查找日志文件中的條目...

我的服務器CPU使用率不高&#xff0c;我可以看到Apache正在使用太多的內存。我有一種感覺&#xff0c;我正在用一個IP進行DOS.-也許你可以幫我找到他&#xff1f;我已經使用以下行找到10個最“活躍”的IP&#xff1a;cat access.log | awk {print $1} |sort |uniq -c |sort -n …

圖像語義分割_圖像語義分割(9)-DeepLabV3: 再次思考用于圖像語義分割的空洞卷積...

論文地址 &#xff1a;Rethinking Atrous Convolution for Semantic Image Segmentation論文代碼&#xff1a;Github鏈接1. 摘要文章主要的工作&#xff1a;使用空洞卷積來調整濾波器的感受野并控制特征圖分辨率使用不同空洞率的空洞卷積的串聯或者并行操作來分割不同尺度的目標…

linux系統列表,Linux常用系統調用列表-20210415054405.docx-原創力文檔

LinuxLinux常用系統調用列表作者&#xff1a;雷震 2002年3月本文列出了大部分常見的Linux系統調用&#xff0c;并附有簡要中文說明。以下是Linux系統調用的一個列表&#xff0c;包含了大部分常用系統調用和由系統調用派 生出的的函數。按照慣例&#xff0c;這個列表以man pages…

sql replace 雙引號變單引號_sql-匯總、排序以及分析思路

一、匯總函數注&#xff1a;匯總函數&#xff0c;如果輸入是列名&#xff0c;計算會把null 排除在外&#xff0c;count(*)對所有的行進行計數二、如何用sql解決業務問題注1&#xff1a;空值(null)的排序,排序是最小的&#xff0c;例如select * from tea order by tea_name注2&a…

linux subversion 根目錄檢出,經驗總結:詳解Linux下Subversion的安裝配置記錄 下

上節介紹額Linux下Subversion的安裝問題&#xff0c;本節介紹Linux下Subversion配置問題&#xff0c;你可以和Windows下Subversion的安裝配置做一個對比&#xff0c;你就會發現在這兩種操作系統中Subversion的不同運行機制。第二章配置本系統采用為每個項目單獨建一版本庫的策略…

python用戶名密碼登錄退出_用戶登錄登出

一、功能需求分析1.登錄功能分析1.1登錄流程1.2功能(一個請求為一個功能)&#xff5e;登錄頁面&#xff5e;登錄功能&#xff5e;登出功能二、登錄頁面1.接口設計1.1.接口說明類目                  說明請求方式                GETurl定義…

openwrt是嵌入式linux,非常方便的OpenWrt的嵌入式Linux開發環境

今天聽中央經濟廣播電臺說,今年有559萬大學畢業生,大學生的就業形式嚴峻.我想那些精通Linux開發的畢業大學生們,估計一點也不用擔心,因為他們已經不再是一顆大白菜了.最近在幫一個朋友把OpenWrt移植到一塊單板上,有一些心得,分享給大家.OpenWrt是一個很好的學習Linux的平臺,而且…

linux添加有效群組,Linux中的有效群組和初始群組

在Linux中&#xff0c;每個賬號都可以加入多個群組&#xff0c;那用戶登錄后默認的用的是哪個群組呢&#xff1f;關于這個問題就要說說有效群組和初始群組了。在用戶賬號信息文件/etc/passwd中&#xff0c;那個由冒號分割的7個欄目中&#xff0c;第四個欄目是群組ID(GID)&#…

php多個表中查找數據_HeidiSQL 免費的可視化數據庫管理工具

HeidiSQL是一款免費的軟件&#xff0c;并且易于學習和使用。HeidiSQL讓你從數據庫內可視化的讀寫數據、結構體。它支持MariaDB、MySQL、Microsoft SQL、PostgreSQL等數據庫。功能免費且開源內置中文在同個窗口連接多個服務支持以命令行形式連接服務連接支持SSH、SSL創建修改表、…

嵌入式linux啟動根文件系統,嵌入式Linux根文件系統制作和掛載

嵌入式Linux系統由三部分組成&#xff1a; uboot、kernel、根文件系統&#xff0c; 還是這張老圖這里的根文件系統可以說是包含兩個部分&#xff1a; 一個是根&#xff0c;一個是文件系統那么什么是根呢&#xff1f;哈哈 其實根表示的就是第一個的意思下面貼張圖看看整個根文件…

sqlite 查詢 支持多用戶同時_SQLite支持多進程同時操作數據庫文件嗎?

多個進程可以同時打開同一個數據庫。多個進程可以同時執行SELECT。但是&#xff0c;只有一個進程可以隨時對數據庫進行更改。SQLite使用讀/寫鎖來控制對數據庫的訪問。(在Win95 / 98 / ME下&#xff0c;缺少對讀寫鎖的支持&#xff0c;而是使用概率模擬。)但請注意&#xff1a;…

python 字符串處理 字典_python 字符串和字典

一、字符串操作name "my name is \t {name} and i am {year} years old"1.首字母大寫print(name.capitalize())2.統計字符串中相同的字符print(name.count("n"))3.格式化字符串print(name.center(50,"-"))#打印50個-&#xff0c;把name的值放中…