欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

pygame實現(xiàn)中文輸入框的示例

 更新時間:2021年12月03日 10:49:12   作者:狡猾的皮球  
本文主要介紹了pygame實現(xiàn)中文輸入框的示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

注意:

pygame2.0已經(jīng)支持輸入法了,本文的方法僅供參考

為了解決pygame不能輸入中文的問題,就寫了一個中文輸入框

1.效果

2.源碼

以下代碼需要安裝:

pip install Pinyin2Hanzi

然后就可以直接運行啦

注意:你電腦里如果沒有microsoftyaheimicrosoftyaheiui字體的話,請自行找一個中文字體

import string
 
import pygame
from Pinyin2Hanzi import DefaultDagParams
from Pinyin2Hanzi import dag
 
 
class TextBox:
    def __init__(self, w, h, x, y, font=None, callback=None):
        """
        :param w:文本框?qū)挾?
        :param h:文本框高度
        :param x:文本框坐標(biāo)
        :param y:文本框坐標(biāo)
        :param font:文本框中使用的字體
        :param callback:在文本框按下回車鍵之后的回調(diào)函數(shù)
        """
        self.width = w
        self.height = h
        self.x = x
        self.y = y
        self.text = ""  # 文本框內(nèi)容
        self.callback = callback
        # 創(chuàng)建背景surface
        self.__surface = pygame.Surface((w, h))
        # 如果font為None,那么效果可能不太好,建議傳入font,更好調(diào)節(jié)
        if font is None:
            self.font = pygame.font.SysFont('microsoftyaheimicrosoftyaheiui', 16)
        else:
            self.font = font
 
        self.dagparams = DefaultDagParams()
        self.state = 0  # 0初始狀態(tài) 1輸入拼音狀態(tài)
        self.page = 1  # 第幾頁
        self.limit = 5  # 顯示幾個漢字
        self.pinyin = ''
        self.word_list = []  # 候選詞列表
        self.word_list_surf = None  # 候選詞surface
        self.buffer_text = ''  # 聯(lián)想緩沖區(qū)字符串
 
    def create_word_list_surf(self):
        """
        創(chuàng)建聯(lián)想詞surface
        """
        word_list = [str(index + 1) + '.' + word for index, word in enumerate(self.word_list)]
        text = " ".join(word_list)
        self.word_list_surf = self.font.render(text, True, (255, 255, 255))
 
    def draw(self, dest_surf):
        # 創(chuàng)建文字surf
        text_surf = self.font.render(self.text, True, (255, 255, 255))
        # 繪制背景色
        dest_surf.blit(self.__surface, (self.x, self.y))
        # 繪制文字
        dest_surf.blit(text_surf, (self.x, self.y + (self.height - text_surf.get_height())),
                       (0, 0, self.width, self.height))
        # 繪制聯(lián)想詞
        if self.state == 1:
            dest_surf.blit(self.word_list_surf,
                           (self.x, self.y + (self.height - text_surf.get_height()) - 30),
                           (0, 0, self.width, self.height)
                           )
 
    def key_down(self, event):
        unicode = event.unicode
        key = event.key
 
        # 退位鍵
        if key == 8:
            self.text = self.text[:-1]
            if self.state == 1:
                self.buffer_text = self.buffer_text[:-1]
            return
 
        # 切換大小寫鍵
        if key == 301:
            return
 
        # 回車鍵
        if key == 13:
            if self.callback:
                self.callback(self.text)
            return
 
        # print(key)
        # 空格輸入中文
        if self.state == 1 and key == 32:
            self.state = 0
            self.text = self.text[:-len(self.buffer_text)] + self.word_list[0]
            self.word_list = []
            self.buffer_text = ''
            self.page = 1
            return
 
        # 翻頁
        if self.state == 1 and key == 61:
            self.page += 1
            self.word_list = self.py2hz(self.buffer_text)
            if len(self.word_list) == 0:
                self.page -= 1
                self.word_list = self.py2hz(self.buffer_text)
            self.create_word_list_surf()
            return
 
        # 回退
        if self.state == 1 and key == 45:
            self.page -= 1
            if self.page < 1:
                self.page = 1
            self.word_list = self.py2hz(self.buffer_text)
            self.create_word_list_surf()
            return
 
        # 選字
        if self.state == 1 and key in (49, 50, 51, 52, 53):
            self.state = 0
            if len(self.word_list) <= key - 49:
                return
            self.text = self.text[:-len(self.buffer_text)] + self.word_list[key - 49]
            self.word_list = []
            self.buffer_text = ''
            self.page = 1
            return
 
        if unicode != "":
            char = unicode
        else:
            char = chr(key)
 
        if char in string.ascii_letters:
            self.buffer_text += char
            self.word_list = self.py2hz(self.buffer_text)
            self.create_word_list_surf()
            # print(self.buffer_text)
            self.state = 1
        self.text += char
 
    def safe_key_down(self, event):
        try:
            self.key_down(event)
        except:
            self.reset()
 
    def py2hz(self, pinyin):
        result = dag(self.dagparams, (pinyin,), path_num=self.limit * self.page)[
                 (self.page - 1) * self.limit:self.page * self.limit]
        data = [item.path[0] for item in result]
        return data
 
    def reset(self):
        # 異常的時候還原到初始狀態(tài)
        self.state = 0  # 0初始狀態(tài) 1輸入拼音狀態(tài)
        self.page = 1  # 第幾頁
        self.limit = 5  # 顯示幾個漢字
        self.pinyin = ''
        self.word_list = []  # 候選詞列表
        self.word_list_surf = None  # 候選詞surface
        self.buffer_text = ''  # 聯(lián)想緩沖區(qū)字符串
 
 
