Найти - Пользователи
Полная версия: Tkinter: Scrollbar для TreeView в panedwindow
Начало » GUI » Tkinter: Scrollbar для TreeView в panedwindow
1 2
den1024
Приветствую, Всех.

Есть проблема с отображением Scrollbar для TreeView, который находиться в panedwindow - прокрутка не видна.

Создаю так:

PanedWindow создаётся в основном окне (Tk).

pwindow = PanedWindow(self, orient=HORIZONTAL)
pwindow.pack(fill=BOTH, expand=1)
sbar = Scrollbar(pwindow)
sbar.pack(side=RIGHT, fill=Y)
tree = ttk.Treeview(pwindow, yscrollcommand=sbar.set)      
tree.pack()
sbar.config(command=tree.yview)
tree.heading('#0', text='Проекты', anchor='w')
root_node = tree.insert('', 'end', text='Some text', open=True)
tree.config(height=30)
pwindow.add(tree)                 
pwindow.grid(row=0, column=0)
sbar.grid(row=0, column=1, sticky='ns')
pwindow.grid()
bottom = Label(pwindow, text="Bottom pane")
pwindow.add(bottom)

Подскажите, пожалуйста, что делаю не так?
4kpt_II
Полный код. Без него никак…
Нужно посмотреть импорт.
den1024
4kpt_II
Полный код. Без него никак…Нужно посмотреть импорт.

Вот полный код:

from tkinter import *
from tkinter import ttk
root = Tk()
pwindow = PanedWindow(root, orient=HORIZONTAL)
pwindow.pack(fill=BOTH, expand=1)
sbar = Scrollbar(pwindow)
sbar.pack(side=RIGHT, fill=Y)
tree = ttk.Treeview(pwindow, yscrollcommand=sbar.set)      
tree.pack()
sbar.config(command=tree.yview)
tree.heading('#0', text='Проекты', anchor='w')
root_node = tree.insert('', 'end', text='Some text', open=True)
tree.config(height=30)
pwindow.add(tree)                 
pwindow.grid(row=0, column=0)
sbar.grid(row=0, column=1, sticky='ns')
pwindow.grid()
bottom = Label(pwindow, text="Bottom pane")
pwindow.add(bottom)
root.mainloop()
4kpt_II
Код мегажуткий
1. Разные методы геометрии объектов не дружат друг с другом. В результате нельзя совместно использовать методы grid, pack, place.
2. Если Вы используете PanedWindow, то упаковщики вообще не нужны.
3. Я до конца не понял, что Вы хотели, но мне кажется, что это…

import tkinter
import ttk
#
root = tkiner. Tk()
root.geometry("400x400+100+100")
#
pwindow = tkinter.PanedWindow(root, orient="horizontal")
pwindow.pack(fill="both", expand=True)
#
sbar = tkinter.Scrollbar(pwindow)
tree = ttk.Treeview(pwindow, yscrollcommand=sbar.set)
sbar.config(command=tree.yview)
pwindow.add(tree)
#
tree.heading('#0', text='Проекты', anchor='w')
tree.insert('', 'end', text='First linet', open=True)
port = tree.insert("", "end", text="Second Line", open=True)
tree.insert(port, "end", text="Inner second line", open=True)
tree.config(height=15)
#
bottom = tkinter.Label(pwindow, text="Right pane")
pwindow.add(bottom)
#
root.mainloop()

P.S. Конструкцию

from tkinter import *

Использовать нельзя. Почему? Можно прочитать по ссылке ниже.
Нажимаем сюда.

P.S.S.

Добавил документацию по PanedWindow.

P.S.S.S. Будут вопросы - пишите…
den1024
Почему-то инструкция: import ttk выдаёт ошибку, мол нет такого модуля. Хотя from ttk import * нормально отрабатывает.
4kpt_II
Прошу прощения. Просто за 3.Х не работаю.
Забыл, что там ttk внесли в tkinter.
Поэтому нужно так:

tree = tkinter.ttk.Treeview(pwindow, yscrollcommand=sbar.set)

В этом случае не забудьте удалить строку с импортом ttk.

Или так:

import  tkinter
from tkinter import ttk

