網頁

2020年11月6日 星期五

手機 App 程式設計- AppInventor2 -飲料點餐系統2,多 Screen (螢幕,畫面)的應用+TinyDB + Texting

(2022/06/19)
註: 阿旺師已開發新的專案,取代本專案,所以請看比較新的文章:

題目

本程式使用到二個 Screen(螢幕,也有稱為畫面)。

  1. 第1個Screen , 可以輸入人數、奶茶咖啡類和果汁類二個分類下的飲料名稱,並可儲存這些設定。再進入飲料點餐系統。
  2. 第2個Screen,顯示座號挑選清單。飲料分成2個分類可選,如「奶茶咖啡類」和「果汁類」 。   每個分類下面還有各種飲料名稱可選。
  3. 按「飲料點選結果」鈕,顯示每一個人點選的結果。按「統計結果」鈕,顯示每一種飲料被點 選的次數。
  4. 將統計結果(即訂單),使用簡訊發送給店家。

本題是修改自阿旺師磨書坊  :手機 App 程式設計- AppInventor2 -飲料點餐系統,多 Screen (螢幕)的應用

執行畫面







素材

本 app的 icon (圖示),可自己繪製或網路搜尋。

圖片來源 :https://www.stockio.com/free-icon/beachy-icons-soft-drink

進入 Appinventor 

Google 輸入 appinventor 。
選 「MIT App Inventor」。
選 「Create Apps」。

網址為 :http://ai2.appinventor.mit.edu/

你應該先看此篇文章 「手機 App 程式設計- AppInventor2 -飲料點餐系統,多 screen 元件的應用」,先完成此專案,如名稱為 :select_drink。

開啟原來的舊專案(My Projects/My projects),選舊專案,如 select_drink,按一下,打開此專案。

另存新專案(My Projects/ Save project  as... ),輸入新專案的名稱,如 select_drink_db,按 「OK」鈕 (此專案有使用到 TinyDB(微型資料庫)元件)。

專案的名稱只能使用大小寫字母、數字及「 _」符號,名稱的第一個字元必須是英文字母,不能使用中文字。

Designer 介面元件

Screen1:

Screen1 元件相關屬性表

元件

類別

屬性

功能

Screen1

 

Title:飲料點餐系統 
AppName:select_drink,可以改成 飲料點餐系統(出現在手機上面的App名稱)

Icon : 可以上傳1個背景透明的 icon圖。

1Screen元件就是1個螢幕(畫面)

HorizontalArrangement1

Layout

Width:Fill Parent

水平布局元件,讓裏面的元件可以水平對齊

Label_NumberofPeople

User Interface

Text:人數:

標籤

TextBox_NumberofPeople

User Interface

Text: 35 

Hint: (清空)

文字方塊,可以輸入 人數,預設為35。

VerticallArrangement1

Layout

Width:Fill Parent

垂直布局元件,讓裏面的元件可以上下對齊

Label_tea

User Interface

Text: 奶茶咖啡類:(可新增飲料名稱,中間要使用半形逗號隔開)

標籤

TextBox_tea

User Interface

Text: 珍珠奶茶, 蜂蜜奶茶,烏龍綠茶,咖啡拿鐵
Hint: (清空)
Width:Fill Parent
MultiLine 要打勾,可多行顯示

文字方塊,可以輸入奶茶咖啡類的飲料名稱

VerticallArrangement2

Layout

Width:Fill Parent

垂直布局元件,讓裏面的元件可以上下對齊

Label_juice

User Interface

Text: 果汁類:(可新增飲料名稱,中間要使用半形逗號隔開)

標籤

TextBox_ juice

User Interface

Text: 蜂蜜檸檬,金桔檸檬, 葡萄柚汁
Hint: (清空)
Width:Fill Parent
MultiLine 要打勾,可多行顯示

文字方塊,可以輸入果汁類的飲料名稱

Button_save

User Interface

Text: 儲存設定

按鈕

Button_enter

User Interface

Text: 進入飲料點餐系統

按鈕

TinyDB1

Storage

 

