2017-11-21 2 views
0

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에 넣습니다.

답변

1

내가 수정하려고 알고 있지만 충분하지, 당신은 내가 만에

... 
def populate_tree_view_area(tree_view, parent, node): 
    if parent is None: 
     tree_node = tree_view.add_node(TreeViewLabelArea(text=node['node_id'], 
               is_open=True)) 
    else: 
     tree_node = tree_view.add_node(TreeViewLabelArea(text=node['node_id'], 
               is_open=True), parent) 

    for child_node in node['children']: 
     populate_tree_view(tree_view, tree_node, child_node) 

rowsa = [('1','1','area1'),('2','2','area2'),('3','3','area3')] 
treeArea = [] 

for r in rowsa: 
    treeArea.append({'node_id': r[2], 'children': []}) 

class TreeViewLabelArea(Label, TreeViewNode): 
    pass 

class TreeviewArea(Popup): 
#You can let it as it is 

... 

class AreaScreen(Screen): 
    groupName = ObjectProperty(None) 
    popupcity = ObjectProperty(None) 
    popuparea = ObjectProperty(None) 
    #statecode = StringProperty('') 

    ... 

    def display_areas(self, instance): 
     if len(instance.text) > 0: 
      if self.popuparea is None: 
       self.popuparea = TreeviewArea() 
      #self.popup.filter(instance.text) 
      self.popuparea.open() 

다음 지역 팝업에 필요한를 게시 할 예정입니다

각 팝업의 트 리뷰 클래스와 TreeViewLabel를 다시 정의해야한다 당신의 KV 메인에 정의 된 TreeViewArea에 의해 TreaviewGroupArea을 교체하고 TreeViewLabelArea 규칙을 추가

... 
<TreeViewLabelArea>: 
    height: 24 
    on_touch_down: 
     app.root.areaName.text = self.text 
     #app.root.select_node(self) 
     app.root.popuparea.dismiss() 

마지막 t에 AREANAME 속성을 추가 그는이

도움이 규칙

나는 희망
... 
AreaScreen: 
    cityName: cityName 
    areaName: areaName 
... 

을 AreaScreen