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
更远的地方,加宽它,将布局更改为 BoxLayout
、GridLayout
和其他几个都没有成功。
我会说我可以在 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
我正在尝试在 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
更远的地方,加宽它,将布局更改为 BoxLayout
、GridLayout
和其他几个都没有成功。
我会说我可以在 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