python - 为什么(Kivy)下拉菜单不显示?
问题描述
我正在尝试创建一个使用 KivyDropDown
类的简单示例。很简单,点击一个主按钮,然后应该会出现 2 个按钮的下拉列表。我不使用.bind
方法,所以这是我的代码:
import kivy
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
dropdown = DropDown()
btn1 = Button(text = "attack")
btn2 = Button(text = "item")
dropdown.add_widget(btn1)
dropdown.add_widget(btn2)
class MainButton(Button):
def on_release(self):
super().on_release()
print("something")
dropdown.open(self)
class Layout(FloatLayout):
pass
btn = MainButton(text = "Hello")
class theApp(App):
def build(self):
layout = Layout()
layout.add_widget(btn)
btn.pos_hint = {'x': 0.5, 'y': 0.5}
btn.size_hint = (0.25, 0.25)
return layout
app = theApp()
app.run()
另一个问题,当我在DropDown.open
类方法之外使用该方法时,我得到一个错误:
import kivy
from kivy.app import App
from kivy.uix.dropdown import DropDown
from kivy.uix.button import Button
from kivy.uix.floatlayout import FloatLayout
dropdown = DropDown()
btn1 = Button(text = "attack")
btn2 = Button(text = "item")
dropdown.add_widget(btn1)
dropdown.add_widget(btn2)
btn = Button(text = "Hello")
class theApp(App):
def build(self):
layout = FloatLayout()
layout.add_widget(btn)
btn.pos_hint = {'x': 0.5, 'y': 0.5}
btn.size_hint = (0.25, 0.25)
dropdown.open(btn)
return layout
app = theApp()
app.run()
File "/usr/lib/python3/dist-packages/kivy/uix/dropdown.py", line 245, in open
'Cannot open a dropdown list on a hidden widget')
kivy.uix.dropdown.DropDownException: Cannot open a dropdown list on a hidden widget
为什么是这样?谢谢你。
解决方案
按下按钮时看不到两个按钮的原因是MainButton
您没有为每个按钮设置高度。
尝试给他们一个高度:
btn1 = Button(text = "attack")
btn1.size_hint_y = None
btn1.height = 44
btn2 = Button(text = "item")
btn2.size_hint_y = None
btn2.height = 44
dropdown.add_widget(btn1)
dropdown.add_widget(btn2)
这是我手机上的输出:
在点击按钮之前:
点击按钮后:
对于您的第二个问题,我认为您不能在build
方法内执行此操作,因为layout
尚未返回小部件。您可以创建一个新方法并在按下按钮时执行它。
def build(self):
layout = FloatLayout()
layout.add_widget(btn)
btn.pos_hint = {'x': 0.5, 'y': 0.5}
btn.size_hint = (0.25, 0.25)
btn.on_release = self.showDropdown
return layout
def showDropdown(self):
dropdown.open(btn)
推荐阅读
- python - 与 `top` 相比,tracemalloc.get_traced_memory 显示大约 1/10 的内存使用量
- azure-devops - How to Tag a branch Automatically in Azure DevOps using extension (Tag/Branch Git On Release)
- javascript - '不能在模块外使用 import 语句'与 ES6 Node v.12
- highcharts - ShadowOptionsObject 示例
- java - 如何通过适配器将图像数组传递给 NewActivity
- c++ - 未评估上下文中的函数模板实例化
- haskell - 无法摆脱 reflex-dom 中的递归
- html - NUXTJS | 第一次调用加载 css / layout 时出错
- kotlin - 在不传播的情况下访问对象中的 ApplicationCall
- c# - 每帧更新bufferarray OpenTK