Найти - Пользователи
Полная версия: Скролл моя беда
Начало » GUI » Скролл моя беда
1
Heddin
Всем привет! Изучать Python только начал, для работы хочу сделать небольшое приложение.
Не могу добавить скрол в канвас, пожалуйста помогите.

Обясните сам процес, как я понимаю:
1. Создаем канвас
2. Создаем скролл
3. Вешаем к примеру скрол на какой-нибудь обект в котором будет сам наш канвас
4. Добавляем в канвас обекты, которые будут скроллиться

А дальше что? Относительно чего скрол будет работать, если объекты будут выходить за размеры канваса? Много ссылок перерыл, примеров, не могу понять, может дурак и не посилам), но очень нужно. Заранее спасибо.


Вот код:
#!/usr/bin/python
from tkinter import *
class main:
    def __init__(self, master):
        self.master = master
        self.master.title('parent')
        self.master.wm_state('zoomed')
        """ Меню """
        m = Menu(self.master) #создается объект Меню на главном окне
        self.master.config(menu=m) #окно конфигурируется с указанием меню для него
         
        fm = Menu(m) #создается пункт меню с размещением на основном меню (m)
        m.add_cascade(label="Файл",menu=fm) #пункту располагается на основном меню (m)
        fm.add_command(label="База") #формируется список команд пункта меню
        fm.add_command(label="Выход")
         
        hm = Menu(m) #второй пункт меню
        m.add_cascade(label="Отчеты",menu=hm)
        hm.add_command(label="Общий")
        hm.add_command(label="По месяцам")
        
        """ Canvas, Frame """
        #1. Добавляю главный Frame (GrandFrame)
        #2. Добавляю в GrandFrame Frame(HeaderTabFrame) для заголовка таблицы
        #3. Добавляю в GrandFrame canvas(GrandCanvas) - для скролла
        #4. Добавляю в GrandCanvas саму Таблицу
        GrandFrame = Frame(self.master, bg="gray",width=800)
        GrandFrame.pack(side = TOP, fill = BOTH, expand = YES)
        
        HeaderTabFrame = Frame(GrandFrame, bg="white",width=800, height=30)
        HeaderTabFrame.pack(side = TOP, fill = BOTH)
              
        GrandCanvas = Canvas(GrandFrame, bg="lightblue")
        GrandCanvas.pack(side = TOP, fill = BOTH, expand = YES)
        TableBody = Table(GrandCanvas)
        TableBody.pack()
               
        self.master.mainloop()
class Cell(Entry): 
    def __init__(self, parent):
        self.value = StringVar()
        Entry.__init__(self, parent, textvariable = self.value)
class Table(Frame):
    def __init__(self, parent, columns = 5, rows=70):
        Frame.__init__(self, parent)
        self.cells = [[Cell(self) for i in range(columns)] for j in range(rows)]
        [self.cells[i][j].grid(row = i, column = j) for i in range(rows) for j in range(columns)]
        
if __name__ == '__main__':
    root = Tk()
    main(root) 
4kpt_II
Операции следующие:
1. Создаем canvas.
2. Создаем scrollbar.
3. Связываем нужное направление_scrollcommand с scrollbar.set
4. Связываем scrollbar command с canvas.направление_view

P.S. Будут вопросы - пишите…
P.S.S. ООП построено неверно
Heddin
Вот, дабавился скрол, но к сожалению он не работает, чего еще не хватает или ошибка?
#!/usr/bin/python
from tkinter import *
import sqlite3 as lite
class main:
    def __init__(self, master):
        self.master = master
        self.master.title('parent')
        self.master.wm_state('zoomed')
        """ Меню """
        m = Menu(self.master) #создается объект Меню на главном окне
        self.master.config(menu=m) #окно конфигурируется с указанием меню для него
         
        fm = Menu(m) #создается пункт меню с размещением на основном меню (m)
        m.add_cascade(label="Файл",menu=fm) #пункту располагается на основном меню (m)
        fm.add_command(label="База") #формируется список команд пункта меню
        fm.add_command(label="Выход")
         
        hm = Menu(m) #второй пункт меню
        m.add_cascade(label="Отчеты",menu=hm)
        hm.add_command(label="Общий")
        hm.add_command(label="По месяцам")
        
        """ Canvas, Frame """
        GrandFrame = Frame(self.master, bg="gray",width=800)
        GrandFrame.pack(side = TOP, fill = BOTH, expand = YES)
        
        
        HeaderTabFrame = Frame(GrandFrame, bg="white",width=800, height=30)
        HeaderTabFrame.pack(side = TOP, fill = BOTH)
        
        GrandCanvas = Canvas(GrandFrame, bg="lightblue")
        GrandCanvas.pack(side = TOP, fill = BOTH, expand = YES)
        
        #Создаю scrollbar
        scrollbar = Scrollbar(GrandCanvas)
        scrollbar.config(command=GrandCanvas.yview)
        GrandCanvas.configure(yscrollcommand=scrollbar.set)
        scrollbar.pack(side=RIGHT, fill=Y)
        TableBody = Table(GrandCanvas)
        TableBody.pack()
               
        self.master.mainloop()
