【问题标题】:scrollable listbox within a grid using tkinter使用 tkinter 的网格内的可滚动列表框
【发布时间】:2012-06-07 21:49:28
【问题描述】:

我是这个地方和 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)

【问题讨论】:

  • 请避免使用通配符导入,特别是如果您将代码发布在 SO..

标签: python grid scrollbar tkinter


【解决方案1】:

列表框中没有任何内容,就没有什么可以滚动的了……

这似乎可行(稍微缩短了示例)。另请参阅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()

【讨论】:

  • 抱歉,我是新来的(刚学会如何查看回复……一年后。)。我很感激你的回复。我看着我的问题,我现在很尴尬。我遇到的问题是添加输入框。我继续前进,但是当我添加 12 个以上的输入框并预览结果时,屏幕上的列表框项目看起来可滚动。谢谢。
【解决方案2】:

您必须为滚动条定义command 属性,并且必须为列表框提供yscrollcommand 属性。这两个属性一起工作以使某些东西可滚动。

yscrollcommand 选项告诉列表框“当你在 Y 方向滚动时,调用这个命令。这通常是滚动条的 set 方法,这样当用户通过箭头键滚动时,滚动条得到更新了。

scorllbar 的command 属性表示“当用户移动您时,调用此命令”。这通常是小部件的yviewxview 方法,它会导致小部件在Y 或X 方向更改其视图参数。

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

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

【讨论】:

    【解决方案3】:

    这个线程很旧,但如果其他人像我一样遇到它,它需要一些精度。

    Junuxx 的答案不能按原样工作,不仅因为这里难以获取代码(来自“大型机”功能的一部分“self.run”)导致缩进问题,而且因为似乎有必要将列表框和滚动条在它们自己的框架中。

    这是 Python 2 和 3 的工作代码:

    #!/usr/bin/env python2
    
    try:
       # for Python2
       from Tkinter import *
    except ImportError:
       # for Python3
       from tkinter import *
    
    class   Application(Frame):
        def __init__(self,  master=None):
            Frame.__init__(self, master)
            self.grid(sticky=N+S+E+W)
            self.mainframe()
    
        def mainframe(self):
           frame = Frame(self)
           scrollbar = Scrollbar(frame, orient=VERTICAL)
           data = Listbox(frame, yscrollcommand=scrollbar.set,
                  bg='red')
           scrollbar.config(command=data.yview)
           scrollbar.pack(side=RIGHT, fill=Y)
           data.pack(side=LEFT, fill=BOTH, expand=1)
    
           for i in range(1000):
              data.insert(END, str(i))
    
           self.run = Button(self, text="run")
           self.stop = Button(self, text="stop")
    
           frame.grid(row=0, column=0, rowspan=4,
                       columnspan=2, sticky=N+E+S+W)
           frame.columnconfigure(0, weight=1)
    
           self.run.grid(row=4,column=0,sticky=EW)
           self.stop.grid(row=4,column=1,sticky=EW)
    
    a = Application()
    a.mainframe()
    a.mainloop()
    

    您可以在这里找到更多信息:https://www.effbot.org/tkinterbook/listbox.htm。 希望这会有所帮助。

    【讨论】:

    • 成为会员 5 年以来的第一次和良好的贡献 :) 恭喜,我希望我们能不时收到您的来信
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 2015-06-11
    • 1970-01-01
    • 2021-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多