Форум сайта python.su
Всем привет! Изучать 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)
Офлайн
Операции следующие:
1. Создаем canvas.
2. Создаем scrollbar.
3. Связываем нужное направление_scrollcommand с scrollbar.set
4. Связываем scrollbar command с canvas.направление_view
P.S. Будут вопросы - пишите…
P.S.S. ООП построено неверно
Офлайн
Вот, дабавился скрол, но к сожалению он не работает, чего еще не хватает или ошибка?
#!/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)
Офлайн
Код мегажуткий… Держите
# 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)
Офлайн
Спасибо большое, буду двигаться дальше.
4kpt_IIПонимаю, только учусь, буду исправляться… если не сложно, в двух словах объясните что именно нужно переделать. Читаю Марка Лутца 2011г. 4-е издание. Какие темы нужно подогнать?
Код мегажуткий…
Офлайн
ООП неверно использовано. Возьмите доку от new mexico tech и там можно посмотреть как правильно реализовывать ООП в Tkinter. Это раз. Во-вторых почитайте по-поводу PEP8 (если лень разбираться, то сразу поставьте себе нормальный IDLE по-уровню PyCharm - он сразу все подчеркивает и подписывает). Комментарии везде где нужно и где нет. Это лишнее. Если хотите комментировать, то комментируйте блоки кода, а не каждую строку. Ну и не так “”“ Меню ”“”, конечно Ну и класс из одного виджета вообще вызывает умиление…
P.S. Про from tkinter import * уже написал.
P.S.S. Удачи в обучении.
Офлайн