P.S. Будут вопросы - пишите…
4kpt_II
den1024
Почему-то инструкция: import ttk выдаёт ошибку, мол нет такого модуля. Хотя from ttk import * нормально отрабатывает.

А нормально оно отрабатывает, потому как Вы уже все пространство имен tkinter импортировали в свой модуль и ttk в том же числе.
den1024
Привел код к правильному состоянию, но прокрутка в дереве не появилась

import tkinter
from tkinter import ttk
root = tkiner. Tk()
root.geometry("400x400+100+100")
pwindow = tkinter.PanedWindow(self, orient="horizontal")
pwindow.pack(fill="both", expand=1)
sbar_y = tkinter.Scrollbar(pwindow)
sbar_x = tkinter.Scrollbar(pwindow)
tree = ttk.Treeview(pwindow, yscrollcommand=sbar_y.set, xscrollcommand=sbar_x.set)
sbar_y.config(command=tree.yview)
sbar_x.config(command=tree.xview)
pwindow.add(tree)                 
tree.heading('#0', text='Проекты', anchor='w')
root_node = tree.insert('', 'end', text='Root item fskdjfhjkdshfsdkfsdfsdfsdfsdfsdfsdffsdfsdf', open=True)
tree.config(height=30)
bottom = tkinter.Label(pwindow, text="Bottom pane")
pwindow.add(bottom)
root.mainloop()
4kpt_II
1. Вы не привели к номральному состоянию
2. Упаковывать не надо объекты, которые передаются как базовые в PanedWindow.
3. Если Вам нужны полосы прокрутки придется их упаковать вмести с Treeview в отделную рамку.

Короче. Держите:

import tkinter
from tkinter import ttk
#
root = tkinter. Tk()
root.geometry("400x400+100+100")
#
pwindow = tkinter.PanedWindow(root, orient="horizontal")
pwindow.pack(fill="both")
#
frame = tkinter.Frame(pwindow)
pwindow.add(frame)
#
sbar_x = ttk.Scrollbar(frame, orient="horizontal")
sbar_y = ttk.Scrollbar(frame, orient="vertical")
sbar_y.grid(row=0, column=1, sticky="NS")
sbar_x.grid(row=1, column=0, sticky="EW")
#
tree = ttk.Treeview(frame)
tree.grid(row=0, column=0)
tree.column("#0", minwidth=800)
tree.config(yscrollcommand=sbar_y.set, height=15, xscrollcommand=sbar_x.set)
tree.heading("#0", text='Проекты', anchor='w')
#
sbar_y.config(command=tree.yview)
sbar_x.config(command=tree.xview)
#
for i in xrange(30):
    text = "%s" % i
    tree.insert('', 'end', text=20*text)
#
bottom = Tkinter.Label(pwindow, text="Bottom pane")
pwindow.add(bottom)
#
root.update()
root.mainloop()

P.S. Будут вопросы - пишите …
den1024
Что-то вышло не то, видно на скриншоте во вложении. Код:

import tkinter
from tkinter import ttk
#
root = tkinter. Tk()
root.geometry("400x400+100+100")
#
pwindow = tkinter.PanedWindow(root, orient="horizontal")
        pwindow.pack(fill="both")
#
        frame = tkinter.Frame(pwindow)
        pwindow.add(frame)
#
        sbar_y = ttk.Scrollbar(frame, orient="vertical")
        sbar_x = ttk.Scrollbar(frame, orient="horizontal")
        sbar_y.grid(row=0, column=1, sticky="NS")
        sbar_y.grid(row=1, column=0, sticky="EW")
#
        tree = ttk.Treeview(frame)      
        tree.grid(row=0, column=0)
        tree.column("#0", minwidth=800)
        tree.config(yscrollcommand=sbar_y.set, height=15, xscrollcommand=sbar_x.set)
#
        tree.heading("#0", text="Проекты", anchor="w")
#
        sbar_y.config(command=tree.yview)
        sbar_x.config(command=tree.xview)
#
        root_node = tree.insert('', 'end', text='fskdjfhjkdshfsdkfsdfsdfsdfsdfsdfsdffsdfsdf', open=True)
#
        bottom = tkinter.Label(pwindow, text="Bottom pane")
        pwindow.add(bottom)
        root.update()
root.mainloop()

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB