Python Kivy:如何在树状视图中使用键盘上下键和上下键事件?
我正在使用python-2.7和kivy-1.10.0。 当我单击name TextInput时,树视图显示。 我希望使用向上键和向下键选择标签,当按下enter键时,文本将被复制,所选文本将被复制到初始表单,就像当前单击项目时所做的那样 test.py 试验电压(千伏)Python Kivy:如何在树状视图中使用键盘上下键和上下键事件?,python,python-2.7,kivy,kivy-language,Python,Python 2.7,Kivy,Kivy Language,我正在使用python-2.7和kivy-1.10.0。 当我单击name TextInput时,树视图显示。 我希望使用向上键和向下键选择标签,当按下enter键时,文本将被复制,所选文本将被复制到初始表单,就像当前单击项目时所做的那样 test.py 试验电压(千伏) 您的需求可分为两个任务: 检测我们使用的密钥。 选择节点,为此,我们使用的方法允许我们选择一个特定的节点,该节点返回当前选择的节点。您不应覆盖select_节点方法,请从代码中删除该方法。 @很抱歉给您带来不便。使用keybo
您的需求可分为两个任务: 检测我们使用的密钥。 选择节点,为此,我们使用的方法允许我们选择一个特定的节点,该节点返回当前选择的节点。您不应覆盖select_节点方法,请从代码中删除该方法。
@很抱歉给您带来不便。使用keyboard@eyllanesc谢谢。是的,正是我想做的。你可以在键盘按下的情况下监视按键事件。还可以尝试此stackoverflow@eyllanesc真的谢谢。我更新了问题。@eyllanesc我只是在尝试。谢谢。上下键工作正常,但按下enter键后,不会将文本复制到中TextBox@macsontaylor你试对了吗?我刚试过,效果很好,你说的文本框是什么意思,它与代码或名称对齐?,您是否已从TreeviewGroup和GroupScreen中删除select_节点?键盘上有两个enter键。一个enter键工作正常,但另一个不工作。它是strange@macsontaylor按enter键时打印不适合您的变量键。@macsontaylor然后将elif键==“enter”:更改为“enter”中的elif键,“numpadenter”:。它更加优雅,因为您不会不必要地重复代码。
from kivy.uix.screenmanager import Screen
from kivy.app import App
from kivy.lang import Builder
from kivy.core.window import Window
from kivy.uix.popup import Popup
from kivy.uix.treeview import TreeView, TreeViewLabel, TreeViewNode
from kivy.uix.label import Label
from kivy.properties import ObjectProperty
Window.size = (500, 200)
def populate_tree_view(tree_view, parent, node):
if parent is None:
tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
is_open=True))
else:
tree_node = tree_view.add_node(TreeViewLabel(text=node['node_id'],
is_open=True), parent)
for child_node in node['children']:
populate_tree_view(tree_view, tree_node, child_node)
tree = []
rows = [(1, 'test1', 11), (2, 'test2', 2), (3, 'test3', 3)]
for r in rows:
tree.append({'node_id': r[1], 'children': []})
class TreeViewLabel(Label, TreeViewNode):
pass
class TreeviewGroup(Popup):
treeview = ObjectProperty(None)
tv = ObjectProperty(None)
#ti = ObjectProperty()
def __init__(self, **kwargs):
super(TreeviewGroup, self).__init__(**kwargs)
self.tv = TreeView(root_options=dict(text=""),
hide_root=False,
indent_level=4)
for branch in tree:
populate_tree_view(self.tv, None, branch)
self.remove_widgets()
self.treeview.add_widget(self.tv)
def remove_widgets(self):
for child in [child for child in self.treeview.children]:
self.treeview.remove_widget(child)
def select_node(self, node):
'''Select a node in the tree.
'''
if node.no_selection:
return
if self._selected_node:
self._selected_node.is_selected = False
node.is_selected = True
self._selected_node = node
print(node)
class GroupScreen(Screen):
name = ObjectProperty(None)
popup = ObjectProperty(None)
def display_groups(self, instance):
if len(instance.text) > 0:
if self.popup is None:
self.popup = TreeviewGroup()
#self.popup.filter(instance.text)
self.popup.open()
def select_node(self, node):
'''Select a node in the tree.
'''
if node.no_selection:
return
if self._selected_node:
self._selected_node.is_selected = False
node.is_selected = True
self._selected_node = node
print(node)
class Group(App):
def build(self):
self.root = Builder.load_file('test.kv')
return self.root
if __name__ == '__main__':
Group().run()
#:kivy 1.10.0
<TreeViewLabel>:
on_touch_down:
app.root.name.text = self.text
app.root.popup.dismiss()
<TreeviewGroup>:
id: treeview
treeview: treeview
title: "Select"
size_hint: None, None
size: 400, 200
auto_dismiss: False
BoxLayout
orientation: "vertical"
#TextInput:
#id: ti
#size_hint_y: .1
#on_text: root.filter(self.text)
BoxLayout:
id: treeview
Button:
size_hint: 1, 0.1
text: "Close"
on_release: root.dismiss()
<CustomLabel@Label>:
text_size: self.size
valign: "middle"
padding_x: 5
<SingleLineTextInput@TextInput>:
multiline: False
<GreenButton@Button>:
background_color: 1, 1, 1, 1
size_hint_y: None
height: self.parent.height * 0.150
GroupScreen:
name: name
test:test
GridLayout:
cols: 2
padding : 30,30
spacing: 10, 10
row_default_height: '40dp'
CustomLabel:
text: 'Code'
SingleLineTextInput:
id: test
multiline: False
on_text_validate: name.focus = True
CustomLabel:
text: 'Name'
SingleLineTextInput:
id: name
text:' '
multiline: False
on_focus: root.display_groups(self)
GreenButton:
text: 'Ok'
GreenButton:
text: 'Cancel'
on_press: app.stop()
....
class TreeviewGroup(Popup):
treeview = ObjectProperty(None)
tv = ObjectProperty(None)
#ti = ObjectProperty()
def __init__(self, **kwargs):
super(TreeviewGroup, self).__init__(**kwargs)
self.tv = TreeView(root_options=dict(text=""),
hide_root=False,
indent_level=4)
for branch in tree:
populate_tree_view(self.tv, None, branch)
self.remove_widgets()
self.treeview.add_widget(self.tv)
self.bind(on_open=self.on_open)
def on_open(self, *args):
self._keyboard = Window.request_keyboard(self._keyboard_closed, self)
self._keyboard.bind(on_key_down=self._on_keyboard_down)
if self.tv.selected_node is None:
self.tv.select_node(self.tv.root.nodes[0])
def _keyboard_closed(self):
self._keyboard.unbind(on_key_down=self._on_keyboard_down)
self._keyboard = None
def _on_keyboard_down(self, keyboard, keycode, text, modifiers):
node = self.tv.selected_node
_, key = keycode
if key in ('down', 'up'):
parent = node.parent_node
ix = parent.nodes.index(node)
nx = ix+1 if 'down' else ix-1
next_node = parent.nodes[nx % len(parent.nodes)]
self.tv.select_node(next_node)
return True
elif key == 'enter':
App.get_running_app().root.name.text = node.text
keyboard.release()
self.dismiss()
...
class GroupScreen(Screen):
name = ObjectProperty(None)
popup = ObjectProperty(None)
def display_groups(self, instance):
if len(instance.text) > 0:
if self.popup is None:
self.popup = TreeviewGroup()
#self.popup.filter(instance.text)
self.popup.open()
...