1. 程式人生 > >線上詞典(有介面)

線上詞典(有介面)

  1. 詞典原理的實現:線上詞典(無介面),該篇文章只討論介面的實現;
  2. '''
    def font_name():返回系統的字型檔案
    class TestApp(App):實現的主體類
        def build(self):該函式是固定的,作用是用於生成介面
        def config_window(self):設定介面的屬性(長度能否被更改,寬,高)
        def setup_ui(self):介面佈局的主體函式
        def check(self, input):按下回車鍵的關聯函式(按下回車鍵時,會執行該函式)
        
    '''
  3. 程式的視窗必須有一個佈局(layout),所有的按鈕/文字框之類的東西都必須新增在佈局中,我們把按鈕/文字框之類的東西叫做控制元件

  4. 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()

執行結果(大小比例已更改):