微資料庫


按「Add Screen」 ,輸入新的Screen 的名稱如 Screen2,接 「OK」鈕。
Screen2:

Screen2 元件相關屬性表

元件

類別

屬性

功能

Screen2

 

Title:   飲料點餐系統

1Screen元件就是1螢幕(畫面)

HorizontalArrangement1

Layout(介面配置)

Width:Fill Parent

水平配置元件,讓裏面的元件可以水平對齊

Label_SeatNumber

User Interface

Text: 座號

標籤

Spinner_SeatNumber

User Interface

 

下拉式選單,用來選座號。

ListPicker_drink

User Interface

ElementsFromString: 奶茶咖啡類,果汁類
Text: 飲料類別
Title: 飲料類別

清單選擇器

本例是第1層,先選飲料的類別。

Label_result

User Interface

Text: 飲料點選結果:

標籤

TextBox_result

User Interface

Height:200
Width:Fill Parent
Text: (清空)
Hint: (清空)
MultiLine:打勾

文字方塊,顯示每一個人點選的結果。

Button_total

User Interface

Text: 統計結果

按鈕

按下去可以顯示每一種飲料被點選的次數。

TextBox_total

User Interface

Height: Fill Parent Width:Fill Parent
Text: (清空)
Hint: (清空)
MultiLine:打勾

文字方塊,顯示每一種飲料被點選的次數。

ListPicker_tea

User Interface

Text: 奶茶咖啡類
Title: 奶茶咖啡類
Visible: (取消打勾)

清單選擇器

本例是第2層,顯示奶茶咖啡類下面的飲料品名清單。先不顯示。

ListPicker_juice

User Interface

Text: 果汁類
Title: 果汁類
Visible: (取消打勾)

清單選擇器

本例是第2層,顯示果汁類類下面的飲料品名清單。先不顯示。

HorizontalArrangement2

Layout

Width:Fill Parent

水平配置元件,讓裏面的元件可以水平對齊。

Label_Store

User Interface

Text: 店家手機號碼:

標籤

TextBox_StorePhone

User Interface

Width:140
Text: 0 

文字方塊,輸入手機號碼。

Button_send

User Interface

Text: 送出訂單

按鈕

按下去將結果以簡訊方式送給店家。

Texting1

Social(社交應用)

 

簡訊元件

Notifier1

User Interface

 

對話框元件,顯示訊息後自動消失。

完整 Blocks程式拼塊

Screen1:

----------------------------------------------------------------
說明:
GetValue  :從TinyDB (微資料庫)中取得tag 標籤名稱的資料。如果 這個tag 標籤沒有資料,預設傳回空字串。
如果 傳回值不是空字串 (表示有將設定值存在 TinyDB ),就取出  NumberofPeople (人數)、tea (奶茶咖啡類 的飲料名稱 )、juice (果汁類的飲料名稱)。
當按了 Button_enter (進入飲料點餐系統)按鈕,打開另一個Screen2,起始值是一個清單,內容為「人數、奶茶咖啡類的飲料名稱、果汁類的飲料名稱」。
----------------------------------------------------------------
---------------------------------------------------------------
說明:
按了「儲存設定」鈕,
將「人數、奶茶咖啡類的飲料名稱、果汁類的飲料名稱」儲存到TinyDB ,tag 標籤分別為 NumberofPeople、tea、juice。
----------------------------------------------------------------
Screen2:
----------------------------------------------------------------
說明:
global (全域變數)可用在程式中所有副程式或是事件。
NumberofPeople :人數。從Screen1傳來清單中的第1項。
tea :奶茶咖啡類的飲料名稱,從Screen1傳來清單中的第2項,為字串資料。
juice  :果汁類的飲料名稱,從Screen1傳來清單中的第3項,為字串資料。
tea_list: 奶茶咖啡類的飲料清單。
juice_list: 果汁類的飲料清單。
drink_kind:此清單存放各種飲料被點選的次數,第1項是放第1種飲料被點選的次數。如果沒有修改預設值,那就是「珍珠奶茶」被點選的次數。
seatnumber :座號從1開始編。
tea_number : 屬於奶茶咖啡類的飲料個數。
juice_number : 屬於果汁類的飲料個數。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
to count x do 程序的意義:
選擇 drink_kind此清單中的第x項,把它的值加上1 ,再放回原來的位置。
replace list item :取代清單中的某元素,取代值為  replacement 後面的值。
add items to list :加入項目到清單中。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
spinner_SeatNumber 座號下拉式選單的標題文字設為 "座號"。
list from csv row,把後方的字串拼塊內容依逗號間隔轉換為清單。
length of list ,傳回清單元素個數。
tea_number ( 屬於奶茶咖啡類的飲料個數)就是 tea_list(奶茶咖啡類的飲料清單)的元素個數(長度)。
seatnumber(座號)的初始值為  "1",所以迴圈從2開始到 NumberofPeople,先串接1個逗號,再串接迴圈的控制變數 number (為區域變數)。
drink_kind:此清單用來存放各種飲料被點選的次數,先每一項設為0 ,總共有  tea_number + juice_number 項。

