从 Python Arcade 库中的用户读取文本

Reading text from user in Python Arcade library

PythonArcade 库中有没有一种方法可以从用户那里读取文本(使用文本框矩形或弹出窗口等)?无需读取每个键并对其进行解释(如果系统语言不是英语,则将其翻译成其他字符)。

如果不是,是否有内置方法来检查按下的键的正确字符是什么(取决于系统语言和 Caps Lock 状态等)?

我只找到了写文本的方法,但没有找到阅读它们的方法。

我在 Arcade 中没有看到这样的功能。

唯一的方法是建立你自己的。简单例子:

import arcade

class Game(arcade.Window):
    def __init__(self):
        super().__init__(400, 300)
        self.text = ''

    def on_draw(self):
        arcade.start_render()
        arcade.draw_text(self.text, 200, 150, arcade.color.GREEN, 24, anchor_x='center')

    def on_key_press(self, key, key_modifiers):
        self.text += chr(key)

Game()
arcade.run()

在大多数教程中,Python Arcade 仅实现了基本的 key-event handling,例如 on_key_presson_key_release.

UI 文本组件 I/O

但是,Python Arcade 库有 GUI 个组件作为主要 feature differences when compared to PyGame

在文档中搜索 input 时,我们可以找到 class

arcade.gui.UIInputText

An input field the user can type text into.

这似乎是 自版本 2.6.0 以来(参见发行说明)。

注意: 当前有一个未解决的问题 #1059: UIInputText() not working。 (可以用 arcade-2.6.7 重现;但通过将文本传递给构造函数来使其工作,如 UIInputText(text='hello'))。

示例演示 text-input

我从问题 #1059 附带的 sample-code 改编而来。 添加了一些 event-handling,如 Arcade Library 文档中所示:FlatButton example.

import arcade
import arcade.gui as gui

# --- Method 1 for handling click events,
# Create a child class.
class QuitButton(arcade.gui.UIFlatButton):
    def on_click(self, event: arcade.gui.UIOnClickEvent):
        arcade.exit()

class MyWindow(arcade.Window):
    def __init__(self):
        super().__init__(400, 300, "UI Example", resizable=True)
        self.manager = gui.UIManager()
        self.manager.enable()

        arcade.set_background_color(arcade.color.BEIGE)
        
        # Create a text label
        self.label = arcade.gui.UILabel(
            text="look here for change",
            text_color=arcade.color.DARK_RED,
            width=350,
            height=40,
            font_size=24,
            font_name="Kenney Future")

        # Create an text input field
        self.input_field = gui.UIInputText(
          color=arcade.color.DARK_BLUE_GRAY,
          font_size=24,
          width=200,
          text='Hello ..')

        # Create a button
        submit_button = gui.UIFlatButton(
          color=arcade.color.DARK_BLUE_GRAY,
          text='Submit')
        # --- Method 2 for handling click events,
        # assign self.on_click_start as callback
        submit_button.on_click = self.on_click 
        
        self.v_box = gui.UIBoxLayout()
        self.v_box.add(self.label.with_space_around(bottom=0))
        self.v_box.add(self.input_field)
        self.v_box.add(submit_button)
        self.v_box.add(QuitButton(text="Quit"))
        
        self.manager.add(
            arcade.gui.UIAnchorWidget(
                anchor_x="center_x",
                anchor_y="center_y",
                child=self.v_box)
        )


    def update_text(self):
        print(f"updating the label with input text '{self.input_field.text}'")
        self.label.text = self.input_field.text    

    def on_click(self, event):
        print(f"click-event caught: {event}")
        self.update_text()

        
    def on_draw(self):
        arcade.start_render()
        self.manager.draw()


window = MyWindow()
arcade.run()

另见

  • 真实 Python:街机:Python 游戏框架入门,第 Keyboard Input
  • 部分
  • Maic 的 GitHub 存储库中针对 PyGame 的 GUI 个项目列表:eruvanos/arcade_gui