Python3 Kivy 多个下拉菜单不工作

Python3 Kivy Multiple DropDown Menus not working

我正在尝试在 Kivy 中编写应用程序,但遇到了 运行 问题。当我添加第二个下拉菜单(称为 NotesDropDown)时,两个下拉菜单都停止工作。

这里是主要代码:

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.stacklayout import StackLayout
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button

class FileDropDown(DropDown):
    def new(self):
        print('New')

    def open_file(self):
        print('Open')

    def save(self):
        print('Save')

    def save_as(self):
        print('Save As')

class NotesDropDown(DropDown):
    def judges(self):
        print('Judges')

    def clubs(self):
        print('Clubs')

    def locations(self):
        print('Locations')

class AgilityApp(App):
    def build(self):
        root_widget = StackLayout(orientation='lr-tb')

        fdd = FileDropDown()
        fbutton = Button(text='File', size_hint=(None, None),
            size=(60,35))
        fbutton.bind(on_release=fdd.open)
        root_widget.add_widget(fbutton)

        ndd = NotesDropDown()
        nbutton = Button(text='Notes', size_hint=(None, None),
            size=(80,35))
        nbutton.bind(on_release=ndd.open)
        root_widget.add_widget(nbutton)

        return root_widget

AgilityApp().run()

kv文件是

<FileDropDown>:
    Button:
        id: new
        text: 'New'
        size_hint_y: None
        height: 35
        on_release: root.new()
    Button:
        id: open
        text: 'Open'
        size_hint_y: None
        height: 35
        on_release: root.open_file()
    Button:
        id: save
        text: 'Save'
        size_hint_y: None
        height: 35
        on_release: root.save()
    Button:
        id: save_as
        text: 'Save As'
        size_hint_y: None
        height: 35
        on_release: root.save_as()

<NotesDropDown>:
    Button:
        id: judges
        text: 'Judges'
        size_hint_y: None
        height: 35
        on_release: root.judges()
    Button:
        id: clubs
        text: 'Clubs'
        size_hint_y: None
        height: 35
        on_release: root.clubs()
    Button:
        id: locations
        text: 'Locations'
        size_hint_y: None
        height: 35
        on_release: root.locations()

我试过将 NotesDropDown 移到离 FileDropDown 更远的地方,加宽它,将布局更改为 BoxLayoutGridLayout 和其他几个都没有成功。

我会说我可以在 Tkinter 中很好地工作,但我希望使用 kivy 以便我也可以将它制作成移动应用程序。

提前致谢!

我怀疑问题出在垃圾回收上。由于您没有持有对 DropDowns 的引用,因此它们被垃圾收集,然后 Buttons 什么都不做。尝试像这样保存对 DropDowns 的引用:

class AgilityApp(App):
    def build(self):
        Builder.load_string(kv)
        root_widget = StackLayout(orientation='lr-tb')

        self.fdd = FileDropDown()  # save a reference avoid garbage collection
        fbutton = Button(text='File', size_hint=(None, None),
            size=(60,35))
        fbutton.bind(on_release=self.fdd.open)
        root_widget.add_widget(fbutton)

        self.ndd = NotesDropDown()  # save a reference avoid garbage collection
        nbutton = Button(text='Notes', size_hint=(None, None),
            size=(80,35))
        nbutton.bind(on_release=self.ndd.open)
        root_widget.add_widget(nbutton)

        return root_widget