>

각각 동일한 데이터가있는 여러 드롭 다운 목록을 생성하려고하지만 다른 변수로 사용됩니다. 현재 내 코드는 모든 드롭 다운 목록을 생성합니다. 드롭 다운 목록에서 값을 변경하려고 할 때마다 값이 열린 위치가 아닌 마지막 드롭 다운 목록에 값이 할당됩니다.

목록을 사용하지 않고 시작한 다음 코드가 제대로 작동했지만 매우 비효율적이었습니다. 따라서 반복적 인 부분을 줄이고 일부 목록을 작성하고 싶었습니다. 나는 다른 "람다"진술을 가지고 놀았으며 결함이 btn[i].bind(on_release=lambda btn=btn[i]: dropdown[i].select(btn.text)) 에 있다고 믿습니다.  코드 줄 (전적으로 잘못 될 수 있습니다). 내가 작성한 코드로 람다 함수를 올바르게 설정했는지 확실하지 않습니다.

first_row  Excel 파일의 데이터 목록입니다. default_list  임의의 문자열 목록입니다

dropdown = [DropDown() for x in range (len(default_list))]
btn = [Button() for x in range (len(default_list))]
main_btn = [Button() for x in range (len(default_list))]
col_found = GridLayout(cols = 1)
## create buttons for dropdown lists with excel data
for index in range(0, len(first_row)):
     for i in range (0, len(default_list)):
         btn[i] = Button(text=str(first_row[index])+'%d'%i,  size_hint_y=None, height=24, color = (1,1,1,1))
         btn[i].bind(on_release=lambda btn=btn[i]: dropdown[i].select(btn.text))
         dropdown[i].add_widget(btn[i])
## set up main buttons with dropdown lists and add them to the pop up                        
for i in range (0, len(default_list)):
     main_btn[i] = Button(text = "default%d"%i, on_release=dropdown[i].open, color = (1,1,1,1))
     dropdown[i].bind(on_select=lambda instance, x=dropdown[i]: setattr(main_btn[i], 'text', x))
     col_found.add_widget(main_btn[i])


예상 : 드롭 다운에서 값을 선택할 때 해당 "버튼"에 값을 할당해야합니다

실제 결과 : 드롭 다운에서 값을 선택하면 가장 마지막 버튼에 값이 할당됩니다. 더 나은 그림을 보려면 다음 이미지를 참조하십시오.

모든 드롭 다운 목록

잘못된 장소에 할당

  • 답변 # 1

    해결책은 메인 버튼을 만들고 on_release 를 바인딩하는 것입니다.   DropDown 를 생성하고 채우고 여는 이벤트  목록.

    main.py

    from kivy.base import runTouchApp
    from kivy.uix.dropdown import DropDown
    from kivy.uix.button import Button
    from kivy.uix.gridlayout import GridLayout
    default_list = ['Python', 'Kivy', 'Tkinter']
    first_row = ['abc', 'def', 'ghi', 'jkl']
    
    col_found = GridLayout(cols=1)
    
    def show_dropdown(button, *largs):
        dp = DropDown()
        dp.bind(on_select=lambda instance, x: setattr(button, 'text', x))
        for i in range(len(first_row)):
            item = Button(text=str(first_row[i]) + '%d' % i, size_hint_y=None, height=24, color=(1, 1, 1, 1))
            item.bind(on_release=lambda btn: dp.select(btn.text))
            dp.add_widget(item)
        dp.open(button)
    
    for i in range(len(default_list)):
        btn = Button(text=default_list[i], color=(1, 1, 1, 1), size_hint=(None, None))
        btn.bind(on_release=show_dropdown)
        col_found.add_widget(btn)
    
    runTouchApp(col_found)
    
    

    출력

  • 이전 java - 모든 숫자를 고려한 반올림 숫자
  • 다음 node.js - NGINX를 사용하여 포트 80에서 8080으로 전달