Python Arcade 库中有没有办法从用户那里读取文本(使用文本框矩形或弹出窗口等)?无需阅读每个键并对其进行解释(如果系统语言不是英语,则翻译为其他字符)。
如果没有,是否有内置方法来检查按下的键的正确字符是什么(取决于系统语言和大写锁定状态等)?
我找到了写文本的方法,但没有找到阅读它们的方法。
在大多数教程中,PythonArcade
库仅实现了基本的键事件处理,例如on_key_press
和on_key_release
.
但是,与 PyGame 相比,Python Arcade Library 具有 GUI 组件作为主要功能差异之一。
在搜索文档时,input
我们可以找到一个类
用户可以在其中输入文本的输入字段。
这似乎是从 2.6.0 版开始(参见发行说明)。
注意:目前有一个未解决的问题#1059: UIInputText() not working。(可以用 ; 重现,arcade-2.6.7
但通过将文本传递给构造函数来使其工作,如UIInputText(text='hello')
)。
我从附加到问题 #1059的示例代码中对其进行了修改。添加了一些事件处理,如 Arcade 库的文档所示:FlatButton 示例。
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()
我在 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()