9

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

メイン ウィンドウでは、4 行目から 4 列目に 4 つのボタンがありました (0,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)
4

3 に答える 3

9

リストボックスにコンテンツがなければ、スクロールするものは何もありません...

ただし、これは機能するようです(例を少し短くしました)。スクロールバーのドキュメントの例も参照してください。

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()
于 2012-06-03T14:17:51.260 に答える
3

commandスクロールバーに属性を定義yscrollcommandし、リストボックスに属性を提供する必要があります。これら 2 つの属性が連携して、何かをスクロール可能にします。

このyscrollcommandオプションは、リストボックスに「Y 方向にスクロールしているときに、このコマンドを呼び出します。これは通常、setスクロールバーのメソッドであるため、ユーザーが矢印キーを使用してスクロールすると、スクロールバーが更新されます。

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

あなたの場合、ウィジェットを作成した後、これを行います:

self.data.config(yscrollcommand=self.scrollbar.set)
scrollbar.config(command=self.data.yview)
于 2012-06-03T14:37:43.653 に答える