私はKivyプロジェクトで作業しており、リストに要素がない場合はラベルを表示する必要があります。それ以外の場合は、リストビューを表示する必要があります。
これらは、私が説明している2つのシナリオです。
これは私のKivyファイルです:
#: kivy 1.9.1
#: import ListAdapter kivy.adapters.listadapter.ListAdapter
#: import FriendItemButton gui.FriendItemButton
ChumMeRoot:
<ChumMeRoot>:
friend_list_view: friend_list_view
FriendList:
id: friend_list_view
<FriendItemButton>:
text: self.full_name
height: "40dp"
size_hint_y: None
<FriendList>:
orientation: 'vertical'
friend_list: friend_list_view
Button:
height: '45dp'
size_hint_y: None
text: 'Add Friend'
on_press: app.root.show_add_friend_form()
ListView:
id: friend_list_view
adapter:
ListAdapter(
data=[],
cls=FriendItemButton,
args_converter=root.args_converter)
<AddFriendFormInput@BoxLayout>
height: '30dp'
size_hint_y: None
<AddFriendForm>:
orientation: 'vertical'
first_name_input: first_name
last_name_input: last_name
AddFriendFormInput:
Label:
text: 'First Name'
TextInput:
id: first_name
AddFriendFormInput:
Label:
text: 'Middle Name'
TextInput:
AddFriendFormInput:
Label:
text: 'Last Name'
TextInput:
id: last_name
AddFriendFormInput:
Label:
text: 'Birthdate'
TextInput:
AddFriendFormInput:
Label:
text: 'Email'
TextInput:
AddFriendFormInput:
Label:
text: 'Cell Phone'
TextInput:
BoxLayout:
BoxLayout:
height: '40dp'
size_hint_y: None
Button:
text: 'Cancel'
on_press: app.root.show_friend_list()
Button:
text: 'Add friend'
on_press: app.root.add_friend()
これは私のPythonコードです:
import os
from kivy.app import App
from kivy.properties import ObjectProperty, StringProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.listview import ListItemButton
from friend import Friend
from friend_manager import FriendManager
def get_friend_manager():
db_path = '{}/{}'.format(
os.path.dirname(os.path.abspath(__file__)),
'chumme.db'
)
return FriendManager(db_path)
def get_friends():
return [(friend.full_name,)
for friend in get_friend_manager().get_friends()]
class ChumMeRoot(BoxLayout):
add_friend_form = ObjectProperty()
friend_list_view = ObjectProperty()
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.update_friend_list_view()
def update_friend_list_view(self):
friend_list = self.friend_list_view.friend_list
friend_list.adapter.data.clear()
friend_list.adapter.data.extend(get_friends())
friend_list._trigger_reset_populate()
def show_add_friend_form(self):
self.clear_widgets()
self.add_friend_form = AddFriendForm()
self.add_widget(self.add_friend_form)
def show_friend_list(self):
self.clear_widgets()
self.update_friend_list_view()
self.add_widget(self.friend_list_view)
def add_friend(self):
friend = Friend(first_name=self.add_friend_form.first_name_input.text,
last_name=self.add_friend_form.last_name_input.text)
get_friend_manager().add_friend(friend)
self.show_friend_list()
class AddFriendForm(BoxLayout):
first_name_input = ObjectProperty()
last_name_input = ObjectProperty()
class FriendList(BoxLayout):
friend_list = ObjectProperty()
def args_converter(self, index, data_item):
return {'full_name': (data_item[0])}
class FriendItemButton(ListItemButton):
full_name = StringProperty()
class ChumMeApp(App):
pass
def main():
ChumMeApp().run()
if __name__ == '__main__':
main()
これまでのところ、基本的にウィジェットをルートから削除しないようにする この解決策 を見つけました。試しましたが、参照を失い、アプリがクラッシュしました。また、表示されている画面の外に要素を配置したくないので、誰かがウィジェットを 'self.widget_name.hide()or
self.widget_name。 hide = True`、または誰かがこのタスクを達成するための良い方法を教えてもらえますか?
@yogabonitoが提案したように、この場合はウィジェットの高さを0dp
(そして明らかに属性size_hint_y
)に設定することでした。
したがって、これは私がkivyファイルで行った変更です:
<FriendList>:
orientation: 'vertical'
friend_list: friend_list_view
no_friends_label: no_friends_label
Button:
height: '45dp'
size_hint_y: None
text: 'Add Friend'
on_press: app.root.show_add_friend_form()
Label:
id: no_friends_label
ListView:
id: friend_list_view
adapter:
ListAdapter(
data=[],
cls=FriendItemButton,
args_converter=root.args_converter)
ご覧のとおり、ルートにno_friends_label
という参照を持つLabelウィジェットを追加しました。
これは、Pythonファイルに加えた変更です:
class FriendList(BoxLayout):
friend_list = ObjectProperty()
no_friends_label = ObjectProperty()
def args_converter(self, index, data_item):
return {'full_name': (data_item[0])}
class ChumMeRoot(BoxLayout):
add_friend_form = ObjectProperty()
friend_list_view = ObjectProperty()
# __init__ method
def update_friend_list_view(self):
friends = get_friends()
no_friends_label = self.friend_list_view.no_friends_label
friend_list = self.friend_list_view.friend_list
if friends:
friend_list.size_hint_y = 1
friend_list.adapter.data.clear()
friend_list.adapter.data.extend(friends)
friend_list._trigger_reset_populate()
no_friends_label.size_hint_y = None
no_friends_label.height = '0dp'
no_friends_label.text = ''
else:
no_friends_label = self.friend_list_view.no_friends_label
no_friends_label.size_hint_y = 1
no_friends_label.text = 'There are no friends to show.'
friend_list.size_hint_y = None
friend_list.height = '0dp'
# remaining methods
まず、kivyファイルに対応する参照を持つkivyプロパティfriend_list
を追加しました。次に、ユーザーの友達の数に応じて、ラベルまたはリストビューを「非表示」または「表示」します。
すべてのウィジェットとユースケースで機能するはずです:
def hide_widget(wid, dohide=True):
if hasattr(wid, 'saved_attrs'):
if not dohide:
wid.height, wid.size_hint_y, wid.opacity, wid.disabled = wid.saved_attrs
del wid.saved_attrs
Elif dohide:
wid.saved_attrs = wid.height, wid.size_hint_y, wid.opacity, wid.disabled
wid.height, wid.size_hint_y, wid.opacity, wid.disabled = 0, None, 0, True