首页 文章

使用tkinter在网格中滚动列表框

提问于
浏览
7

我是这个地方和tkinter的新手 . 我坚持制作一个可滚动的列表框或画布 . 我试过两个小部件 . 在这个列表框或画布中,我有几个条目和标签小部件 . 原点是R0,C0 . 我使用row / columnconfigure来拉伸列表框或画布 .

在主窗口中,我在第四行到第四列(0,4-> 4,4)上有4个按钮 . 我将滚动条放在第5列 . 我尝试使用网格方法 . 我遇到的问题是使滚动条功能正常 .

注意:将大型机变成一个类只是我尝试过的方法之一 . 打包右侧的滚动条已经起作用,左侧是列表框/画布 . 但是,命令滚动条的列表框/画布窗口小部件不会滚动列表框/画布 . 此外,添加许多输入框不会导致列表框/画布滚动 . 请帮忙 .

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)

2 回答

  • 7

    您必须将 command 属性定义到滚动条,并且必须将 yscrollcommand 属性提供给列表框 . 这两个属性协同工作以使某些内容可滚动 .

    yscrollcommand 选项告诉列表框“当你在Y方向滚动时,调用此命令 . 这通常是滚动条的 set 方法,因此当用户通过箭头键滚动时,滚动条会更新 .

    scorllbar的 command 属性表示"when the user moves you, call this command" . 这通常是窗口小部件的 yviewxview 方法,这会导致窗口小部件在Y或X方向上更改其视图参数 .

    在您的情况下,创建小部件后,您将执行此操作:

    self.data.config(yscrollcommand=self.scrollbar.set)
    scrollbar.config(command=self.data.yview)
    
  • 2

    如果列表框中没有任何内容,则无需滚动...

    这似乎工作(稍微缩短了一些例子) . 另请参阅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()
    

相关问题