简体   繁体   English

tkinter滚动条在窗口中不起作用

[英]tkinter scrollbar doesn't work in a window

I just started with tkinter and I don't know how to make scrollbar to work. 我刚开始使用tkinter,但不知道如何使滚动条正常工作。 I checked many different threads about tkinter on stackoverflow and I'm confused as to what exactly I need to do. 我在stackoverflow上检查了许多有关tkinter的不同线程,而我究竟需要做什么感到困惑。

I already added scrollbar but it doesn't scroll anything (commented # ******* Scrollbar *******). 我已经添加了滚动条,但是它没有滚动任何内容(注释为#*******滚动条*******)。 I want it to scroll text from content frame. 我希望它从内容框架滚动文本。

There is already lorem ipsum inserted in # ******* Dictionary data *******. #*****词典数据*******中已经插入了lorem ipsum。

from tkinter import *

class Search(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.minsize(380,444)
        self.maxsize(380,444)
        self.title("")

        self.search_start = StringVar()
        self.search_start.set('Enter your query')
        self.search_result = StringVar()

        self.bind("<Return>", self.search_button)

        self.scrollbar = Frame(self)
        self.scrollbar.pack(side=RIGHT, fill=Y)
        self.search_bar = Frame(self, bg="blue")
        self.search_bar.pack(side=TOP, fill=X)
        self.index = Frame(self)
        self.index.pack(side=LEFT)
        self.content = Frame(self)
        self.content.pack(side=TOP, fill=X)
        self.status_bar = Frame(self, bg="yellow")
        self.status_bar.pack(side=BOTTOM, fill=X)

# ******* Search Input *******

        self.entry = Entry(self.search_bar, textvariable = self.search_start)
        self.entry.pack(side=LEFT, padx=4, pady=4)

# ******* Search Button *******

        self.search = Button(self.search_bar, text="Search", command=self.search_button)
        self.search.pack(side=LEFT)

# ******* Content *******

        self.content = Label(self.content, textvariable = self.search_result, bg="ghost white", wraplength=360, width=52, height=26, justify=LEFT, anchor=NW) # justify == align
        self.content.pack(side=LEFT)

# ******* Scrollbar *******

        self.scrollbar = Scrollbar(self.scrollbar)
        self.scrollbar.pack(side=RIGHT, fill=Y)

        self.listbox = Listbox(self.scrollbar, yscrollcommand=self.scrollbar.set)


        self.scrollbar.config(command=self.listbox.yview)

# ******* Toolbar *******

        self.status_bar = Label(self.status_bar, text="toolbar", bg="yellow", relief=FLAT)
        self.status_bar.pack(side=LEFT)

# ******* Search Button *******

    def search_button(self, event=None):
        result_text = dictionary_data.get(self.entry.get(), "Entry not in database.\n\nCheck if you wrote your query correctly or type index to see all available entries.")
        self.search_result.set(result_text)
        self.search_start.set("")

# ******* Dictionary data *******

dictionary_data = {
    "index": 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin laoreet a enim a elementum. Ut tristique maximus mauris vitae tempus. Aliquam erat volutpat. Etiam semper, libero posuere vulputate aliquet, arcu odio fermentum ex, vulputate elementum urna felis fringilla nisi. Quisque nec nunc eu lacus fermentum sollicitudin quis ut ante. Maecenas consectetur varius eros, quis mollis est tincidunt eget. Morbi tempus aliquam dui, quis placerat metus porta sit amet. Suspendisse vitae diam at nibh semper iaculis quis quis velit. Morbi ac ipsum porttitor, lacinia eros at, volutpat arcu. Vestibulum ut diam convallis, auctor metus a, malesuada ante. Aliquam vitae leo magna. Quisque rutrum tristique neque, ut venenatis nibh viverra eget. Duis vitae felis non lacus viverra varius. Nunc placerat eros sed arcu vestibulum, id pharetra felis fermentum. Quisque semper vitae dolor sed molestie. Suspendisse semper ante eu sem ultricies ullamcorper. Quisque suscipit pellentesque varius. Integer magna lorem, lacinia in dolor quis, commodo tempus nibh. Etiam fermentum cursus vehicula. Vestibulum congue arcu at purus viverra faucibus. Pellentesque pellentesque facilisis massa, vel iaculis mauris egestas eu. Sed ut risus eu turpis sodales faucibus. Morbi aliquam sit amet purus ac rhoncus. Aliquam eros orci, laoreet ut fringilla vitae, sodales vitae ipsum. Nunc eu enim condimentum, fermentum massa hendrerit, cursus orci. Suspendisse potenti. Nulla faucibus velit ipsum, sollicitudin elementum nibh consequat ac. Nunc et condimentum nibh. Sed a malesuada nisl.Nulla at est arcu. Maecenas elementum ex nulla. Aliquam erat volutpat. Vivamus mattis iaculis nulla, eget tempus purus fermentum vel. Etiam auctor dolor eget eros scelerisque accumsan. Donec lacus tellus, interdum non gravida quis, cursus non magna. Sed lacinia, elit quis hendrerit lobortis, lorem dolor viverra purus, interdum vestibulum enim orci ac nibh. Fusce tellus lacus, pharetra at dignissim eu, maximus at ipsum. Fusce nec semper felis.',
}

# ******* Loop *******

app = Search()
app.mainloop()

You're binding the Scrollbar to a Listbox which you aren't packing. 您正在将滚动条绑定到没有包装的列表框。 That doesn't make sense. 那没有道理。
You want to bind the Scrollbar to the text, which you have made a Label widget. 您想将滚动条绑定到已创建标签小部件的文本。 However, you can't bind it to a Label widget (easily). 但是,您不能轻松地将其绑定到Label小部件。 You can, however, bind the Scrollbar to a Text widget. 但是,您可以将滚动条绑定到“文本”小部件。

If you make the Label a Text, you can not use the textvariable attribute. 如果将标签设置为文本,则不能使用textvariable属性。 Instead of setting the textvariable in your button callback you must delete the contents of the Text and place new contents in it. 代替在按钮回调中设置textvariable,必须删除Text的内容并将新内容放入其中。

This is the modified code: 这是修改后的代码:

from tkinter import *

class Search(Tk):
    def __init__(self):
        Tk.__init__(self)
        self.minsize(380,444)
        self.maxsize(380,444)
        self.title("")

        self.search_start = StringVar()
        self.search_start.set('Enter your query')
        self.search_result = StringVar()

        self.bind("<Return>", self.search_button)

        self.scrollbar_frame = Frame(self)
        self.scrollbar_frame.pack(side=RIGHT, fill=Y)
        self.search_bar = Frame(self, bg="blue")
        self.search_bar.pack(side=TOP, fill=X)
        self.index = Frame(self)
        self.index.pack(side=LEFT)
        self.content = Frame(self)
        self.content.pack(side=TOP, fill=X)
        self.status_bar = Frame(self, bg="yellow")
        self.status_bar.pack(side=BOTTOM, fill=X)

# ******* Search Input *******

        self.entry = Entry(self.search_bar, textvariable = self.search_start)
        self.entry.pack(side=LEFT, padx=4, pady=4)

# ******* Search Button *******

        self.search = Button(self.search_bar, text="Search", command=self.search_button)
        self.search.pack(side=LEFT)

# ******* Content *******

        self.content = Text(self.content, bg="ghost white", width=52, height=26) # justify == align
        self.content.pack(side=LEFT)

# ******* Scrollbar *******

        self.scrollbar = Scrollbar(self.scrollbar_frame)
        self.scrollbar.pack(side=RIGHT, fill=Y)

        self.content.config(yscrollcommand=self.scrollbar.set)

        self.scrollbar.config(command=self.content.yview)

# ******* Toolbar *******

        self.status_bar = Label(self.status_bar, text="toolbar", bg="yellow", relief=FLAT)
        self.status_bar.pack(side=LEFT)

# ******* Search Button *******

    def search_button(self, event=None):
        result_text = dictionary_data.get(self.entry.get(), "Entry not in database.\n\nCheck if you wrote your query correctly or type index to see all available entries.")
        self.content.delete(1.0, END)
        self.content.insert(END, result_text)
        self.search_start.set("")

# ******* Dictionary data *******

dictionary_data = {
    "index": 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin laoreet a enim a elementum. Ut tristique maximus mauris vitae tempus. Aliquam erat volutpat. Etiam semper, libero posuere vulputate aliquet, arcu odio fermentum ex, vulputate elementum urna felis fringilla nisi. Quisque nec nunc eu lacus fermentum sollicitudin quis ut ante. Maecenas consectetur varius eros, quis mollis est tincidunt eget. Morbi tempus aliquam dui, quis placerat metus porta sit amet. Suspendisse vitae diam at nibh semper iaculis quis quis velit. Morbi ac ipsum porttitor, lacinia eros at, volutpat arcu. Vestibulum ut diam convallis, auctor metus a, malesuada ante. Aliquam vitae leo magna. Quisque rutrum tristique neque, ut venenatis nibh viverra eget. Duis vitae felis non lacus viverra varius. Nunc placerat eros sed arcu vestibulum, id pharetra felis fermentum. Quisque semper vitae dolor sed molestie. Suspendisse semper ante eu sem ultricies ullamcorper. Quisque suscipit pellentesque varius. Integer magna lorem, lacinia in dolor quis, commodo tempus nibh. Etiam fermentum cursus vehicula. Vestibulum congue arcu at purus viverra faucibus. Pellentesque pellentesque facilisis massa, vel iaculis mauris egestas eu. Sed ut risus eu turpis sodales faucibus. Morbi aliquam sit amet purus ac rhoncus. Aliquam eros orci, laoreet ut fringilla vitae, sodales vitae ipsum. Nunc eu enim condimentum, fermentum massa hendrerit, cursus orci. Suspendisse potenti. Nulla faucibus velit ipsum, sollicitudin elementum nibh consequat ac. Nunc et condimentum nibh. Sed a malesuada nisl.Nulla at est arcu. Maecenas elementum ex nulla. Aliquam erat volutpat. Vivamus mattis iaculis nulla, eget tempus purus fermentum vel. Etiam auctor dolor eget eros scelerisque accumsan. Donec lacus tellus, interdum non gravida quis, cursus non magna. Sed lacinia, elit quis hendrerit lobortis, lorem dolor viverra purus, interdum vestibulum enim orci ac nibh. Fusce tellus lacus, pharetra at dignissim eu, maximus at ipsum. Fusce nec semper felis.',
}

# ******* Loop *******

app = Search()
app.mainloop()

To connect scrollbars to a scrollable widget you need to do the following: 要将滚动条连接到可滚动的小部件,您需要执行以下操作:

  1. Set the xscrollcommand and/or the yscrollcommand attributes of the widget to be scrolled (eg: a text widget, listbox or canvas). 设置要滚动的小部件的xscrollcommand和/或yscrollcommand属性(例如,文本小部件,列表框或画布)。 The value is typically the set method of a scrollbar. 该值通常是滚动条的set方法。
  2. Set the command attribute of the scrollbar. 设置滚动条的command属性。 The value is typically the xview or yview command of the widget to be scrolled. 该值通常是要滚动的小部件的xviewyview命令。

For example: 例如:

text_widget = tk.Text(...)
vertical_scrollbar = tk.Scrollbar(...)

text_widget.configure(yscrollcommand=vertical_scrollbar.set)
vertical_scrollbar.configure(command=text_widget.yview)

They must be hooked up in both directions so that the scrollbar reflects changes in the widget, and the widget reflects changes in the scrollbar. 它们必须在两个方向上都挂钩,以便滚动条反映小部件中的更改,而小部件反映出滚动条中的更改。

This is a working example: 这是一个工作示例:

from tkinter import *

# ******* Dictionary data *******

dictionary_data = {
    "index": 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Proin laoreet a enim a elementum. Ut tristique maximus mauris vitae tempus. Aliquam erat volutpat. Etiam semper, libero posuere vulputate aliquet, arcu odio fermentum ex, vulputate elementum urna felis fringilla nisi. Quisque nec nunc eu lacus fermentum sollicitudin quis ut ante. Maecenas consectetur varius eros, quis mollis est tincidunt eget. Morbi tempus aliquam dui, quis placerat metus porta sit amet. Suspendisse vitae diam at nibh semper iaculis quis quis velit. Morbi ac ipsum porttitor, lacinia eros at, volutpat arcu. Vestibulum ut diam convallis, auctor metus a, malesuada ante. Aliquam vitae leo magna. Quisque rutrum tristique neque, ut venenatis nibh viverra eget. Duis vitae felis non lacus viverra varius. Nunc placerat eros sed arcu vestibulum, id pharetra felis fermentum. Quisque semper vitae dolor sed molestie. Suspendisse semper ante eu sem ultricies ullamcorper. Quisque suscipit pellentesque varius. Integer magna lorem, lacinia in dolor quis, commodo tempus nibh. Etiam fermentum cursus vehicula. Vestibulum congue arcu at purus viverra faucibus. Pellentesque pellentesque facilisis massa, vel iaculis mauris egestas eu. Sed ut risus eu turpis sodales faucibus. Morbi aliquam sit amet purus ac rhoncus. Aliquam eros orci, laoreet ut fringilla vitae, sodales vitae ipsum. Nunc eu enim condimentum, fermentum massa hendrerit, cursus orci. Suspendisse potenti. Nulla faucibus velit ipsum, sollicitudin elementum nibh consequat ac. Nunc et condimentum nibh. Sed a malesuada nisl.Nulla at est arcu. Maecenas elementum ex nulla. Aliquam erat volutpat. Vivamus mattis iaculis nulla, eget tempus purus fermentum vel. Etiam auctor dolor eget eros scelerisque accumsan. Donec lacus tellus, interdum non gravida quis, cursus non magna. Sed lacinia, elit quis hendrerit lobortis, lorem dolor viverra purus, interdum vestibulum enim orci ac nibh. Fusce tellus lacus, pharetra at dignissim eu, maximus at ipsum. Fusce nec semper felis.',
}

# ******* Search Button *******

def search_button(event=None):
    content.delete("1.0", END)
    result_text = dictionary_data.get(entry.get(), "Entry not in database.\n\nCheck if you wrote your query correctly or type index to see all available entries.")
    search_result = result_text
    search_start = ""
    entry.delete(0, END)
    content.insert(END, search_result)


master = Tk()

master.minsize(580,444)
master.maxsize(580,444)
master.title("Master")

search_start = "Enter your query"
search_result = ""
master.bind("<Return>", search_button)

# ******* Search Input *******

entry = Entry(master)
entry.insert(END, search_start)
entry.pack(side=LEFT, padx=4, pady=4)

# ******* Search Button *******

search = Button(master, text="Search", command=search_button)
search.pack(side=LEFT)

# ******* Scroll & Content *******

scrollbar = Scrollbar(master)
scrollbar.pack(side=RIGHT, fill=Y)
content = Text(master, yscrollcommand=scrollbar.set, bg="ghost white")
content.insert(END, search_result)
content.pack(side=LEFT)
scrollbar.config(command=content.yview)

# ******* Loop ***************

mainloop()

Basically I used Text instead of Label . 基本上,我使用Text而不是Label

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM