【问题标题】:How can I create a text input box with Pygame?python为什么不接受大写或符号[重复]
【发布时间】:2013-05-01 14:19:14
【问题描述】:

附加代码正确接受数字或字母 使用限制(休息),但它不会接受 大写或+等符号

可能有一些简单的事情我没有做过。我有 才刚刚开始使用 Python——我的其余代码似乎 正常工作

'''
Text input
restrict to certain inputs
letters or numbers (rest)
'''
#  will not accept upper case or '+'

import pygame, pygame.font, pygame.event, pygame.draw, string
import sys
from pygame.locals import *


#Screen size
x_Size=600
y_Size=600

#Restrict
rest1='1234567890-+.'
rest2='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
rest3 = rest1 + rest2 # accept all

def get_key():
    while 1:
    event = pygame.event.poll()
    if event.type == KEYDOWN:
        return event.key
    else:
        pass


def display_box(screen, message, x, y, rest):
    "Print a message in a box on the screen"
    fontobject = pygame.font.Font(None,28) # font size
    
    pygame.draw.rect(screen, (255,0,0),(x, y, 250,30), 1) # red box outline
    
    if len(message) != 0:
    screen.blit(fontobject.render(message, 1, (255,0,0)),
                (x, y)) # red text 
    pygame.display.flip()

def clear_box(screen, x, y):
    pygame.draw.rect(screen,(255,255,255),(x, y, 300, 90), 0)
    pygame.display.flip()

    
def ask(screen, question, x, y, rest):
    #ask(screen, question, position x,y, restriction) answer
    pygame.font.init()
    current_string = []
    display_box(screen, (question + ": " + string.join(current_string,"")), x, y, rest)
    while 1:
    inkey = get_key()
    print inkey
    if inkey == K_BACKSPACE:
        current_string = current_string[0:-1]
        #print current_string
    elif inkey == K_RETURN:
        break
    elif inkey >= 127:
        pass

    elif chr(inkey) in rest:
        
        z = chr(inkey)
        print 'z',z
        current_string.append(chr(inkey))
    
    clear_box(screen,x,y)
    display_box(screen, (question + ": " + string.join(current_string,"")), x, y, rest)
    print string.join(current_string)
    return string.join(current_string)


def main():
    screen = pygame.display.set_mode((x_Size, y_Size))
    screen.fill((255,255,255))
    h=ask(screen,'Numbers', 40, 50, rest1)
    k=ask(screen,'Letters',40, 70, rest2)

    print h,'Numbers'
    print k,'Letters'
    
#=======================
    pygame.quit()
    sys.exit()
if __name__ == '__main__': main()

【问题讨论】:

  • 代码应该做什么?这里有很多代码需要查看,如果您更详细地解释问题,您将更容易有人帮助您。
  • 您是否尝试打印inkey?我的猜测是 pygame 没有返回您对大写字母和其他符号的看法,因此当您输入 M 时,您会得到 xchr(x) != 'M'inkey
  • 它不会接受“大写”,因为当您按下 shift 键时,它会显示为完全不同的键。它看到你正在按 shift 而不是 M
  • 该程序是一个模块,被多次调用以更改/更新较长程序上的值
  • 我曾尝试使用 inkey,但在我输入字母键之前,shift 键给出的值不可接受

标签: python python-2.7 textbox pygame


【解决方案1】:

键盘事件KEYDOWNKEYUP(参见pygame.event 模块)创建一个带有附加属性的pygame.event.Event 对象。按下的键可以从key 属性(例如K_RETURN K_a)获得,mod 属性包含一个带有附加修饰符的位集(例如KMOD_LSHIFT)。 “Unicode”属性提供键盘输入的 Unicode 表示。

如果要获取大写字母,可以使用事件的keymod 属性来混淆输入,或者只使用unicode 属性。

在函数get_key()中返回事件的keyunicode

def get_key():
  while 1:
    event = pygame.event.poll()
    if event.type == KEYDOWN:
      return event.key, event.unicode
    else:
      pass

将 unicode 符号添加到字符串中:

while 1:
    inkey, inunicode = get_key()

    if inkey == K_BACKSPACE:
        # [...]

    elif inunicode  in rest:
        current_string.append(inunicode)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 2016-03-30
    • 2017-05-19
    • 1970-01-01
    • 2018-05-01
    • 1970-01-01
    相关资源
    最近更新 更多