catdesign
@catdesign
Веб-разработчик

Почему не работает полоса прокрутки Python Tkinter (Canvas + Scrollbar)?

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

import os
from tkinter import *

# Функции
def clicked(host):
    print(host)

# Создаем окно
window = Tk()
window.title("Управление веб-сервером Apache")
window.geometry('730x400')

# Главный фрейм
mainFrame = Frame(window, width = 300, height = 300)
mainFrame.pack(expand = True, fill = BOTH)

# Создаем canvas с прокруткой
mainCanvas = Canvas(mainFrame, width = 300, scrollregion = (0, 0, 500, 500))
vScrollbar = Scrollbar(mainFrame, orient = VERTICAL)
vScrollbar.pack(side = RIGHT, fill = Y)
vScrollbar.config(command = mainCanvas.yview)
mainCanvas.config(width = 300,height = 300)
mainCanvas.config(yscrollcommand=vScrollbar.set)
mainCanvas.pack(side=LEFT,expand=True,fill=BOTH)

# Заголовок окна
appHeader = Frame(mainCanvas, width=300)
appHeader.pack()
apacheTitle = Label(appHeader, text="Управление веб-сервером Apache", font=28, padx=10, pady=20)
apacheTitle.pack()

# Первый ряд кнопок
buttonWrapperOne = Frame(mainCanvas, width=300)
buttonWrapperOne.pack()

buttonStartApache = Button(buttonWrapperOne, text="Запустить Apache", bg="#0088cc", fg="white", width=25)
buttonStopApache  = Button(buttonWrapperOne, text="Остановить Apache", bg="#0088cc", fg="white", width=25)
buttonLogsApache  = Button(buttonWrapperOne, text="Посмотреть логи", bg="#0088cc", fg="white", width=25)

buttonStartApache.grid(column=0, row=1, ipady=10, padx=5, pady=5)
buttonStopApache.grid(column=1, row=1, ipady=10, padx=5, pady=5)
buttonLogsApache.grid(column=2, row=1, ipady=10, padx=5, pady=5)

# Второй ряд кнопок
buttonWrapperTwo = Frame(mainCanvas, width=300)
buttonWrapperTwo.pack()

buttonConfApache   = Button(buttonWrapperTwo, text="Конфигурация Apache", bg="#0088cc", fg="white", width=25)
buttonSyntaxApache = Button(buttonWrapperTwo, text="Проверить синтаксис Apache", bg="#0088cc", fg="white", width=25)
buttonConfMysql    = Button(buttonWrapperTwo, text="Конфигурация my.cnf", bg="#0088cc", fg="white", width=25)

buttonConfApache.grid(column=0, row=2, ipady=10, padx=5, pady=5)
buttonSyntaxApache.grid(column=1, row=2, ipady=10, padx=5, pady=5)
buttonConfMysql.grid(column=2, row=2, ipady=10, padx=5, pady=5)

# Форма добавления хоста
addHostWrapper = Frame(mainCanvas, width=300)
addHostWrapper.pack()

addNewHostInput = Entry(addHostWrapper, font=18, width=22)
addNewHostButton = Button(addHostWrapper, text="Добавить хост", bg="#0088cc", fg="white")
addNewHostInput.grid(column=0, row=3, ipady=5, pady=15)
addNewHostButton.grid(column=1, row=3, ipady=5, pady=15)

# Рендер хостов
def vHostsListRender():
    vHostsDisabled = os.listdir('/etc/httpd/conf/sites-available/')
    vHostsEnabled = os.listdir('/etc/httpd/conf/sites-enabled/')
    vHosts = []

    for disableHost in vHostsDisabled:
        thisVHost = 0
        for enableHost in vHostsEnabled:
            if disableHost == enableHost:
                vHosts.append([disableHost, 'Активен'])
                thisVHost = 1
        if thisVHost == 0:
            vHosts.append([disableHost, 'Не активен'])

    # Строка с которой начинаем заполнять
    row = 0

    hostList = Frame(mainCanvas, width=300, height=100, bg="#f5f5f5")
    hostList.pack()

    for host in vHosts:
        # Имя хоста
        hostName = Label(hostList, text=host[0], bg="#f5f5f5")
        hostName.grid(column=0, row=row, ipady=5, padx=5, pady=5)

        # Чекбокс для активации хоста
        activeCheckbox = Checkbutton(hostList, text="Активировать", command=lambda host=host[0]: clicked(host), onvalue=1, offvalue=0, bg="#f5f5f5")
        activeCheckbox.grid(column=1, row=row, ipady=5, padx=5, pady=5)

        # Кнопка редактировать хост
        hostRemoveButton = Button(hostList, text="Изменить", command=lambda host=host[0]: clicked(host), bg="#0088cc", fg="white", width=10)
        hostRemoveButton.grid(column=2, row=row, ipady=5, padx=5, pady=5)

        # Кнопка удаления хоста
        hostRemoveButton = Button(hostList, text="Удалить", command=lambda host=host[0]: clicked(host), bg="#0088cc", fg="white", width=10)
        hostRemoveButton.grid(column=3, row=row, ipady=5, padx=5, pady=5)

        row += 1


# Инициализация
vHostsListRender()
window.mainloop()


Написал вот такой код, в итоге получил такое окно
5f964baea12dc545229379.png

Как видно на скрине полоса прокрутки есть, но она не работает, более того она явно не понимает до куда скролить судя по ее размерам. Всех чувствительных прошу простить я изучаю python недавно, а tkinter и подавно. Но буду благодарен за любую помощь, заранее спасибо!
  • Вопрос задан
  • 438 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы