test.py
import sqlite3 as lite
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,StringProperty
import sys
Window.clearcolor = (.152, .149, .149, 0)
Window.size = (700, 330)
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)
rows = [('1','1','city1'),('2','2','city2'),('3','3','city3')]
tree = []
for r in rows:
tree.append({'node_id': r[2], '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 filter(self, f):
self.treeview.clear_widgets()
self.tv = TreeView(root_options=dict(text=""),
hide_root=False,
indent_level=4)
new_tree = []
for n in tree:
if f.lower() in n['node_id'].lower():
new_tree.append(n)
for branch in new_tree:
populate_tree_view(self.tv, None, branch)
self.treeview.add_widget(self.tv)
def populate_tree_view_area(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)
rows = [('1','1','area1'),('2','2','area2'),('3','3','area3')]
treeArea = []
for r in rows:
treeArea.append({'node_id': r[2], 'children': []})
class TreeviewArea(Popup):
treeviewArea = ObjectProperty(None)
tv = ObjectProperty(None)
#ti = ObjectProperty()
def __init__(self, **kwargs):
super(TreeviewArea, self).__init__(**kwargs)
self.tv = TreeView(root_options=dict(text=""),
hide_root=False,
indent_level=4)
for branch in treeArea:
populate_tree_view_area(self.tv, None, branch)
self.remove_widgets()
self.treeviewArea.add_widget(self.tv)
def remove_widgets(self):
for child in [child for child in self.treeviewArea.children]:
self.treeviewArea.remove_widget(child)
class AreaScreen(Screen):
groupName = ObjectProperty(None)
popup = ObjectProperty(None)
#statecode = StringProperty('')
def display_cities(self, instance):
if len(instance.text) > 0:
if self.popup is None:
self.popup = TreeviewGroup()
#self.popup.filter(instance.text)
self.popup.open()
def display_areas(self, instance):
if len(instance.text) > 0:
if self.popup is None:
self.popup = TreeviewGroup()
#self.popup.filter(instance.text)
self.popup.open()
class FactArea(App):
def build(self):
self.root = Builder.load_file('test.kv')
return self.root
if __name__ == '__main__':
FactArea().run()
test.kv
: kivy 내가 도시에서 아무 것도 입력하면 다음 도시는 트 리뷰에서 보여 1.10.0
<TreeViewLabel>:
on_touch_down:
app.root.cityName.text = self.text
#app.root.select_node(self)
app.root.popup.dismiss()
<TreeviewGroup>:
id: treeview
treeview: treeview
title: "Select City"
size_hint: None, None
size: 400, 350
auto_dismiss: False
BoxLayout
orientation: "vertical"
#TextInput:
#id: ti
#size_hint_y: .1
#on_text: root.filter(self.text)
BoxLayout:
id: treeview
#on_press: root.select_node(self.text)
Button:
size_hint: 1, 0.1
text: "Close"
on_release: root.dismiss()
<TreeviewGroupArea>:
id: treeviewArea
treeviewArea: treeviewArea
title: "Select City"
size_hint: None, None
size: 400, 350
auto_dismiss: False
BoxLayout
orientation: "vertical"
#TextInput:
#id: ti
#size_hint_y: .1
#on_text: root.filter(self.text)
BoxLayout:
id: treeviewArea
#on_press: root.select_node(self.text)
Button:
size_hint: 1, 0.1
text: "Close"
on_release: root.dismiss()
<[email protected]>:
text_size: self.size
valign: "middle"
padding_x: 5
<[email protected]>:
multiline: False
<[email protected]>:
background_color: 1, 1, 1, 1
size_hint_y: None
height: self.parent.height * 0.200
AreaScreen:
cityName: cityName
GridLayout:
cols: 2
padding : 30,30
spacing: 10, 10
row_default_height: '30dp'
Label:
text: 'City'
text_size: self.size
valign: 'middle'
padding_x: 50
SingleLineTextInput:
id: cityName
font_size_valign:self.height*0.4
on_text: root.display_cities(self)
Label:
text: 'Area'
text_size: self.size
valign: 'middle'
padding_x: 50
SingleLineTextInput:
id: areaName
on_text: root.display_areas(self)
GreenButton:
text: 'Ok'
on_press: root.insert_data(cityName.text, areaName.text)
GreenButton:
text: 'Cancel'
on_press: app.stop()
. 하지만 아무것도 유형 입력 영역에 다음 도시를 보여줍니다. 나는 지역에 대한 별도의 기능을 작성했지만 무엇이 잘못 됐는지 모르겠습니까? 만약 가능하다면 도시 트리보기 및 영역 treevie에 대한 다른 조건과 동일한 기능을 사용하십시오 w.Code는 반복되지 않으므로 매우 좋습니다.사용하는 여러 트 리뷰 위젯
도시를 선택한 다음 값을 도시 TextBox에 입력하고 영역을 선택한 다음 도시 TextBox에서 값을 설정합니다. 별도의 TextBox에 값을 넣는 방법 City TreeView 값을 도시 TextBox 및 Area TreeView 값에 영역 TextBox에 넣습니다.