2015-05-12 3 views
1

У меня есть три вопроса/проблемы:Получить значение из kivy ввода текста в процессе сборки кВ

  1. приведены ниже конфигурации приложение/приложения кв файла почему я должен назвать self.build() в классе ButtonsFactory. Если я удалю его, я получу черный экран, возможно, потому, что в файле kv нет корневого элемента, но если я попытаюсь сделать корневой элемент MainView, у меня тоже будет черный экран.
  2. второй вопрос, можно ли установить в моем файле someapp.kv минимальную высоту для пользовательских кнопок? Они никогда не должны быть меньше X.
  3. Последнее, но для меня Самое главное Почему я не могу получить текстовое свойство TextInput из файла kv, в функции класса get_list_of_files()? Какой был бы лучший способ исправить это? Глобальная переменная, которая фиксирует это значение в коде python? Перемещение Builder перед кодом python (embedd kv как строка)?
  4. последний вопрос ... кнопки «заполнить» scrollview_id вместо сохранения размера и прокручиваться внутри этого представления, я бы хотел, чтобы они перестали настраивать размер.

someapp.py Файл

from kivy.app import App 
from kivy.factory import Factory 
from kivy.properties import ObjectProperty, StringProperty 
# views 
from kivy.uix.modalview import ModalView 
# layouts 
from kivy.uix.boxlayout import BoxLayout 

import os 

# defined in kv file. 
class HeaderContainer(BoxLayout): pass 
class ButtonsContainer(BoxLayout): pass 
class MainView(ModalView): pass 

class ButtonsFactory(BoxLayout): 
    target_location = StringProperty(None) 
    def __init__(self, *args, **kwargs): 
     super(ButtonsFactory, self).__init__(*args, **kwargs) 

     self.build() # Question 1: is that neccessary? (i think not, but black screen without it, why?) 

    def build(self): 
     self.orientation = "vertical" 
     for file_name in self.get_list_of_files(): 
      btn = Factory.CustomButton() 
      with open(file_name, 'r') as test_file: 
       btn.file_name = test_file.readline().strip()[1:20] 
      btn.nice_name = file_name # Question 2: is it possible to set minimum height for kivy button? (havent found in api) 
      self.add_widget(btn) 
     # print ("1.!!!!!!", self.target_location) == NONE 
    @classmethod 
    def get_list_of_files(cls): 
     # print "2.!!!!!!", repr(cls.target_location) == <kivy.properties.StringProperty object at 0x7f1dd7596e20> 
     dir_ = "/tmp" #dir_ = cls.target_location 
     try: 
      files = [os.path.join(dir_, name) for name in os.listdir(dir_) 
        if os.path.isfile(os.path.join(dir_, name))] 
     except (OSError, IOError): 
      files = [] 
     return files 

class SomeApp(App): 
    def on_pause(self): 
     pass 
    def on_resume(self): 
     pass 
    def build(self): 
     return MainView() 

if __name__ == '__main__': 
    SomeApp().run() 

и someapp.kv

#:kivy 1.8.0 
#:import platform platform 

<[email protected]>: 
    file_name: '' 
    nice_name: '' 
    text: root.nice_name + "\n" + root.file_name 
    halign:'center' 
    size_hint:(1, 0.1) 

<HeaderContainer>: 
    id: header_layout 
    size_hint:(1, 0.1) 
    orientation:'horizontal' 
    # 2-nd-try # target_location: textinput_target_location.text 
    # I was trying here to pass by ObjectProperty (or StringProperty) but unfortunately failed. 
    TextInput: 
     size_hint:(0.7, 1) 
     id: textinput_target_location 
     multiline: False 
     hint_text: "path where stress files are stored, default /sdcard/appdir" 
     text: "/tmp" if platform.machine() in ["x86_64", "i686", "i386"] else "/sdcard/appdir/" # arm "arm7l", but also other arm's 
     #on_text: my_callback_to_reload_dir_contents() 
    Button: 
     size_hint:(0.2, 1) 
     id: read_target_location 
     text: "read target_location directory" 
     #on_release: my_callback_to_reload_dir_contents() 

<ButtonsContainer>: 
    size_hint:(1, 0.9) 
    orientation:'vertical' 
    ScrollView: 
     id: scrollview_id 
     orientation: 'vertical' 
     ButtonsFactory 


<MainView>: 
    BoxLayout: 
     # 1-st-try # target_location: HeaderContainer.target_location 
     id: main_layout 
     padding:10 
     spacing: 5 
     orientation:'vertical' 
     HeaderContainer 
     # n-th-try # target_location: HeaderContainer.target_location 
     ButtonsContainer 

ответ

0

Постараюсь решить ваши вопросы:

1) Глядя на ваш код , ButtonsFactory - всего лишь BoxLayout, который является контейнером для хранения других виджетов. Функция self.build создает CustomButton виджетов и помещает их в контейнер. Если вы не вызываете self.build, в контейнер не добавляется, и у вас есть пустой (пустой) BoxLayout.

2) Это немного сложнее, поскольку высота обычно контролируется контейнером, удерживающим ваш виджет. Вы можете вручную установить высоту виджетов, установив для свойства size_hint значение None и указав высоту.

3) Я бы никогда не использовал глобальные переменные, если их можно избежать. В этом случае, если вам нужен только доступ к текстовому содержимому TextInput, я привяжу его к StringProperty, прикрепленному к виджему, к которому вы можете получить доступ, или к самому объекту приложения (к которому можно получить доступ в любом месте .kv как app.<property>.

4) Опять же, высота контролируется контейнером, в котором находятся виджеты (a BoxLayout). Вы можете вручную управлять своим размером, установив size_hint в None на виджеты.

Другая проблема заключается в том, что вы помещаете BoxLayout (ваш ButtonsFactory) внутри ScrollViewer. BoxLayout изменяет размеры, чтобы точно соответствовать внутри ScrollViewer, чтобы он не прокручивался. Вам необходимо переопределить это поведение, очистив size_hint. См. this SO question.

+0

Прежде всего, спасибо за интерес и помощь. Двигаясь дальше, я понимаю, но я думал, что все дело в том, что Киви называет себя самой? Возможно, это действительно только для виджетов. 2. и 4. понятны. 3. Ну, вот в чем проблема.Как вы, вероятно, заметили, я попытался установить и использовать это свойство, но только так, как я мог это сделать, было установить его как app.property и изменить (установить по умолчанию) в функции построения. Я не думаю, что это отличное решение, но, тем не менее, это работает, и советы были огромной помощью. –

+0

Уверенный вещь. Функция '' 'build''', о которой вы думаете, является' '' 'App.build''', которую kivy вызывает, чтобы получить корневой виджет для приложения. – bj0

Смежные вопросы