scrollbar для frame

Автор Vashnaemnik, 25.09.24, 08:35:38

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

Vashnaemnik

Добрый день уважаемые форумчане.
Пытаюсь организовать диалоговое окно для пользователя.
Во втором фрэйме делаю таблицу. Нажатием кнопки "Добавить штуцер", добавляются следующие поля для заполнения. Установил полосу прокрутки. Но когда количество строк превышает высоту фрэйма, прокрутка не срабатывает. Подскажите как заставить ее активироваться когда строки выходят за предел фрэйма.
from tkinter import *
from tkinter import messagebox as mb
from tkinter import ttk # для разделения окна
from tkinter.ttk import Combobox # добавляем класс Combobox (выпадающий список)
import tkinter.filedialog as fd # работа с файлами
import tkinter
import tkinter.ttk
import tkinter as tk

last_row = 0

def clicked_1(button):
   
    global last_row
    last_row += 20

    txt_0 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
    txt_0.place(x=1, y=1+last_row)

    txt_1 = Entry(frame_2, width=30, font=("Times New Roman", 10), justify = LEFT)
    txt_1.place(x=73, y=1+last_row)

    txt_2 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
    txt_2.place(x=259, y=1+last_row)

    txt_3 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
    txt_3.place(x=332, y=1+last_row)

    txt_4 = Entry(frame_2, width=14, font=("Times New Roman", 10), justify = CENTER)
    txt_4.place(x=411, y=1+last_row)

    txt_5 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
    txt_5.place(x=501, y=1+last_row)

window = tkinter.Tk()
window.resizable(False, False)
window.title("Таблица штуцеров") # Название окна
window.geometry('1700x750')

# окно для шапки таблицы
frame_1 = tkinter.Frame(window, bg='purple', width=1700, height=86)
frame_1.pack()
frame_1.pack_propagate(0)

# надписи в шапке
lbl_0 = Label(frame_1, text="Обозна- \n чение", font=("Times New Roman", 12), bg="lightblue", height=4, width=7, justify=CENTER)
lbl_0.pack(side=LEFT, padx=1)

lbl_1 = Label(frame_1, text="Наименование", font=("Times New Roman", 12), bg="lightblue", height=4, width=20, justify=CENTER)
lbl_1.pack(side=LEFT, padx=1)

