Kivy UI 在第一次与 CustomSpinnerButton 交互时未正确更新

问题描述 投票:0回答:1
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 interface kivy click
1个回答
0
投票

您绑定到了错误的

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()
© www.soinside.com 2019 - 2024. All rights reserved.