下拉式選單的清單元素從字串輸入,元素值間以逗號隔開。
如果改用 elements  ,那後面要接 清單,如下:
如果後面是接 global tea 字串,在編輯時沒有出現錯誤,但在執行時會有錯。
----------------------------------------------------------------


----------------------------------------------------------------
說明:
ListPicker_drink 元件選擇完成事件,判斷是否選取第1個清單元素,如果是 ,開啟「奶茶咖啡類」的清單選擇器。否則 開啟「果汁類」的清單選擇器。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
ListPicker_tea (奶茶咖啡類)元件選擇完成事件,TextBox_result(點選的結果) 串接換行符號,再串接 從 spinner_SeatNumber 座號下拉式選單選到的座號 ,串接 "號 " 此文字,再串接 ListPicker_tea選到的元素(即飲料名稱)。
join 預設是串接二個字串,可以按 擴充項目鈕(星號圖示),把  string 接到 join裏面,變成可串接三個字串。如果從 join 裏面,將 string往外移,是減少一個。
呼叫 count 程序,參數為 ListPicker_tea 選中項的索引值,以便統計此種飲料被點選的次數。
----------------------------------------------------------------
----------------------------------------------------------------
說明:
ListPicker_juice (果汁類)元件選擇完成事件,跟 ListPicker_tea 差不多。
呼叫 count 程序,參數為 ListPicker_juice 選中項的索引值+奶茶咖啡類的個數,以統計此種飲料被點選的次數。
----------------------------------------------------------------

----------------------------------------------------------------
說明:
TextBox_total 顯示每一種飲料被點選的次數。
所有飲料的個數 為 tea_number + juice_number,即這二類個數的總和。
迴圈控制變數 從1到  tea_number + juice_number ,每次增加1 。
從 drink_kind 第1項到 所有飲料個數,每一項都統計。
如果該項的值 > 0 才需要顯示其結果。
如果 小於或等於 tea_number ( 屬於奶茶咖啡類的飲料個數),就從 tea_list 清單,顯示飲料名稱 再 串接 該飲料被點選的總次數,再串接 "杯\n"。
否則 從 juice_list 清單,顯示飲料名稱(each迴圈控制變數要減  tea_number,才能得到 果汁類清單的項目 ) 再 串接 該飲料被點選的總次數,再串接 "杯\n"。
select list item : 從清單挑選項目。
\n :換行符號。
----------------------------------------------------------------
----------------------------------------------------------------
說明:如果  TextBox_StorePhone(店家手機電話號碼)的長度小於7 ,出現訊息  "請輸入店家手機電話號碼! "
否則   
設定 Texting 簡訊元件的PhoneNumber(電話號碼)為 TextBox_StorePhone。
設定 Texting 簡訊元件的Message(簡訊內容)為 TextBox_total(顯示每一種飲料被點選的次數)。
呼叫 Texting.SendMessage 發送簡訊。
出現 "簡訊已傳送!" 的訊息。