2017-03-05 22 views
0

私は、複数のフレームx1からx5で構成される「ページ」というリストを持っています。私はtkraise()を使ってそれらの間をナビゲートできるようにしたい。 x1フレームには、中央にx2を上げる次のボタンのみがあり、x5にはx4を上げる前のボタンが中央にのみ表示されます。フレームx2〜x4には次と前のボタンがあり、それに応じて次と前のフレームが上がります。ボタンの位置は、互いに隣り合うように調整する必要があります。tkinter:複数のフレームと機能を持つ単一のボタンを使用

以前のボタンと次のボタンを1つだけ使用して、forループを使ってすべてを達成することは可能ですか?私はforループを使ってx2からx4までのフレームの前/次のボタンを得ることができましたが、コマンドに何を置くべきかわからないので、前の/次のフレームを上げることができます(lambda )。誰かが助けてください。それは、次/前のフレームを取得する簡単な方法であなたを離れるとframes[1:4]の繰り返し処理

from tkinter import * 

root = Tk() 

box = Frame(root) 
box.pack(fill=BOTH, expand=True) 
box.grid_columnconfigure(0, weight=1) 
box.grid_rowconfigure(0, weight=1) 

x1 = Frame(box, bg="gainsboro") 
x1.grid(row=0, sticky="nsew") 

x2 = Frame(box, bg="red") 
x2.grid(row=0, sticky="nsew") 

x3 = Frame(box, bg="blue") 
x3.grid(row=0, sticky="nsew") 

x4 = Frame(box, bg="green") 
x4.grid(row=0, sticky="nsew") 

x5 = Frame(box, bg="snow") 
x5.grid(row=0, sticky="nsew") 

frames = [x1, x2, x3, x4, x5] 

next_button = Button(frames[0], text="Next", command=lambda: frames[1].tkraise()) 
next_button.pack() 

previous_button = Button(frames[-1], text="Previous", command=lambda: frames[-2].tkraise()) 
previous_button.pack() 

for x in frames[1:4]: 
    next_button_2 = Button(x, text="Next", command=lambda: ?) 
    next_button_2.pack(side=RIGHT) 

    previous_button_2 = Button(x, text="Previous", command=lambda: ?) 
    previous_button_2.pack(side=LEFT) 

x1.tkraise() 

root.mainloop() 

答えて

0

は、ここでは非常にうまく機能しません。代わりにインデックスを反復処理してみてください。

for i in range(1,4): 
    nb = Button(frames[i], text="Next", command=frames[i+1].tkraise) 
    nb.pack(side=RIGHT) 
    pb = Button(frames[i], text="Previous", command=frames[i-1].tkraise) 
    pb.pack(side=LEFT) 

注:代わりにラムダの、私はコマンドとしてtkraise方法自体を設定しました。これはパラメータを必要としないため可能です。さもなければ、ラムダのラムダで通常の問題に遭遇します。ラムダがアクセスするすべてのローカル変数は、ループの最後の繰り返し中にあった値で常に見られます。ラムダを使用する場合は、パラメータとしてiの値をキャプチャする必要があります(例:lambda i=i: frames[i+1].tkraise())。

実際に、このように自分でコードの重複のビットを節約し、同じループ内のエンドケースを処理することはかなり簡単で、次のようになります。

for i in range(len(frames)): 
    if i != len(frames) - 1: 
     nb = Button(frames[i], text="Next", command=frames[i+1].tkraise) 
     nb.pack(side=RIGHT) 
    if i != 0: 
     pb = Button(frames[i], text="Previous", command=frames[i-1].tkraise) 
     pb.pack(side=LEFT) 
関連する問題