from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.properties import ListProperty, StringProperty
from kivy.uix.gridlayout import GridLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.modalview import ModalView
from kivy.core.window import Window
class GridDropDown(ModalView):
def __init__(self, button_ref, options, \*\*kwargs):
super(GridDropDown, self).__init__(\*\*kwargs)
self.size_hint = (None, None)
self.width = Window.width \* 0.6
self.auto_dismiss = False
self.button_ref = button_ref
grid_layout = GridLayout(cols=1, spacing=5, size_hint_y=None)
grid_layout.bind(minimum_height=grid_layout.setter('height'))
scroll_view = ScrollView(size_hint=(1, None), size=(self.width, Window.height * 0.5))
scroll_view.do_scroll_x = False
for option in options:
btn = Button(text=option, size_hint_y=None, height=40, size_hint_x=1)
btn.bind(on_release=self.on_select)
grid_layout.add_widget(btn)
scroll_view.add_widget(grid_layout)
self.add_widget(scroll_view)
def on_select(self, instance):
self.button_ref.text = instance.text
self.dismiss()
class CustomSpinnerButton(Button):
options = ListProperty(\[\])
text = StringProperty('')
def __init__(self, **kwargs):
super(CustomSpinnerButton, self).__init__(**kwargs)
self.bind(on_release=self.open_dropdown)
def open_dropdown(self, *args):
dropdown = GridDropDown(button_ref=self, options=self.options)
dropdown.open()
def on_option_select(self, value):
self.text = value
class MainScreen(BoxLayout):
def __init__(self, \*\*kwargs):
super(MainScreen, self).__init__(\*\*kwargs)
self.orientation = 'vertical'
self.padding = 5
self.spacing = 10
self.name_button = CustomSpinnerButton(text='Name', font_size='20sp', options=["Alice", "Bob", "Charlie"])
self.add_widget(self.name_button)
self.profession_button = CustomSpinnerButton(text='Profession', font_size='20sp', options=["Engineer", "Doctor", "Artist"])
self.add_widget(self.profession_button)
self.name_button.bind(on_release=self.on_name_selected)
def on_name_selected(self, instance):
name_to_profession = {
'Alice': 'Engineer', 'Bob': 'Doctor', 'Charlie': 'Artist'
}
profession = name_to_profession.get(instance.text, '')
if profession:
self.profession_button.text = profession
class MyApp(App):
def build(self):
return MainScreen()
if __name__ == '__main__':
MyApp().run()`
我正在使用 Kivy 开发一个应用程序,其中有两个下拉式按钮,一个名为“Name”,另一个名为“Profession”。每次选择名称时,都会在“职业”按钮中自动选择相应的职业。然而,我遇到了一个问题:第一次选择名称时,“职业”按钮没有更新相应的职业。仅当第二次单击相同名称时才会进行更新。这表明 UI 更新方法存在问题,仅在第二次单击后才生效。我尝试了多种方法来解决这个问题,包括更改事件处理方式和更新 UI,但都没有有效解决该问题。我需要帮助了解为什么会发生这种情况以及如何解决它,以便在第一次点击时正确更新职业。
您绑定到了错误的
Button
。线路:
self.name_button.bind(on_release=self.on_name_selected)
当主 on_name_selected()
Spinner
释放时,触发
Button
方法。这发生在实际选择名称之前。当名称选项 on_name_selected()
释放时,您需要调用 Button
。尝试像这样修改 on_select()
的 GridDropDown
方法:
def on_select(self, instance):
self.button_ref.text = instance.text
# call the method to update the profession
App.get_running_app().root.on_name_selected(instance)
self.dismiss()