def callback(text):
    print("回車測試", text)
 
 
def main():
    # 英文文本框demo
    pygame.init()
    winSur = pygame.display.set_mode((640, 480))
    # 創(chuàng)建文本框
    text_box = TextBox(200, 30, 200, 200, callback=callback)
 
    # 游戲主循環(huán)
    while True:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit()
            elif event.type == pygame.KEYDOWN:
                # 調(diào)用文本框鍵盤按下事件
                text_box.safe_key_down(event)
        pygame.time.delay(33)
        winSur.fill((0, 50, 0))
        # 繪制文本框
        text_box.draw(winSur)
        pygame.display.flip()
 
 
if __name__ == '__main__':
    main()

3.用法

用法很簡單

1.創(chuàng)建一個TextBox對象

TextBox參數(shù)說明:

  • w:輸入框的寬
  • h:輸入框的高
  • x:輸入框左上角x坐標(biāo)
  • y:輸入框左上角y坐標(biāo)
  • font:字體(可以不傳)
  • callback:按下回車之后的回調(diào)函數(shù),這個函數(shù)必須有一個參數(shù)用來接收文本框中的字符串

2.在鍵盤按下事件時調(diào)用TextBox對象的safe_key_down(event)方法,記住要把pygame的event傳進去

3.記得調(diào)用TextBox的draw(surface)方法,顯示輸入框

到此這篇關(guān)于pygame實現(xiàn)中文輸入框的示例的文章就介紹到這了,更多相關(guān)pygame 中文輸入框內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python?pandas索引的設(shè)置和修改方法

    Python?pandas索引的設(shè)置和修改方法

    索引的作用相當(dāng)于圖書的目錄,可以根據(jù)目錄中的頁碼快速找到所需的內(nèi)容,下面這篇文章主要給大家介紹了關(guān)于Python?pandas索引的設(shè)置和修改的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • 解決python列表list中的截取問題

    解決python列表list中的截取問題

    這篇文章主要介紹了解決python列表list中的截取問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-05-05
  • python3注冊全局熱鍵的實現(xiàn)

    python3注冊全局熱鍵的實現(xiàn)

    這篇文章主要介紹了python3注冊全局熱鍵的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python使用Asyncio實現(xiàn)檢查網(wǎng)站狀態(tài)

    Python使用Asyncio實現(xiàn)檢查網(wǎng)站狀態(tài)

    這篇文章主要為大家詳細介紹了Python如何使用Asyncio實現(xiàn)檢查網(wǎng)站狀態(tài),文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-03-03
  • Python刪除指定目錄下過期文件的2個腳本分享

    Python刪除指定目錄下過期文件的2個腳本分享

    這篇文章主要介紹了Python刪除指定目錄下過期文件2個腳本分享,可以用在如刪除指定日期前的日志文件,需要的朋友可以參考下
    2014-04-04
  • 對python中的乘法dot和對應(yīng)分量相乘multiply詳解

    對python中的乘法dot和對應(yīng)分量相乘multiply詳解

    今天小編就為大家分享一篇對python中的乘法dot和對應(yīng)分量相乘multiply詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-11-11
  • Anaconda多環(huán)境多版本python配置操作方法

    Anaconda多環(huán)境多版本python配置操作方法

    下面小編就為大家?guī)硪黄狝naconda多環(huán)境多版本python配置操作方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • django 自定義用戶user模型的三種方法

    django 自定義用戶user模型的三種方法

    這篇文章主要介紹了django 自定義用戶user模型的三種方法,需要的朋友可以參考下
    2014-11-11
  • Keras SGD 隨機梯度下降優(yōu)化器參數(shù)設(shè)置方式

    Keras SGD 隨機梯度下降優(yōu)化器參數(shù)設(shè)置方式

    這篇文章主要介紹了Keras SGD 隨機梯度下降優(yōu)化器參數(shù)設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • Python修改DBF文件指定列

    Python修改DBF文件指定列

    這篇文章主要介紹了Python修改DBF文件指定列的實現(xiàn),幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-12-12

最新評論