Выпадающее меню не работает с Kivy Language - PullRequest
0 голосов
/ 28 февраля 2020

Я пытаюсь сделать простое выпадающее меню, используя только Kivy Language.

Эта программа представляет собой простое изображение, которое пользователь может изменить, с помощью кнопки, которая вызывает раскрывающееся меню. Когда программа запускается, часть выпадающего меню появляется внизу. Кроме этого, все выглядит правильно. При нажатии ничего не происходит, кроме исчезающей части выпадающего меню (которую я еще не хотел видеть).

# .py file
import kivy 
from kivy.app import App 
# kivy.require('1.9.0') 

from kivy.uix.scatter import Scatter 
from kivy.uix.widget import Widget 
from kivy.uix.relativelayout import RelativeLayout
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button

# Creating widget class 
class SquareWidget(Widget):
    pass
# Creating Scatter Class 
class ScatterWidget(Scatter):
    do_rotation=False

# Create the layout class 
class Scatter_App(RelativeLayout):
    pass

class ScatterApp(App): 
    def build(self):
        return Scatter_App()

if __name__=='__main__': 
    ScatterApp().run()
# .kv file
# Create the scatter properties        
<SquareWidget>:
    size: self.parent.size
    canvas:
        Rectangle:
            size: self.size 
            pos: self.pos
            source: 'image.jpg'  

<Scatter_App>:
    canvas: 
        Rectangle: 
            size: self.size 
            pos: self.pos 

    ScatterWidget: 
        id: square_widget_id 
        SquareWidget:

    DropDown:
        id: cdd
        Button:
            text: 'Item 1'
        Label:
            text: 'Item 2'
        Label:
            text: 'Item 3'

    Button:
        background_normal: ''
        background_color: 1, .2, .3, .85
        text: 'Choose'
        text_size: self.size
        text_pos: self.height/2,self.width/2
        size_hint: .15,.15
        pos: (self.parent.width-self.width)/2,self.parent.height-self.height
        on_release: cdd.open

1 Ответ

0 голосов
/ 28 февраля 2020

Несколько проблем:

  • Если вы добавите DropDown непосредственно в kv, он станет потомком Scatter_App, как и любой другой Widget. Тогда попытка вызвать open() для него не удастся, потому что open() пытается сделать add_widget (но у DropDown уже есть родитель).
  • Ваше правило для DropDown делает Не указывайте высоту каждого из добавленных Widgets. Из документации :

При добавлении виджетов нам нужно вручную указывать высоту

  • При вызове open() на DropDown вы должны включить аргумент, который указывает Widget, к которому DropDown должен присоединиться.

Итак, учитывая все это, я создал слегка измененную версию вашего kv файла:

# .kv file
# Create the scatter properties     
#:import Factory kivy.factory.Factory
<SquareWidget>:
    size: self.parent.size
    canvas:
        Rectangle:
            size: self.size 
            pos: self.pos
            source: 'image.jpg'  

# add a dynamic class that extends DropDown
<MyDropDown@DropDown>:
    Button:
        text: 'Item 1'
        size_hint_y: None
        height: 40
    Label:
        text: 'Item 2'
        size_hint_y: None
        height: 40
    Label:
        text: 'Item 3'
        size_hint_y: None
        height: 40

<Scatter_App>:
    canvas: 
        Rectangle: 
            size: self.size 
            pos: self.pos 

    ScatterWidget: 
        id: square_widget_id 
        SquareWidget:

    Button:
        background_normal: ''
        background_color: 1, .2, .3, .85
        text: 'Choose'
        text_size: self.size
        text_pos: self.height/2,self.width/2
        size_hint: .15,.15
        pos: (self.parent.width-self.width)/2,self.parent.height-self.height
        on_release: Factory.MyDropDown().open(self)

Я добавил импорт Factory в файл kv, чтобы вы могли создать MyDropDown в файле kv. Я также добавил height спецификации к Widgets, добавленному к DropDown. Вызов MyDropDown.open() теперь включает self (Button).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...