2016-10-29 2 views
-1

以下は8個のボタンがあるコントロールパネル用のコードです。Python Tkinterのボタンリストへのアクセス

from Tkinter import * 
import ttk 

class light_control(Frame): 
    def __init__(self,i,parent,root,ltext,btext): 
    Frame.__init__(self,parent) 
    self.lc_Label = Label(self,text=ltext).pack() 
    self.lc_Button = Button(self, 
       text=btext, 
       width=10, 
       command=lambda i=i:root.toggle_button(i) 
       ).pack() 

class mi_control_panel(Frame): 
def __init__(self, master=Tk()): 
    Frame.__init__(self, master) 
    self.master = master 
    self.init_window() 

def init_window(self): 
    self.grid() 
    self.master.title("Control Panel") 
    self.pack(fill=BOTH, expand=1) 
    self.master.attributes('-zoomed', True) 
    self.state = True 
    self.master.attributes("-fullscreen", self.state) 
    self.light_controls = [] 
    self.render_notebook() 

def toggle_button(self,x): 
    print self.light_controls[x].lc_Button 

def render_notebook(self): 
    n = ttk.Notebook(self) 
    f1 = ttk.Frame(n) 
    text2 = Label(f1,text='Control Panel for Lights',relief='ridge') 
    text2.grid(row=0,column=0,columnspan=4) 
    for x in xrange(8): 
     b = light_control(x,f1,self,"Light "+str(x),"OFF") 
     self.light_controls.append(b) 
    for i in xrange(1,3): 
     for j in xrange(4): 
     self.light_controls[4*i+j-4].grid(row=i,column=j,padx='80',pady='30') 

    n.add(f1, text='Lights') 
    n.grid(row=0,column=0,sticky='EW') 

micp = mi_control_panel() 
micp.tk.mainloop() 

私の問題は、ボタンをクリックすると、私が得るのはNoneです。つまり、関数toggle_buttonが呼び出されていますが、クラスlight_controlの変数lc_Buttonにアクセスできません。私がやりたいことは、同じコールバック関数にアタッチされたボタンのリストを作成して、どのボタンがクリックされたかを識別し、それに応じてアクションを実行することです。変数xをtoggle_button関数で表示することができます。それはうまく動作します。どのガイドラインも高く評価されています。前もって感謝します。

+0

を必要とするあなたは、 'ラムダI = Iを使用しての代わりに試してみました。 toggle_button(i) '?これは私がラムダ関数を定義する方法です。 – Sens4

+0

'lambda i:root.toggle_button(i)'は 'TypeError:()はちょうど1つの引数(0が与えられます)を返します。 ' –

答えて

0

あなたの問題は、それはあなたがところで

elf.lc_Button = Button(...) 
elf.lc_Button.pack() 

を必要とし、常にNone

あるpack()によって返された変数の値に代入し

elf.lc_Button = Button(...).pack() 

です:あなたと同じ間違いを持っ​​ていますLabel

ルート:I root.toggle_button(I) `このコード`ラムダ:
self.lc_Label = Label(...).pack() 

あなたがself.lc_Labelを使用する必要がありますので、もし、あなたが

self.lc_Label = Label(...) 
self.lc_Label.pack() 
+0

どうもありがとうございました。あなたにトラブルを与えるための謝罪。そして、私はこのような単純なことを見落とすために恥ずかしいです。 –

関連する問題