2016-04-19 74 views
1

我已經構建了一個簡單的程序,用於掃描藍牙設備並在按鈕上顯示其名稱/地址。代碼:在Python/Kivy的循環中創建不同的按鈕?

def discover(self, *args): 
    devList = discover_devices() 
    for device in devList: 
     name = str(lookup_name(device)) 
     if str(lookup_name(device)) == "": 
      name = "Unknown device" 
     deviceinfo = "[color=1f358e][font=tahoma]Device name: [color=1f358e][font=tahoma]" + str(name) + "\n[color=1f358e][font=tahoma]MAC address: [color=1f358e][font=tahoma]" + str(device) 
     btnDevice = Button(text=deviceinfo, markup = True, font_size='17sp') 
     btnDevice.bind(on_release=self.optionmenu) 
     box.add_widget(btnDevice) 


    self.boxes.add_widget(box) 
    layout.clear_widgets() 

def optionmenu(self, *args): 
    print name 

所以,基本上,我想A.)發現藍牙設備並將其添加到devList,B.)創建一個按鈕顯示的設備名稱/地址在devList,C.每個設備)允許讓用戶點擊一個按鈕並打印該按鈕分配給的設備的名稱。我確信在這部分代碼中必須有一些重要的結構變化才能工作,但我無法弄清楚究竟是什麼。

+0

您可以替換'name = ...;順便說一句,如果str(lookup ...:name = ...''with'name = lookup_name(device)or'Unknown device'',順便說一下。 – TigerhawkT3

+0

你試過了嗎?on_release = lambda x = name:self.optionmenu名字)''與'def optionmenu(self,name):print name'? – TigerhawkT3

+0

@ TigerhawkT3是的,點擊任何按鈕都會返回相同的名稱,我猜測它找到的最後一個。 – Karrigan

回答

0

我相信這應該可以做到。

def discover(self, *args): 
    devList = discover_devices() 
    for device in devList: 
     name = str(lookup_name(device)) 
     if str(lookup_name(device)) == "": 
      name = "Unknown device" 
     deviceinfo = "[color=1f358e][font=tahoma]Device name: [color=1f358e][font=tahoma]" + str(name) + "\n[color=1f358e][font=tahoma]MAC address: [color=1f358e][font=tahoma]" + str(device) 
     btnDevice = Button(text=deviceinfo, markup = True, font_size='17sp') 
     btnDevice.bind(on_release=self.optionmenu) 
     box.add_widget(btnDevice) 


    self.boxes.add_widget(box) 
    layout.clear_widgets() 

def optionmenu(self, instance): 
    print instance.text 

「Instance」僅表示您按下的按鈕對象。當然,你可以將其改爲任何你喜歡的。