pygameでテキストボックスから数値を入力する

日付：2023/01/06
分類：python　pygame


pygameでinput文みたいなものがあればいいのですが、ないので作ってみました
作っているうちにinput文というよりテキストボックス的なものになってしまいました；；；

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/411052/b9db8ff0-d1ca-07c0-cfc3-6b9ccd76daf3.png">

4桁の数値を入力しているところ

[repl.itで試せます](https://replit.com/@bkh4149/FavoriteFlatClient#main.py)

### 使い方
	import g_input
	tbox(screen,font,x,y,w,h,n)
	引数：
		screen:サーフェス
		font:フォント
		x,y:テキストボックスの左上の座標
		w,h:テキストボックスの幅と高さ
		n:文字数
	戻値：入力された数字のテキスト

### コード　呼ばれる側
```py: g_input.py
import pygame
from pygame.locals import *
import sys
def tbox(screen,font,x,y,w,h,n):
    txt=""
    isEnd=False#終了フラグ
    while True:
        pygame.draw.rect(screen, (255,255,0), Rect(x,y,w,h)) #ボックス内を塗潰す
        txtg = font.render(txt, True, (55,55,55)) # 描画する文字列を画像にする
        screen.blit(txtg, [x+5, y+5])             # 画像を表示        
        pygame.display.update()                   # 画面更新
       
        # イベント処理
        for event in pygame.event.get():  # イベントを取得
            if event.type == QUIT:        # 閉じるボタンが押されたら
                pygame.quit()             
                sys.exit()                # 終了

            elif event.type == KEYDOWN:
              if event.key==K_LEFT  or event.key==K_BACKSPACE:#修正で戻る
                if len(txt)>=1:
                  txt = txt[:-1] 
              elif event.key==K_RETURN:#エンターキー
                isEnd=True
                break

              if len(txt)<n: 
                if event.key==K_PERIOD:#ピリオドが入力された
                  #print(".",end="")  
                  txt+="."
                else: 
                  for i in range(10):#0-9キーが入力された
                    if event.key==48+i:
                      #print(i,end="")  
                      txt+=str(i)
                      break

        if isEnd==True:
          break
    #print() 
    return txt

if __name__ == "__main__":
    pygame.init()                                 # Pygameの初期化
    screen = pygame.display.set_mode((800, 600))  # 800*600の画面  
    font = pygame.font.Font(None, 55)              # 準備 フォントの設定(既定フォント,55px)
    txt=tbox(screen,font,300,300,200,50,7)
    print("the txt=",txt)
```



### 呼ぶ側のサンプル

```py:all.py
import pygame
from pygame.locals import *
import sys
import g_input

def main():
    pygame.init()                                 # Pygameの初期化
    screen = pygame.display.set_mode((800, 600))  # 800*600の画面
    atxt=""
    font = pygame.font.Font(None, 55)              # 準備 フォントの設定(既定フォント,55px)
    while True:
        screen.fill((255,255,255))

        #なにか図形を描画
        pygame.draw.circle(screen,(10,10,10),(300,300),50)             
        pygame.draw.rect(screen, (255,0,0), Rect(410,100,50,50), 1)    

        #入力された文字を描画 
        txtg = font.render(atxt, True, (55,55,55))     # 描画する文字列を画像にする
        screen.blit(txtg, [400, 400])                  # 画像を表示        
        atxt=g_input.tbox(screen,font,400,200,150,50,4)# 文字を入力    
        pygame.display.update()                        # 画面更新

        # イベント処理
        for event in pygame.event.get():  # イベントを取得
            if event.type == QUIT:        # 閉じるボタンが押されたら
                pygame.quit()             
                sys.exit()                # 終了
if __name__ == "__main__":
    main()

```