У меня есть три вопроса/проблемы:Получить значение из kivy ввода текста в процессе сборки кВ
- приведены ниже конфигурации приложение/приложения кв файла почему я должен назвать self.build() в классе ButtonsFactory. Если я удалю его, я получу черный экран, возможно, потому, что в файле kv нет корневого элемента, но если я попытаюсь сделать корневой элемент MainView, у меня тоже будет черный экран.
- второй вопрос, можно ли установить в моем файле someapp.kv минимальную высоту для пользовательских кнопок? Они никогда не должны быть меньше X.
- Последнее, но для меня Самое главное Почему я не могу получить текстовое свойство TextInput из файла kv, в функции класса get_list_of_files()? Какой был бы лучший способ исправить это? Глобальная переменная, которая фиксирует это значение в коде python? Перемещение Builder перед кодом python (embedd kv как строка)?
- последний вопрос ... кнопки «заполнить» 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
Прежде всего, спасибо за интерес и помощь. Двигаясь дальше, я понимаю, но я думал, что все дело в том, что Киви называет себя самой? Возможно, это действительно только для виджетов. 2. и 4. понятны. 3. Ну, вот в чем проблема.Как вы, вероятно, заметили, я попытался установить и использовать это свойство, но только так, как я мог это сделать, было установить его как app.property и изменить (установить по умолчанию) в функции построения. Я не думаю, что это отличное решение, но, тем не менее, это работает, и советы были огромной помощью. –
Уверенный вещь. Функция '' 'build''', о которой вы думаете, является' '' 'App.build''', которую kivy вызывает, чтобы получить корневой виджет для приложения. – bj0