我在使用多個Kivy DropDown部件時遇到了一個奇怪的錯誤。
但其中只有6個可以作業。其他4個DropDowns。"汽車"、"綠色"、"Westie "和 "雞 "在點擊時沒有顯示任何東西。
我的源代碼如下:
from typing import List, OrderedDict
from functools import partial
from kivy.app import App
from kivy.lang import Builder
from kivy.uix.label import Label
from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.screenmanager import Screen, ScreenManager
from kivy.uix.widget import Widget
_category_list = ["食物", "顏色", "狗", "汽車", "水果"]
_food_list = ["雞肉", "魚"]
_cars_list = [
"Acura",
"Audi",
"BMW",
"Hyundai"。
"奔馳"。
"Nissan"。
"豐田"。
"沃爾沃"。
_colors_list = ["Red"/span>, "Green"/span>, "Blue"/span>, "Yellow"/span>]
狗狗的名單 = [...
"Bulldog",
"吉娃娃"。
"Dobermann"。
"Husky",
"拉布拉多"。
"Pomeranian",
"貴賓犬"。
"獵犬"。
"Westie",
_fruits_list = ["Apple", "Orange", "Westmelon"]
_node_to_stuff_map = {
"Cars": _cars_list,
"顏色": _colors_list,
"Dogs": _dogs_list,
"食物": _food_list,
"Fruits": _fruits_list,
}
class MainScreen(Screen)。
def add_list_node(self, node: Widget)。
self.mylist.add_widget(node)
class Manager(ScreenManager)。
pass。
Builder.load_string(
""
<MainScreen>。
mylist: id_mylist
BoxLayout:
方向。"垂直"
BoxLayout:
orientation: "水平"
size_hint: 1.0, 0.1
標簽。
文本。"類別"
標簽:
text: "專案串列"
標簽:
text: "引數"
BoxLayout:
id: id_mylist
方向。"垂直"
size_hint: 1.0, 0.9
""
)
class DropDownListBug(App)。
def build(self)。
self.main_screen = MainScreen()
smgr = ScreenManager()
smgr.add_widget(self.main_screen)
self.make_my_lists()
return smgr
def make_ddl(self, a_node: str, a_node_list) -> DropDown。
def select(drop_button, text, btn)。
drop_button.text = text
ddl = DropDown()
ddl_main = Button(text=a_node, size_hint=(1, None), height=50)
for node_type in a_node_list:
btn = Button(text=node_type, size_hint=(1, None), height=50)
btn.bind(on_release=partial(select, ddl_main, btn.text))
btn.bind(on_release=ddl.dismiss)
ddl.add_widget(btn)
ddl_main.bind(on_press=ddl.open)
return ddl_main
def make_my_lists(self)。
my_list = [
"Cars.Hyundai"。
"Colors.Green"。
"Dogs.Westie",
"Food.Chicken",
"Fruits.Apple",
]
for node in my_list:
toks = node.split("。")
node_type, node_item = toks[0], toks[1]
node_panel = BoxLayout(orientation="horizontal")
dll_category = self.make_ddl(node_type, _category_list)
node_panel.add_widget(dll_category)
item_list = _node_to_stuff_map[node_type] 。
ddl_items = self.make_ddl(node_item, item_list)
node_panel.add_widget(ddl_items)
lbl = Label(text="[params]", size_hint=(1, None), height=50)
node_panel.add_widget(lbl)
self.main_screen.add_list_node(node_panel)
if __name__ == "__main__"/span>:
DropDownListBug().run()
更讓人困惑的是,如果你改變了串列的長度,作業/不作業的DropDown部件就會改變!
例如,從汽車中洗掉 "Toyota"、"Volvo "并添加 "White "顏色:不作業的 DropDowns 現在變成了 "Cars"、"Colors"、"Dogs"、"Chicken"。 完全怪異。
uj5u.com熱心網友回復:
問題在于,Python正在進行垃圾收集,洗掉未參考的物件。在你的make_ddl()方法中的ddl變數持有DropDown實體,一旦make_ddl()回傳,該變數就會成為未參考物件,并符合垃圾收集的條件。其結果是,在某些情況下,當Button被按下時,DropDown不再存在。一個簡單的方法是保留一個對DropDown的參考,這樣它就不會被垃圾回收。像這樣:
ddl = DropDown()
ddl_main = Button(text=a_node, size_hint=(1, None), height=50)
ddl_main.ddl = ddl
現在Button持有對其DropDown的參考,所以它不會變得沒有參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/316556.html
標籤:

