2012-06-03 20 views
5

私はこの場所とtkinterを初めて使いました。私はスクロール可能なリストボックスやキャンバスを作るのに悩まされています。私は両方のウィジェットを試しました。このリストボックスまたはキャンバスには、いくつかのエントリウィジェットとラベルウィジェットがあります。原点はR0、C0です。 row/columnconfigureを使用して、リストボックスまたはキャンバスを引き伸ばしました。グリッド内のスクロール可能なリストボックス(tkinterを使用)

メインウィンドウでは、4行目から4行目(0,4→4,4)に4つのボタンがありました。私は第5列にスクロールバーを配置しました。グリッドメソッドを使用しようとしました。私が抱えている問題は、スクロールバーを機能させることです。

注:メインフレームをクラスにすることは、私が試した方法の1つに過ぎません。右側のスクロールバーをパッキングすると、リストボックス/キャンバスが左側にパックされています。しかし、スクロールバーに指示されたリストボックス/キャンバスウィジェットは、リストボックス/キャンバスをスクロールしません。また、多くの入力ボックスを追加しても、リストボックス/キャンバスはスクロールしません。助けてください。

from tkinter import * 
from tkinter.ttk import * 

Style().configure("B.TFrame", relief="flat", 
background="blue") 
Style().configure("R.TFrame", relief="flat", 
background="red") 
Style().configure("R.TLabel", background="red") 

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master, style="B.TFrame") 
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self): 
     top=self.winfo_toplevel() 
     self.menuBar = Menu(top) 
     top["menu"] = self.menuBar 
     self.subMenu = Menu(self.menuBar, tearoff=0) 
     self.subMenu2 = Menu(self.menuBar, tearoff=0) 
     self.menuBar.add_cascade(label="File", menu=self.subMenu) 
     self.menuBar.add_cascade(label="About", menu=self.subMenu2) 
     self.subMenu.add_command(label="Open") 
     self.subMenu.add_command(label="Save") 
     self.subMenu.add_command(label="Exit") 
     self.subMenu2.add_command(label="About") 
     self.subMenu2.add_command(label="Help") 



     self.data = Listbox (self, bg='red') 
     scrollbar = Scrollbar(self.data, orient=VERTICAL) 

     self.add = Button(self, text="") 
     self.remove = Button(self, text="") 
     self.run = Button(self, text="") 
     self.stop = Button(self, text="") 

     self.data.grid (row=0, column=0, rowspan=4, columnspan=4, sticky=N+E+S+W) 
     self.data.columnconfigure(1, weight=1) 
     self.data.columnconfigure(3, weight=1) 

     self.add.grid(row=4,column=0,sticky=EW)  
     self.remove.grid(row=4,column=1,sticky=EW) 
     self.run.grid(row=4,column=2,sticky=EW) 
     self.stop.grid(row=4,column=3,sticky=EW) 
     scrollbar.grid(column=5, sticky=N+S) 
+0

特に、あなたのコードをSOに投稿する場合は、ご注意ください。 – fodma1

答えて

7

リストボックス内のコンテンツがなければ、スクロールする何もない...

これは(例を少し短く)しかし動作するようです。 scrollbar documentationの例も参照してください。

class Application(Frame): 
    def __init__(self, master=None): 
     Frame.__init__(self, master)  
     self.grid(sticky=N+S+E+W) 
     self.mainframe() 

    def mainframe(self):     
     self.data = Listbox(self, bg='red') 
     self.scrollbar = Scrollbar(self.data, orient=VERTICAL) 
     self.data.config(yscrollcommand=self.scrollbar.set) 
     self.scrollbar.config(command=self.data.yview) 

     for i in range(1000): 
      self.data.insert(END, str(i)) 

    self.run = Button(self, text="run") 
    self.stop = Button(self, text="stop") 

    self.data.grid(row=0, column=0, rowspan=4, 
        columnspan=2, sticky=N+E+S+W) 
    self.data.columnconfigure(0, weight=1) 

    self.run.grid(row=4,column=0,sticky=EW) 
    self.stop.grid(row=4,column=1,sticky=EW) 

    self.scrollbar.grid(column=2, sticky=N+S) 

a = Application() 
a.mainframe() 
a.mainloop() 
+0

申し訳ありませんが、私はここにいるばかりです(1年後の返答方法を知りました)。私はその返事を感謝します。私は私の質問を見て、今私は恥ずかしいです。私が持っていた問題は、入力ボックスを追加することでした。私は移動しましたが、12個の入力ボックスを追加して結果をプレビューしたとき、リストボックスの項目はスクロール可能に見えました。ありがとうございました。 – Lect

2

あなたは、スクロールバーにcommand属性を定義する必要があり、あなたはリストボックスにyscrollcommand属性を指定する必要があります。これらの2つの属性は連携して何かをスクロール可能にします。あなたは、Y方向にスクロールされたときに

yscrollcommandオプションは、このコマンドを呼び出し、」リストボックスを伝えます。ときに、ユーザーがスクロール矢印キーを経由して、スクロールバーが更新されるようにこれは、通常、スクロールバーのset方法である。

スコープバーのcommand属性は、「ユーザーがあなたを動かしたときにこのコマンドを呼び出す」と言っています。これは通常、ウィジェットのYまたはX方向のビューパラメータを変更させるウィジェットの方法です(yviewまたはxview)。

あなたの場合、ウィジェットを作成した後、これを行うでしょう:

self.data.config(yscrollcommand=self.scrollbar.set) 
scrollbar.config(command=self.data.yview) 
関連する問題