class Cell(Entry): 
    def __init__(self, parent):
        self.value = StringVar()
        Entry.__init__(self, parent, textvariable = self.value)
class Table(Frame):
    def __init__(self, parent, columns = 5, rows=70):
        Frame.__init__(self, parent)
        self.cells = [[Cell(self) for i in range(columns)] for j in range(rows)]
        [self.cells[i][j].grid(row = i, column = j) for i in range(rows) for j in range(columns)]
        
if __name__ == '__main__':
    root = Tk()
    main(root) 
4kpt_II
Код мегажуткий… Держите

# coding: utf-8
#!/usr/bin/python
from Tkinter import *
import sqlite3 as lite
class main:
    def __init__(self, master):
        self.master = master
        self.master.title('parent')
        self.master.attributes('-fullscreen', 1)
        """ Меню """
        m = Menu(self.master) #создается объект Меню на главном окне
        self.master.config(menu=m) #окно конфигурируется с указанием меню для него
        fm = Menu(m) #создается пункт меню с размещением на основном меню (m)
        m.add_cascade(label="Файл",menu=fm) #пункту располагается на основном меню (m)
        fm.add_command(label="База") #формируется список команд пункта меню
        fm.add_command(label="Выход")
        hm = Menu(m) #второй пункт меню
        m.add_cascade(label="Отчеты",menu=hm)
        hm.add_command(label="Общий")
        hm.add_command(label="По месяцам")
        """ Canvas, Frame """
        GrandFrame = Frame(self.master, bg="gray",width=800)
        GrandFrame.pack(side = TOP, fill = BOTH, expand = YES)
        #HeaderTabFrame = Frame(GrandFrame, bg="white",width=800, height=30)
        #HeaderTabFrame.pack(side=LEFT, fill = BOTH)
        GrandCanvas = Canvas(GrandFrame, bg="lightblue")
        GrandCanvas.pack(side = LEFT, expand=True, fill=BOTH)
        #Создаю scrollbar
        scrollbar = Scrollbar(GrandFrame)
        scrollbar.config(command=GrandCanvas.yview)
        GrandCanvas.configure(yscrollcommand=scrollbar.set,
                              scrollregion=(0, 0, 800, 1500))
        scrollbar.pack(side=RIGHT, fill=Y)
        FrameTable = Frame(GrandCanvas)
        TableBody = Table(FrameTable)
        TableBody.pack()
        GrandCanvas.create_window((0, 0), window=FrameTable, anchor="nw")
        self.master.mainloop()
class Cell(Entry):
    def __init__(self, parent):
        self.value = StringVar()
        Entry.__init__(self, parent, textvariable = self.value)
class Table(Frame):
    def __init__(self, parent, columns = 5, rows=70):
        Frame.__init__(self, parent)
        self.cells = [[Cell(self) for i in range(columns)] for j in range(rows)]
        [self.cells[i][j].grid(row = i, column = j) for i in range(rows) for j in range(columns)]
if __name__ == '__main__':
    root = Tk()
    main(root)

P.S. Никогда не делайте from tkinter import *.
Heddin
Спасибо большое, буду двигаться дальше.

4kpt_II
Код мегажуткий…
Понимаю, только учусь, буду исправляться… если не сложно, в двух словах объясните что именно нужно переделать. Читаю Марка Лутца 2011г. 4-е издание. Какие темы нужно подогнать?
4kpt_II
ООП неверно использовано. Возьмите доку от new mexico tech и там можно посмотреть как правильно реализовывать ООП в Tkinter. Это раз. Во-вторых почитайте по-поводу PEP8 (если лень разбираться, то сразу поставьте себе нормальный IDLE по-уровню PyCharm - он сразу все подчеркивает и подписывает). Комментарии везде где нужно и где нет. Это лишнее. Если хотите комментировать, то комментируйте блоки кода, а не каждую строку. Ну и не так “”“ Меню ”“”, конечно Ну и класс из одного виджета вообще вызывает умиление…

P.S. Про from tkinter import * уже написал.

P.S.S. Удачи в обучении.
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