/
UniEat5.py
149 lines (52 loc) · 4.34 KB
/
UniEat5.py
1
import random #導入模組randomimport pygame #導入模組pygamepygame.mixer.init() #最初始化,使用mixer物件執行聲音的撥放from telegram.ext import Updater, CommandHandler, CallbackQueryHandler #導入telegram的模組from telegram import InlineKeyboardMarkup, InlineKeyboardButton#導入telegram模組#早中晚食物 使用python dict 字典的方式儲存每道餐點與其熱量Mfood = dict(總匯三明治= 329, 鮪魚三明治= 275, 煙燻三明治= 381, 起司蛋餅= 350, 薯餅蛋餅= 360, 鮪魚蛋餅= 315, 起司蔥抓餅= 400, 原味蔥抓餅= 370, 火腿蔥抓餅= 362.4, 炸煎餃= 700, 薯餅= 326, 漢堡= 295, 肉鬆御飯糰= 197, 鮪魚御飯糰= 206, 鐵板麵= 500, 蘑菇鐵板麵= 500, 海南鐵板麵= 600, 麵包= 265)Lfood2 = dict(蜜汁叉燒飯= 780, 黃金起司蛋包飯= 594, 糖醋雞肉飯= 680, 鐵板豬肉販= 720, 打拋豬= 689, 親子丼飯= 550, 鍋燒麵= 460, 酸辣粉= 500, 酸辣麵 = 550, 豚骨拉麵 = 718, 醬油拉麵 = 511, 涼麵 = 230, 韓式部隊鍋 = 1060, 肌肉燴飯 = 320, 壽司= 400, 烤肉 = 2600, 小火鍋 = 2000, 泡麵 = 475, 咖哩飯= 700, 關東煮= 500, 雙蘇番茄蝦仁炒飯= 933, 肉絲炒飯= 800, 總匯披薩= 770, 海鮮披薩= 352, 夏威夷披薩= 430)#使用python模組random的choice()方法從list串列中隨機傳回一個元素,再加上字典(Dictionary)items()方法,把字典裡的每一對key與value組成一個元組mldrandom = { '早': random.choice(list(Mfood.items())), '中': random.choice(list(Lfood2.items())), '晚': random.choice(list(Lfood2.items()))}#與上方mldrandom對應早中晚的名稱,之後可以呈現在telegram按鈕上的文字mld = { '早': '早餐', '中': '中餐', '晚': '晚餐'}#音樂pygame.time.delay(1000) #先讓聲音初始化工作pygame.mixer.music.load('音樂檔(絕對路徑)')pygame.mixer.music.play()#撥放mp3音樂檔案#Telegram執行的開始def start(bot, update): #使用函數def ,函數名稱為start(在telegram要執行時必須打/start,即可執行)參數分別為bot與update update.message.reply_text('請問要吃', reply_markup = InlineKeyboardMarkup([[ InlineKeyboardButton(mld, callback_data = hand) for hand, mld in mld.items()]]))#以上43到45行使用telegram模組了的功能,在使用for迴圈,迴圈內容從mld裡拿取,再分別呈現在telegram按鈕上的文字#選擇早中晚餐按鈕個開始def play(bot, update): try: #可能會發生錯誤的地方,所以用try catch包起來 yours = update.callback_query.data #使用者選擇telegram上的某一個按鈕(早中晚)儲存到yours變數中 print(yours)#為了想在程式執行的地方知道your使用者選擇的項目使否與telegram使用者按下的按鈕相同,所以在此print印出結果(早、中、晚) #使用python的format()函數格式化輸出的功能('輸出格式區'.format(變數區),為了讓餐點後的熱量數字後方有kcal的字,於是在{}後方再加上kcal update.callback_query.edit_message_text('為您推薦 {} kcal!'.format(mldrandom[yours])) #記事本 fn=open('txt檔(絕對路徑)','a') #檔案寫入採用非複寫的方式推薦給使用者的餐點儲存到記事本中 fn.write(format(mldrandom[yours])+"kcal" + "\n") #檔案寫入來源使用format格式化的功能,再加上"kcal"(讓記事本中有可以呈現kcal),並且每輸入一筆資料就換行(以利於閱讀) fn.close()#輸入完之後關閉檔案(記事本) except Exception as mld: #當try的部分有錯誤,會到此並且印出mld,才不會讓程式莫名期末的卡住 print(mld) updater = Updater('YOUR_TOKEN')#連接自己telegram代號的地方updater.dispatcher.add_handler(CommandHandler('start', start))#在telegram中要執行此程式前必須在telegram發言框框中輸入/startupdater.dispatcher.add_handler(CallbackQueryHandler(play))#執行play函數updater.start_polling()#使用polling啟動bot,表示libary會持續的發送request到telegram servers並從telegram servers取得新的update(如果有)。也就是不停接收來自telegram的消息updater.idle()#執行bot,一直到發送終止信號