2017-09-14 14 views
1

私はチェックボックスのリストが表示され、スクロール可能な新しいウィンドウを開こうとします。Scrollbar、Checkbutton、canvas in python 2.7

しかし、私のリストはスクロールされません。新しいウィンドウが開かれなければならないことを、私はこの特定のものへの答えを見つけることができません

class PageCanvas1(tk.Toplevel): 
    def __init__(self, parent): 
     global arr 
     global users 
     arr = {} 
     tk.Toplevel.__init__(self, parent) 
     self.title('Canvas') 
     self.geometry('400x600') 
     canvas = tk.Canvas(self, bg='white', scrollregion=(0, 0, 400, 20000)) 
     canvas.pack(fill='both', expand=True) 

     vbar = tk.Scrollbar(canvas, orient='vertical') 
     vbar.pack(side='right', fill='y') 
     vbar.config(command=canvas.yview) 
     canvas.config(yscrollcommand=vbar.set) 
     canvas.create_text(5, 0, anchor='nw', text="Choose users: ") 
     for i in range(1000): 
      arr[i] = tk.IntVar() 
      Checkbutton(canvas, text=str(i), variable=arr[i]).pack()#.grid(row=i, sticky=W) 

root = Tk() 
b_choose = Button(root, text='choose users', height=3, width=15, bg="turquoise", command=(lambda arr=ents: PageCanvas(root))) 

no scroll

: これは私のコードです!私は助けて嬉しいです!

答えて

0
import Tkinter as tk 

class PageCanvas1(tk.Toplevel): 
    def __init__(self, parent): 
     global arr # why use global? set it as an attribute? 
     global users # same as above? 
     arr = {} 
     tk.Toplevel.__init__(self, parent) 
     self.title('Canvas') 
     self.geometry('400x600') 
     canvas = tk.Canvas(self, bg='white', scrollregion=(0, 0, 400, 20000)) 
     canvas.pack(fill='both', expand=True) 

     vbar = tk.Scrollbar(canvas, orient='vertical') 
     vbar.pack(side='right', fill='y') 
     vbar.config(command=canvas.yview) 
     canvas.config(yscrollcommand=vbar.set) 
     canvas.create_text(5, 0, anchor='nw', text="Choose users: ") 
     # we need a container widget to put into the canvas 
     f = tk.Frame(canvas) 
     # you need to create a window into the canvas for the widget to scroll 
     canvas.create_window((200, 0), window=f, anchor="n") 
     for i in range(0, 1000): 
      arr[i] = tk.IntVar() 
      # widget must be packed into the container, not the canvas 
      tk.Checkbutton(f, text=str(i), variable=arr[i]).pack()#.grid(row=i, sticky=W) 

if __name__ == "__main__": 
    app = PageCanvas1(None) 
    app.mainloop() 
+1

説明なしですべてのコードである回答はほぼ無駄です。読者は、あなたが何を変更したかを見るために、行単位で行なわなければなりません。この答えは、コードが何を異なるのか、なぜそれがうまくいくのかを説明するパラグラフまたは2を追加した方が良いでしょう。 –

+0

@James Kentに感謝します!あなたは私の日を救った!とブライアンオークリー、彼はコードの説明を追加 – ShiraOzeri

+0

あなたのコードを使用しました。そして問題は解決されました!今私はフレームのサイズに別の小さな問題があります。大きすぎるリストを作成すると、リストの先頭が表示されません(たとえば、このコードでは500番からしか見えません)。 – ShiraOzeri

1

あなたはgridpack、またはplaceとだけでなく、彼らがキャンバスに追加された場合create_windowメソッドを介してキャンバス内のオブジェクトをスクロールし、することができます。