2015-03-30 3 views
0

Я только что начал с tkinter, и я не знаю, как заставить полосу прокрутки работать. Я проверил много разных потоков о tkinter на stackoverflow, и я в замешательстве, что именно мне нужно сделать.tkinter scrollbar не работает в окне

Я уже добавил полосу прокрутки, но она ничего не прокручивает (прокомментировал # ******* Scrollbar *******). Я хочу, чтобы он прокручивал текст из области содержимого.

Существует уже 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() 
+0

Возможно, это сообщение может предоставить дополнительную информацию http://stackoverflow.com/questions/3085696/adding-a-scrollbar-to-a-grid-of-widgets-in-tkinter для Python 3x изменить «Tkinter» на " tkinter " –

+0

Нужно ли использовать .grid вместо .pack для добавления полосы прокрутки? – Gunnm

+0

Пакет в порядке, я просто пытаюсь понять ваш код. –

ответ

5

Вы привязываете панель прокрутки к списку, который вы не упаковываете. Это не имеет смысла.
Вы хотите привязать панель прокрутки к тексту, который вы создали виджет Label. Однако вы не можете привязать его к виджету «Ярлык» (легко). Однако вы можете привязать панель прокрутки к виджету «Текст».

Если вы сделаете надпись «Текст», вы не можете использовать атрибут textvariable. Вместо того, чтобы в текстовом обратном вызове менять текст, вы должны удалить содержимое текста и поместить в него новое содержимое.

Это модифицированный код:

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() 
+0

Спасибо за это. Он работает отлично. – Gunnm

1

Это рабочий пример:

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() 

В основном я использовал Text вместо Label.

+0

Благодарим вас за помощь. – Gunnm

3

Для подключения скроллбары к прокрутке виджета вам нужно сделать следующее:

  1. Установите xscrollcommand и/или yscrollcommand атрибутов виджета в прокручивать (например: текстовый виджет, список или холст). Значение обычно представляет собой метод set полосы прокрутки.
  2. Установите атрибут полосы прокрутки command. Обычно это значение xview или yview команды виджета для прокрутки.

Например:

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

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

Они должны быть подключены в обоих направлениях, так что полоса прокрутки отражает изменения в виджете, и виджет отражает изменения в скроллинга.

+0

Спасибо за отзыв Я только что начал с tkinter, поэтому каждая информация полезна. – Gunnm

Смежные вопросы