lbl_2 = Label(frame_1, text="Диаметр, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=7, justify=CENTER)
lbl_2.pack(side=LEFT, padx=1)

lbl_3 = Label(frame_1, text="Давление, \n МПа", font=("Times New Roman", 12), bg="lightblue", height=4,width=8, justify=CENTER)
lbl_3.pack(side=LEFT, padx=1)

lbl_4 = Label(frame_1, text="Диаметр \n патрубка \n наружний, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=9, justify=CENTER)
lbl_4.pack(side=LEFT, padx=1)

lbl_5 = Label(frame_1, text="Стенка \n патрубка, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=8, justify=CENTER)
lbl_5.pack(side=LEFT, padx=1)

lbl_6 = Label(frame_1, text="ГОСТ фланца", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_6.pack(side=LEFT, padx=1)

lbl_7 = Label(frame_1, text="Фланец \n приварной", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_7.pack(side=LEFT, padx=1)

lbl_8 = Label(frame_1, text="Элемент \n ответный", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_8.pack(side=LEFT, padx=1)

lbl_9 = Label(frame_1, text="Кольцо \n укрепляющее \n Толщ. х шир., \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_9.pack(side=LEFT, padx=1)

lbl_10 = Label(frame_1, text="Отметка, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_10.pack(side=LEFT, padx=1)

lbl_11 = Label(frame_1, text="Ориентация, \n градус ", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_11.pack(side=LEFT, padx=1)

lbl_12 = Label(frame_1, text="Вылет, \n мм ", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_12.pack(side=LEFT, padx=1)

# окно для таблицы
frame_2 = tkinter.Frame(window, bg='black', width=1700, height=400)
frame_2.pack()
frame_2.pack_propagate(0)

# прокрутка
scrollbar = ttk.Scrollbar(frame_2, orient="vertical")
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
#scrollbar.place(relx=1, rely=0, relheight=1, anchor='ne')

# ячейки для заполнения
txt_0 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
txt_0.place(x=1, y=1)

txt_1 = Entry(frame_2, width=30, font=("Times New Roman", 10), justify = LEFT)
txt_1.place(x=73, y=1)

txt_2 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
txt_2.place(x=259, y=1)

txt_3 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
txt_3.place(x=332, y=1)

txt_4 = Entry(frame_2, width=14, font=("Times New Roman", 10), justify = CENTER)
txt_4.place(x=411, y=1)

txt_5 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
txt_5.place(x=501, y=1)

# окно для кнопок
frame_3 = tkinter.Frame(window, bg='blue', width=1700, height=60)
frame_3.pack()
frame_3.pack_propagate(0)

btn_1 = Button(frame_3, text="Добавить \n штуцер", font=("Times New Roman", 12), command=lambda: clicked_1(btn_1), height=2, width=10)
btn_1.place(x=15, y=2)

btn_2 = Button(frame_3, text="Завершить", font=("Times New Roman", 12), height=2, width=10)
btn_2.place(x=1100, y=2)

window.mainloop()

Vashnaemnik

Как вычитал из простора инета, scrollbar нельзя прицепить к frame.
Создал canvas, в него уже запихнул свой frame. Но прокрутка все равно не работает, строки уходят за пределы окна.
Подскажите что не так делаю.
from tkinter import *
from tkinter import messagebox as mb
from tkinter import ttk # для разделения окна
from tkinter.ttk import Combobox # добавляем класс Combobox (выпадающий список)
import tkinter.filedialog as fd # работа с файлами
import tkinter
import tkinter.ttk
import tkinter as tk

last_row = 0

def clicked_1(button):
   
    global last_row
    last_row += 20

    txt_0 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
    txt_0.place(x=1, y=1+last_row)

    txt_1 = Entry(frame_2, width=30, font=("Times New Roman", 10), justify = LEFT)
    txt_1.place(x=73, y=1+last_row)

    txt_2 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
    txt_2.place(x=259, y=1+last_row)

    txt_3 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
    txt_3.place(x=332, y=1+last_row)

    txt_4 = Entry(frame_2, width=14, font=("Times New Roman", 10), justify = CENTER)
    txt_4.place(x=411, y=1+last_row)

    txt_5 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
    txt_5.place(x=501, y=1+last_row)

window = tkinter.Tk()
window.resizable(False, False)
window.title("Таблица штуцеров") # Название окна
window.geometry('1700x750')

# окно для шапки таблицы
frame_1 = tkinter.Frame(window, bg='purple', width=1700, height=86)
frame_1.pack()
frame_1.pack_propagate(0)

# надписи в шапке
lbl_0 = Label(frame_1, text="Обозна- \n чение", font=("Times New Roman", 12), bg="lightblue", height=4, width=7, justify=CENTER)
lbl_0.pack(side=LEFT, padx=1)

lbl_1 = Label(frame_1, text="Наименование", font=("Times New Roman", 12), bg="lightblue", height=4, width=20, justify=CENTER)
lbl_1.pack(side=LEFT, padx=1)

lbl_2 = Label(frame_1, text="Диаметр, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=7, justify=CENTER)
lbl_2.pack(side=LEFT, padx=1)

lbl_3 = Label(frame_1, text="Давление, \n МПа", font=("Times New Roman", 12), bg="lightblue", height=4,width=8, justify=CENTER)
lbl_3.pack(side=LEFT, padx=1)

lbl_4 = Label(frame_1, text="Диаметр \n патрубка \n наружний, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=9, justify=CENTER)
lbl_4.pack(side=LEFT, padx=1)

lbl_5 = Label(frame_1, text="Стенка \n патрубка, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=8, justify=CENTER)
lbl_5.pack(side=LEFT, padx=1)

lbl_6 = Label(frame_1, text="ГОСТ фланца", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_6.pack(side=LEFT, padx=1)

lbl_7 = Label(frame_1, text="Фланец \n приварной", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_7.pack(side=LEFT, padx=1)

lbl_8 = Label(frame_1, text="Элемент \n ответный", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_8.pack(side=LEFT, padx=1)

lbl_9 = Label(frame_1, text="Кольцо \n укрепляющее \n Толщ. х шир., \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_9.pack(side=LEFT, padx=1)

lbl_10 = Label(frame_1, text="Отметка, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_10.pack(side=LEFT, padx=1)

lbl_11 = Label(frame_1, text="Ориентация, \n градус ", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_11.pack(side=LEFT, padx=1)

lbl_12 = Label(frame_1, text="Вылет, \n мм ", font=("Times New Roman", 12), bg="lightblue", height=4, width=12, justify=CENTER)
lbl_12.pack(side=LEFT, padx=1)

# создаем холст

canvas_1=Canvas(window,bg='red')
canvas_1.pack()

# прокрутка
scrollbar = ttk.Scrollbar(canvas_1, orient="vertical")
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)


# окно для таблицы
frame_2 = tkinter.Frame(canvas_1, bg='black', width=1700, height=400)
frame_2.pack()
frame_2.pack_propagate(0)

# ячейки для заполнения
txt_0 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
txt_0.place(x=1, y=1)

txt_1 = Entry(frame_2, width=30, font=("Times New Roman", 10), justify = LEFT)
txt_1.place(x=73, y=1)

txt_2 = Entry(frame_2, width=11, font=("Times New Roman", 10), justify = CENTER)
txt_2.place(x=259, y=1)

txt_3 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
txt_3.place(x=332, y=1)

txt_4 = Entry(frame_2, width=14, font=("Times New Roman", 10), justify = CENTER)
txt_4.place(x=411, y=1)

txt_5 = Entry(frame_2, width=12, font=("Times New Roman", 10), justify = CENTER)
txt_5.place(x=501, y=1)

# окно для кнопок
frame_3 = tkinter.Frame(window, bg='blue', width=1700, height=60)
frame_3.pack()
frame_3.pack_propagate(0)

btn_1 = Button(frame_3, text="Добавить \n штуцер", font=("Times New Roman", 12), command=lambda: clicked_1(btn_1), height=2, width=10)
btn_1.place(x=15, y=2)

btn_2 = Button(frame_3, text="Завершить", font=("Times New Roman", 12), height=2, width=10)
btn_2.place(x=1100, y=2)

window.mainloop()

Vashnaemnik

Немного изменил код.
Выкинул frame и сделал canvas для заполнение таблицы.
Прокрутку прицепил к окну.
После выполнения условия, что холст становиться больше чем окно, включается прокрутка.
Дальше, определяю новый размер холста, пытаюсь что бы прокрутка стала активной, но она не оживает ни как.
Возможно немного недопонимаю. Надеюсь здесь подскажут.
from tkinter import *
from tkinter import ttk

last_row = 0

def clicked_1(button):
   
    global last_row
    last_row += 20

    txt_0 = Entry(canvas_1, width=11, font=("Times New Roman", 10), justify = CENTER)
    txt_0.place(x=3, y=3+last_row)
    canvas_1.place(width=1700, height=25+last_row)

    if last_row == 400:
        scrollbar = Scrollbar(window) # создаем прокрутку в окне
        scrollbar.pack(side='right', fill='y')
        scrollbar['command'] = canvas_1.yview
        canvas_1['yscrollcommand'] = scrollbar.set

        def conf(event):
            canvas_1.configure(scrollregion=canvas_1.bbox('all'))
           
# окно         
window = Tk()
window.title("Таблица штуцеров")
window.geometry("1700x525")

# окно для шапки таблицы
frame_1 = Frame(window, bg='blue', height=80)
frame_1.pack(side=TOP, fill=X)

# холст для таблицы
canvas_1 = Canvas(window, bg='black')
canvas_1.place(y=80, width=1700, height=25)

# ячейки для заполнения
txt_0 = Entry(canvas_1, width=11, font=("Times New Roman", 10))
txt_0.place(x=3, y=3)

# окно для кнопок
frame_2 = Frame(window, bg='blue', height=40)
frame_2.pack(side=BOTTOM, fill=X)

# кнопка
btn_2 = Button(frame_2, text="Добавить штуцер", font=("Times New Roman", 10), command=lambda: clicked_1(btn_2), height=1, width=15)
btn_2.place(x=15, y=6)

window.mainloop()

feron

Цитата: Vashnaemnik от 25.09.24, 10:43:37Как вычитал из простора инета, scrollbar нельзя прицепить к frame.

да, его нужно создавать в контексте объекта, а не так элемент формы.

в общем:

from tkinter import *
from tkinter import ttk

last_row = 0

def clicked_1(button, frame_inner, canvas):
    global last_row
    last_row += 1

    txt_0 = Entry(frame_inner, width=11, font=("Times New Roman", 10), justify=CENTER)
    txt_0.grid(row=last_row, column=0, padx=1, pady=2)

    txt_1 = Entry(frame_inner, width=30, font=("Times New Roman", 10), justify=LEFT)
    txt_1.grid(row=last_row, column=1, padx=1, pady=2)

    txt_2 = Entry(frame_inner, width=11, font=("Times New Roman", 10), justify=CENTER)
    txt_2.grid(row=last_row, column=2, padx=1, pady=2)

    txt_3 = Entry(frame_inner, width=12, font=("Times New Roman", 10), justify=CENTER)
    txt_3.grid(row=last_row, column=3, padx=1, pady=2)

    txt_4 = Entry(frame_inner, width=14, font=("Times New Roman", 10), justify=CENTER)
    txt_4.grid(row=last_row, column=4, padx=1, pady=2)

    txt_5 = Entry(frame_inner, width=12, font=("Times New Roman", 10), justify=CENTER)
    txt_5.grid(row=last_row, column=5, padx=1, pady=2)

    # Обновляем область прокрутки
    canvas.configure(scrollregion=canvas.bbox("all"))

# Создаём окно
window = Tk()
window.resizable(False, False)
window.title("Таблица штуцеров")
window.geometry('1700x750')

# Фрейм для шапки таблицы
frame_1 = Frame(window, bg='purple', width=1700, height=86)
frame_1.pack()
frame_1.pack_propagate(0)

# Шапка таблицы
lbl_0 = Label(frame_1, text="Обозна- \n чение", font=("Times New Roman", 12), bg="lightblue", height=4, width=7, justify=CENTER)
lbl_0.pack(side=LEFT, padx=1)

lbl_1 = Label(frame_1, text="Наименование", font=("Times New Roman", 12), bg="lightblue", height=4, width=20, justify=CENTER)
lbl_1.pack(side=LEFT, padx=1)

lbl_2 = Label(frame_1, text="Диаметр, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=7, justify=CENTER)
lbl_2.pack(side=LEFT, padx=1)

lbl_3 = Label(frame_1, text="Давление, \n МПа", font=("Times New Roman", 12), bg="lightblue", height=4, width=8, justify=CENTER)
lbl_3.pack(side=LEFT, padx=1)

lbl_4 = Label(frame_1, text="Диаметр \n патрубка \n наружний, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=9, justify=CENTER)
lbl_4.pack(side=LEFT, padx=1)

lbl_5 = Label(frame_1, text="Стенка \n патрубка, \n мм", font=("Times New Roman", 12), bg="lightblue", height=4, width=8, justify=CENTER)
lbl_5.pack(side=LEFT, padx=1)

# Фрейм для таблицы с прокруткой
frame_2 = Frame(window, bg='black', width=1700, height=400)
frame_2.pack()

# Создаём canvas для размещения содержимого и прокрутки
canvas = Canvas(frame_2, bg="black", width=1700, height=400)
scrollbar = ttk.Scrollbar(frame_2, orient="vertical", command=canvas.yview)
canvas.configure(yscrollcommand=scrollbar.set)

scrollbar.pack(side=RIGHT, fill=Y)
canvas.pack(side=LEFT, expand=True, fill=BOTH)

# Внутренний фрейм, который будет прокручиваться
frame_inner = Frame(canvas, bg="white")
canvas.create_window((0, 0), window=frame_inner, anchor='nw')

# Первая строка в таблице
txt_0 = Entry(frame_inner, width=11, font=("Times New Roman", 10), justify=CENTER)
txt_0.grid(row=0, column=0, padx=1, pady=2)

txt_1 = Entry(frame_inner, width=30, font=("Times New Roman", 10), justify=LEFT)
txt_1.grid(row=0, column=1, padx=1, pady=2)

txt_2 = Entry(frame_inner, width=11, font=("Times New Roman", 10), justify=CENTER)
txt_2.grid(row=0, column=2, padx=1, pady=2)

txt_3 = Entry(frame_inner, width=12, font=("Times New Roman", 10), justify=CENTER)
txt_3.grid(row=0, column=3, padx=1, pady=2)

txt_4 = Entry(frame_inner, width=14, font=("Times New Roman", 10), justify=CENTER)
txt_4.grid(row=0, column=4, padx=1, pady=2)

txt_5 = Entry(frame_inner, width=12, font=("Times New Roman", 10), justify=CENTER)
txt_5.grid(row=0, column=5, padx=1, pady=2)

# Фрейм для кнопок
frame_3 = Frame(window, bg='blue', width=1700, height=60)
frame_3.pack()

# Передаем параметры frame_inner и canvas в функцию clicked_1
btn_1 = Button(frame_3, text="Добавить \n штуцер", font=("Times New Roman", 12), command=lambda: clicked_1(btn_1, frame_inner, canvas), height=2, width=10)
btn_1.place(x=15, y=2)

# Обновляем область прокрутки при изменении размеров содержимого
frame_inner.bind("<Configure>", lambda event: canvas.configure(scrollregion=canvas.bbox("all")))

window.mainloop()

Vashnaemnik

Спасибо вам огромное. Еще увидел основная рамка с закругленными краями  :-)))  интересная фишка.
Я уже решил эту задачку. Teywl Wind помог ее доработать.
Но все равно спасибо вам огромное.
Кстати, у меня автоматически поднимается frame, новые строки постоянно видны. у вас нужно его дополнительно вручную опускать.
Но все равно спасибо. Посмотрю сам код. Я простой проектировщик, и многие вещи мне вообще пока непонятны.

feron


Цитата: Vashnaemnik от 29.09.24, 19:17:36Кстати, у меня автоматически поднимается frame, новые строки постоянно видны. у вас нужно его дополнительно вручную опускать.

Там еще у вас линии ячеек таблицы четче вырисовываются - в общем тут нема..

Vashnaemnik

Ну, у вас зато фрейм с самой таблицей я могу высоту менять.
А в той, у меня эта зона фиксированная, а как сделать ее изменяемой, пока не пойму  :-))) там явного задания высоты нету.
Так что, изучу, может солянку сделаю, будет совсем идеальная.
Сейчас тут другая головная боль. Как решить проблему со стандартными изделиями.
Как я понял, просто силами простой вставки не получится. И похоже нужно самому писать макросы по выстраиванию этих стандартных изделий, и после уже вставлять их.
Придется создавать при проекте папку, куда будут сохраняться эти детали, и уже от туда вставлять в сборки.

feron

Цитата: Vashnaemnik от 29.09.24, 21:13:13Сейчас тут другая головная боль. Как решить проблему со стандартными изделиями.
благо тут примеров предостаточно и как работать с стандартными изделиями..

Михаил88

Создайте свою библиотеку *.kle со стандартными изделиями. Из своей библиотеки и добавляйте их в сборку (примеры на форуме есть).
Для наполнения своей *.kle стандартные изделия можно экспортировать из Библиотеки стандартные изделия.
+ Благодарностей: 1

Teywl Wind

Цитата: Михаил88 от 29.09.24, 21:58:32Создайте свою библиотеку *.kle со стандартными изделиями. Из своей библиотеки и добавляйте их в сборку (примеры на форуме есть).
Для наполнения своей *.kle стандартные изделия можно экспортировать из Библиотеки стандартные изделия.

Михаил, а не подскажите, как из полинома выдернуть стандартные для своей .kle библиотеки?

Михаил88

У меня нет полинома.

Vashnaemnik

Добрый день.
Мы к компас 22, подрубили библиотеку 21 компаса.
Теперь нам полином не нужен.
Можно хоть какой-нибудь пример по вставке СИ в сборку?
А то пока видим для себя вариант, создавать СИ своими силами и уже потом вставлять.