線上詞典(有介面)
阿新 • • 發佈:2019-01-06
- 詞典原理的實現:線上詞典(無介面),該篇文章只討論介面的實現;
-
''' def font_name():返回系統的字型檔案 class TestApp(App):實現的主體類 def build(self):該函式是固定的,作用是用於生成介面 def config_window(self):設定介面的屬性(長度能否被更改,寬,高) def setup_ui(self):介面佈局的主體函式 def check(self, input):按下回車鍵的關聯函式(按下回車鍵時,會執行該函式) '''
-
程式的視窗必須有一個佈局(layout),所有的按鈕/文字框之類的東西都必須新增在佈局中,我們把按鈕/文字框之類的東西叫做控制元件
-
setup_ui(self):
def setup_ui(self): """ 控制元件我們這裡用了 boxlayout, orientation='vertical' 表示這個 layout 裡面的東西是豎直排列的 豎直排列的情況下, 一個控制元件預設是橫向填滿, 平分高度 這個例子中我們添加了 2 個文字框, 所以他們每個佔據一半的高度 """ layout = BoxLayout(orientation='vertical') # Textinput 是文字輸入框, multiline=False 表示這是一個單行文字框 # 文字框1:input是輸入文字框 input = TextInput(multiline=False) # 給 input 繫結一個事件 on_text_validate # 這個事件是在按回車的時候觸發的, 也就是說你按回車的時候 self.check 函式會被呼叫 # 這裡會完成self.result.text的賦值 input.bind(on_text_validate=self.check) layout.add_widget(input) # 文字框2:result是輸出文字框 # 為什麼將result設定為全域性變數: # 因為result的文字要在check函式中使用(文字的賦值) self.result = TextInput() # kivy 預設不支援中文字元顯示, 必須手動指定包含中文的字型檔案才可以顯示中文 # 因為 mac 和 win 的字型檔案不同, 所以我們用一個函式來判斷具體使用哪個字型檔案 self.result.font_name = font_name() layout.add_widget(self.result) # 把 result 這個輸入框用類的屬性存起來之後要使用 # 類屬性在類的任何函式中都可以建立, 並不一定要在 __init__ 中建立 # self.result = result return layout
原始碼:
from kivy.app import App from kivy.config import Config from kivy.uix.textinput import TextInput from kivy.uix.boxlayout import BoxLayout log = print import json import urllib.request log = print def openurl(url): # 這裡把 url 寫死為豆瓣 top250 頁面 # url = 'https://movie.douban.com/top250' # 下載頁面, 得到的是一個 bytes 型別的變數 s s = urllib.request.urlopen(url).read() # 用 utf-8 編碼把 s 轉為字串並返回 content = s.decode('utf-8') return content def translate(word): """ word 是一個不包含空格的單詞 """ key = 'A052B9965AA8C418D9866AC5F8F24F8D' url = 'http://dict-co.iciba.com/api/dictionary.php?type=json&key={}&w={}'.format(key, word) # openurl 是課 4 作業 14 的 openurl 函式 # 用來獲取網路詞典返回的結果 s = openurl(url) d = json.loads(s) result = '' list1 = d['symbols'][0]['parts'] for i in range(len(list1)): result = result + list1[i]['part'] + '\n' list2 = list1[i]['means'] for m in range(len(list2)): # log(list2[m]) result = result + list2[m] + '\n' result = result + '\n' return result def font_name(): """ 蘋果系統和微軟系統需要不同的字型檔案 """ from sys import platform if platform == "darwin": return 'Arial Unicode' elif platform == "win32": return 'SimHei' else: print('not support') # 程式一定是一個繼承自 App 的 xxApp 類作為起點 class TestApp(App): # build 函式是固定的, 它用於生成介面 def build(self): self.config_window() root = self.setup_ui() return root def config_window(self): """ 這裡設定了 3 個屬性, 這是固定的寫法 分別是 禁止縮放, 寬度 400, 高度 600 """ Config.set('graphics', 'resizable', False) Config.set('graphics', 'width', 400) Config.set('graphics', 'height', 600) def setup_ui(self): """ 控制元件我們這裡用了 boxlayout, orientation='vertical' 表示這個 layout 裡面的東西是豎直排列的 豎直排列的情況下, 一個控制元件預設是橫向填滿, 平分高度 這個例子中我們添加了 2 個文字框, 所以他們每個佔據一半的高度 """ layout = BoxLayout(orientation='vertical') # Textinput 是文字輸入框, multiline=False 表示這是一個單行文字框 # 文字框1:input是輸入文字框 input = TextInput(multiline=False) # 給 input 繫結一個事件 on_text_validate # 這個事件是在按回車的時候觸發的, 也就是說你按回車的時候 self.check 函式會被呼叫 # 這裡會完成self.result.text的賦值 input.bind(on_text_validate=self.check) layout.add_widget(input) # 文字框2:result是輸出文字框 # 為什麼將result設定為全域性變數: # 因為result的文字要在check函式中使用(文字的賦值) self.result = TextInput() # kivy 預設不支援中文字元顯示, 必須手動指定包含中文的字型檔案才可以顯示中文 # 因為 mac 和 win 的字型檔案不同, 所以我們用一個函式來判斷具體使用哪個字型檔案 self.result.font_name = font_name() layout.add_widget(self.result) # 把 result 這個輸入框用類的屬性存起來之後要使用 # 類屬性在類的任何函式中都可以建立, 並不一定要在 __init__ 中建立 # self.result = result return layout def check(self, input): """ input 就是觸發回車的輸入框控制元件 """ # input.text 可以獲取這個輸入框中輸入的文字 print('check, ', input.text) s = translate(input.text) # s = input.text + '\n' + 'done' # 我們在這裡可以設定 result 輸入框的文字 self.result.text = s def main(): # 生成 App 並執行 TestApp().run() if __name__ == '__main__': main()
執行結果(大小比例已更改):