私はずっとUbuntu 14.04でkivy 1.7.2
を使っています。非常に使いやすいとkv
言語は、デザインを簡単にします.... kv
で実行することなく、DropDownはほとんど不可能であることが証明されていますが、さらに多くのPythonコードで起動すると問題を抱えている点を除いてDropDownは証明されています。ここで'NoneType'オブジェクトの単純なKivy DropDownエラーには 'bind'属性がありません
...私は
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
kv_text = """#:kivy 1.7.2
<MyWidget>
DropDown:
id: menupanel
on_parent: self.dismiss()
on_select: lambda: None
Button:
id: button_a
size_hint_y: None
text: "A"
Button:
id: button_b
size_hint_y: None
text: "B"
Button:
id: button_opendd
pos_hint: {"top":1, "right":1}
on_release: root.ids.menupanel.open(self)
text: "open"
"""
class MyWidget(FloatLayout):
def __init__(self, **kwargs):
super(FloatLayout, self).__init__(**kwargs)
class MyWidgetApp(App):
def build(self):
return MyWidget()
def main():
Builder.load_string(kv_text)
app = MyWidgetApp()
app.run()
if __name__ == '__main__':
main()
....で始まるものです ....このエラーを生成する.... ...
Traceback (most recent call last):
File "wtfkivy.py", line 60, in <module>
main()
File "wtfkivy.py", line 57, in main
app.run()
File "/usr/lib/python2.7/dist-packages/kivy/app.py", line 577, in run
root = self.build()
File "wtfkivy.py", line 52, in build
return MyWidget()
File "wtfkivy.py", line 48, in __init__
super(FloatLayout, self).__init__(**kwargs)
File "/usr/lib/python2.7/dist-packages/kivy/uix/layout.py", line 61, in __init__
super(Layout, self).__init__(**kwargs)
File "/usr/lib/python2.7/dist-packages/kivy/uix/widget.py", line 163, in __init__
Builder.apply(self)
File "/usr/lib/python2.7/dist-packages/kivy/lang.py", line 1429, in apply
self._apply_rule(widget, rule, rule)
File "/usr/lib/python2.7/dist-packages/kivy/lang.py", line 1531, in _apply_rule
child = cls(__no_builder=True)
File "/usr/lib/python2.7/dist-packages/kivy/uix/dropdown.py", line 160, in __init__
self.container.bind(minimum_size=self._container_minimum_size)
AttributeError: 'NoneType' object has no attribute 'bind'
ドロップダウンさんself.container
はGridLayout
にデフォルト設定されていますが、kv
ファイルで設定した場合は何とかなりません。
kvのDropDown:
をMyDropDown:
に変更し、<MyDropDown>:
の定義をすべて下に置くことで、このエラーを回避しました。その後、Pythonで、私はsuper(MyDropDown,self).__init__()
でクラスを追加しなければならなかった!それは、ドロップダウンにウィジェットの重複セットを入れるだけです。うわー? (私は__init__(**kwargs)
にINIT、私は同じバインドエラーで終わることに変更した場合。えっ?)
は、私は正直ほとんどkv
経由で設定DropDown
の良い例については、インターネット何度もこすり洗い、何も実際にヒットしないようしていますマーク。
たとえPythonで実装したとしても(super(
)、それは好まれません。メインアプリウィジェットの属性にアクセスできるようにするには、DropDownのウィジェットが必要です。
質問:ドロップダウンをほとんど完全にkv
(これはデザインがきれいでアクセスしやすい)にする方法か、それともメインのアプリウィジェットにアクセスできるようにする方法ですか?
EDIT FJSevillaによって示さ及び試験によって確認されるように、ドロップダウンは、バージョン1.7.2に分割されます。多くの人がディストリビューションから提供されたバージョンを使用しているかもしれないので、私は精巧な答えを加えました。
1.7.2では、そのコードには正確に同じエラーがあります。私はこれがUbuntu 14.04で配布されているバージョンのエラーであると想定していますか? – MookiBar
@MookiBar、確か1.7バージョンとの互換性の問題です。 Kivy 1.7はすでにかなり古くなっています(2013年)、Kivy 1.10または1.9にアップグレードしない理由はありますか? – FJSevilla
ですので、問題は完全にバージョンに関連しています。残念ながら、すべてのチェンジログをトロールするのに手間がかからず、「バージョンx.xより前に機能yが壊れている」という場所を見つけることができませんでした。IMHOでは、壊れたDropDownを出しました。それでも、私の目的のために働いたのではなく、それが良い一般的な参考資料であり、そしてその甘いグラフィックなので、あなたの答えをアップアップしました。 (申し訳ありませんが、SOスタッフ、それが不適切な場合) – MookiBar