2017-07-12 25 views
0

我創建了一個類來創建一批checkbutton,如下所示。 我試圖得到chekbutton的號碼來表明哪一個被按下(沒有成功)。使用Python傳遞CheckButton的編號類

stat函數被調用時發送所有checkbuttons的狀態。

有什麼想法?

class dev_buttons2(object): 
    def __init__(self,master,buts_list): 
    self.status=[] 
    for i in range(len(buts_list)): 
     self.var = IntVar() 
     self.name=buts_list[i] 
     self.c = Checkbutton(master,text=buts_list[i], variable=self.var, 
     indicatoron=0,command=self.cb,width=10,height=2) 
     self.c.grid(column=i, padx=5,row = 10) 
     self.status.append(self.var) 

def cb(self): 
    print(self.name) 


def stat(): 
    return self.status 

回答

0

使用lambda功能 - 我通過儘可能多的價值,我想arg(見代碼註釋)。

class SwitchButtons: 
def __init__(self, master, frame, num_of_buttons): 
    self.master = master 
    self.status = [] 
    self.buts = [] 
    self.leds = [] 
    bg_window = "DeepSkyBlue4" 
    self.framein = Frame(frame) 
    self.framein.grid(padx=5, pady=5) 

    #Create Widgets of buttons 
    for i in range(num_of_buttons): 
     button_var = StringVar() 
     entry_var = IntVar() 
     led_var = StringVar() 
     t = 35 
     ent = Entry(self.framein, textvariable=entry_var, width=4, justify="center") 
     ent.grid(column=i, row=2, sticky=W, padx=t) 

     led = Label(self.framein, textvariable=led_var, width=4, bg="red", fg="white", relief="ridge") 
     led_var.set("off") 
     led.grid(row=0, column=i, pady=0) 

     c = Checkbutton(self.framein, text="Switch " + str(i), variable=button_var, indicatoron=0, 
         width=10, height=2, onvalue="on", offvalue="off", 
         command=lambda arg=[i, button_var, entry_var]: #### Use Lambda to pass several arguments to "arg" 
self.cb(arg)) 
     c.grid(column=i, padx=30, pady=5, row=1) 
     button_var.set("off") 

     mins = Label(self.framein, text="min.", width=4, justify="center", fg="black") 
     mins.grid(column=i, row=2, sticky=E, padx=t) 

     self.status.append([button_var, led_var, entry_var]) 
     self.buts.append(c) 
     self.leds.append(led) 
     ### 

def cb(self, but, state='', a=''): 
    # but = [ switch#, switch state, delay] ## explanatory 

    ##In use only in CB_DELAYED 
    if state != '': 
     but[1].set(state) 

    def switch_onoff(): 
     if but[1].get() == "on": 
      self.leds[but[0]].config(bg="green") 
      self.status[but[0]][1].set("on") 
     elif but[1].get() == "off": 
      self.leds[but[0]].config(bg="red") 
      self.status[but[0]][1].set("off") 

    if but[2].get() > 0 and but[1].get() == "on": 
     a = ", Auto shutdown in %s minutes." % (but[2].get()) 
     switch_onoff() 
     print("Delayed", but[1].get()) 
     self.cb_delayed(but) 
    else: 
     switch_onoff() 

    self.master.loop.device_chage_state(but[0], but[1].get(), text=a) 

def cb_delayed(self, but): 
    self.framein.after(but[2].get() * 1000, self.cb, but, "off")