Найти - Пользователи
Полная версия: [Tkinter] динамическое заполнение скроллящегося окна
Начало » GUI » [Tkinter] динамическое заполнение скроллящегося окна
1
@cckyi_boxxx
нашел в нете рабочий пример , вот он :

#!/usr/bin/python
#-*- coding: utf-8 -*-
from Tkinter import *
def data():
    for i in range(50):
       Label(frame,text=i).grid(row=i,column=0)
       Label(frame,text="my text"+str(i)).grid(row=i,column=1)
       Label(frame,text="..........").grid(row=i,column=2)
def myfunction(event):
    canvas.configure(scrollregion=canvas.bbox("all") ,width=200,height=200)
root=Tk()
sizex = 800
sizey = 600
posx  = 100
posy  = 100
root.wm_geometry("%dx%d+%d+%d" % (sizex, sizey, posx, posy))
myframe=Frame(root,relief=GROOVE,width=50,height=100,bd=1)
myframe.place(x=10,y=10)
canvas=Canvas(myframe)
frame=Frame(canvas)
myscrollbar=Scrollbar(myframe,orient="vertical",command=canvas.yview)
canvas.configure(yscrollcommand=myscrollbar.set)
myscrollbar.pack(side="right",fill="y")
canvas.pack(side="left")
canvas.create_window((0,0),window=frame,anchor='nw')
frame.bind("<Configure>",myfunction)
data()
root.mainloop()


стал прикручивать к своей софтине , получилось что-то наподобие этого (лишнее выкинул)

#/usr/bin/python
# -*- coding: utf-8 -*-
import Tkinter as tk
class gui(object):
    def __init__(self):
        ##
        self.root = tk.Tk()
        self.root.geometry('900x600+0+0')
        self.root.maxsize(900, 600)
        self.root.minsize(900, 600)
        self.mfrm = tk.Frame(self.root , borderwidth = 0)
        self.mfrm.place(x = 0 , y = 0 , width = 900 , height = 600)
        self.root.title('злая хрень ver 1.0 beta')
        ### менюха (урезано что-б глаза не мозолил лишний код)
        self.addnew = tk.Button(self.mfrm , text = 'создать' , command = self.creator )
        self.addnew.place(x = 5 , y = 5 , width = 100 , height = 20)
        self.__hr = tk.Label(self.mfrm , background = '#000000' , borderwidth = 0)
        self.__hr.place(x = 0 , y = 65 , width = 900 , height = 3)
        
        ### попытка запилить окно со скроллбаром
        self.canvas = tk.Canvas(self.mfrm)
        self.sfrm = tk.Frame(self.canvas)
        self._scrollb = tk.Scrollbar(self.mfrm , orient = 'vertical' , command = self.canvas.yview)
        self.canvas.configure(yscrollcommand = self._scrollb.set)
        self._scrollb.place(x = 880 , y = 70 , width = 20 , height = 530)
        self.canvas.pack(side="left") #place(x = 0 , y = 70 , width = 880 , height = 530)
        self.canvas.create_window( (0,0) , window = self.sfrm , anchor = 'nw')
        self.sfrm.bind("<Configure>" , self._reconf_canvas)
        
    def _reconf_canvas(self , event):
        self.canvas.configure( scrollregion = self.canvas.bbox('all') , width = 880 , height = 530)
        
    
    def creator(self):
        # эта функция запилена именно так потому-что в боевой версии кода ничто кроме метода place не подходит 
        #поэтому я код упростил выглядит кривовато но так надо
        ynext = 100
        for x in xrange(100):
            # когда помещаю кнопки в self.sfrm ничего не видно
            bu = tk.Button(self.sfrm , text = str(x) ) # при этом в self.mfrm все создаеться и видно но естественно скроллбар не работает
            bu.place(x = 5 , y = ynext , width = 400 , height = 20)
            ynext += 30
            
        
    
        
grf = gui()
grf.root.mainloop()

вопрос в том как это заставить работать учитывая что grid() как метод компоновки виджетов ну никак не канает так как во-первых все переписывать с нуля да и когда все вымерено до пикселя при помощи place() как-то самому спокойнее и удобнее писать
4kpt_II
Готов помочь, но не пойму что надо. Код запустил. Он работает…
Как то все у Вас сумбурно.

P.S. Методы можно разграничивать рамками.
P.S.S. Очень много ошибок в технике построения GUI - если надо, то напишу…
@cckyi_boxxx
тот что выложен первым работает вполне успешно , а тот что реализован в виде класса при нажатии на кнопку “создать” не подает никаких признаков жизни , питон 2.7.3 , даже удивительно как он у вас заработал


P.S.S. Очень много ошибок в технике построения GUI - если надо, то напишу…
если вы о моем стиле написания то я обычно сначала леплю нагрязную (быдлокод с костылями) а затем вычищаю после того как софтина готова , у меня так быстрее получаеться писать , тем не менее если вы тыкнете меня мордой в ман описывающий мои ошибки буду рад
4kpt_II
По поводу Вашего вопроса

Замените:

self.sfrm = tk.Frame(self.canvas)

На

self.sfrm = tk.Frame(self.canvas, width=880, height=530)

И окно скроллится не так. Допишите строчку:

self.canvas.config(scrollregion=(0, 0, 1200, 1200))

P.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