Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> PyGTK точное позиционирование елементов, ссылки 
V
    Опции темы
theworldcreator
Дата 15.10.2009, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Как настроить размеры ячеек VBox и HBox?
Вот что получилось у меня(программа, которую я разрабатываю):
user posted image

Я бы хотел всю верхнюю строку(элемент VBox) сделать фиксированной ширины, независимо от кол-ва текста и размеров окошка

Код

    self.message_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
    self.message_window.resize(400,200)
    self.message_window.move(self.X, self.Y)


    hbox = gtk.HBox()
    self.link_button_widget = gtk.LinkButton("http://google.com/")
    hbox.pack_start(self.link_button_widget)
    self.link_button_widget.show()

    widg = gtk.Button()
    img = gtk.Image()
    img.set_from_icon_name('gtk-go-forward-rtl', gtk.ICON_SIZE_BUTTON)
    widg.connect('clicked', self.func, -1)
    widg.add(img)
    img.show()
    hbox.pack_start(widg)
    widg.show()

    self.message_id_widget = gtk.Label()
    hbox.pack_start(self.message_id_widget)
    self.message_id_widget.show()

    widg = gtk.Button()
    widg.connect('clicked', self.func, 1)
    img = gtk.Image()
    img.set_from_icon_name('gtk-go-forward-ltr', gtk.ICON_SIZE_BUTTON)
    widg.add(img)
    img.show()
    hbox.pack_start(widg)
    widg.show()


    vbox = gtk.VBox()
    vbox.pack_start(hbox)
    hbox.show()

    sw = gtk.ScrolledWindow()
    sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
    self.message_desc_widget = gtk.TextView()
    self.message_desc_widget.set_editable(False)
    self.message_desc_text_buffer = self.message_desc_widget.get_buffer()
    sw.add(self.message_desc_widget)
    sw.show()
    self.message_desc_widget.show()
    vbox.pack_start(sw)

    self.message_window.add(vbox)
    vbox.show()

    self.message_window.set_border_width(3)
    self.message_window.connect("delete-event", self.message_window_close)


UPD Понял что слишком много вопросов для одной темы, отредактировал оставив только тот, на который ответили. Если можно, удалите пожалуйста слово "ссылки" из названия(почему то не могу его редактировать)

Это сообщение отредактировал(а) theworldcreator - 22.10.2009, 20:52
PM MAIL WWW ICQ   Вверх
pythonwin
Дата 15.10.2009, 16:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник
Сообщений: 2529
Регистрация: 18.4.2006
Где: за компом

Репутация: 2
Всего: 36



theworldcreator, посмотри glade
PM WWW GTalk Jabber   Вверх
theworldcreator
Дата 15.10.2009, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Смотрел уже, там тоже не получилось решить поставленные проблемы.
PM MAIL WWW ICQ   Вверх
gmorgunov
Дата 16.10.2009, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 17.5.2008

Репутация: 5
Всего: 5



theworldcreator
По-моему для вашей задачи удобнее воспользоваться gtk.Fixed() вместо Hbox() и VBox(). Кстати в glade-2 это есть.  Все упрощается :
Код

#!/usr/bin/env python                  
# coding: utf-8                        
import pygtk                           
pygtk.require('2.0')                   
import gtk                             

class MyClass:
    # close the window and quit
    def delete_event(self, widget, event, data=None):
        gtk.main_quit()                              
        return False                                 

    def __init__(self):
        self.message_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.message_window.resize(400,200)                  
        #self.message_window.move(self.X, self.Y)            

        fbox = gtk.Fixed()
        self.link_button_widget = gtk.LinkButton("http://google.com/")
        fbox.put(self.link_button_widget, 50, 50)                     
        self.link_button_widget.show()                                

        widg = gtk.Button()
        img = gtk.Image()  
        img.set_from_icon_name('gtk-go-forward-rtl', gtk.ICON_SIZE_BUTTON)
        #widg.connect('clicked', self.func, -1)                           
        widg.add(img)                                                     
        img.show()                                                        
        fbox.put(widg, 300, 50)                                           
        widg.show()                                                       

        widg = gtk.Button()
        #widg.connect('clicked', self.func, 1)
        img = gtk.Image()                     
        img.set_from_icon_name('gtk-go-forward-ltr', gtk.ICON_SIZE_BUTTON)
        widg.add(img)                                                     
        img.show()
        fbox.put(widg, 350, 50)
        widg.show()

############### дообавление TextView() в  ScrolledWindow() ##############
        self.message_desc_widget = gtk.TextView()
        self.message_desc_widget.set_editable(True) # для отладки
        self.message_desc_text_buffer = self.message_desc_widget.get_buffer()
        self.message_desc_widget.show()

        sw = gtk.ScrolledWindow()
        sw.add_with_viewport(self.message_desc_widget)
        sw.show()
        sw.set_size_request(400,200)
        fbox.put(sw, 0, 100)

##################################################################
        self.message_window.add(fbox)
        fbox.show()

        self.message_window.set_border_width(3)
        self.message_window.connect("delete-event", self.delete_event)

        self.message_window.show_all()

if __name__ == "__main__":
    w = MyClass()
    gtk.main()

Проверил, в openSuse 11.1 smile.
PM MAIL   Вверх
theworldcreator
Дата 17.10.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Спасибо за идею, но, посмотрев внимательно я от нее отказался - слишком много автоматики отключается, даже на сайте pygtk не советуют использовать fixed без крайней необходимости. Зато случайно наткнулся на VPaned, который решил мою проблему. Кстати, я правильно понимаю, - нижний VPaned без ухищрений никак не сделать? Я повесил на событие ресайз окна функцию, которая перемещает разделитель VPaned на N пикселей выше новой позиции нижней границы, но это некрасиво.
PM MAIL WWW ICQ   Вверх
gmorgunov
Дата 17.10.2009, 22:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 17.5.2008

Репутация: 5
Всего: 5



theworldcreator
Привет. Не совсем понял фразу:
Цитата
 Кстати, я правильно понимаю, - нижний VPaned без ухищрений никак не сделать? Я повесил на событие ресайз окна функцию, которая перемещает разделитель VPaned на N пикселей выше новой позиции нижней границы, но это некрасиво.
.
Вроде все делается без проблем:
Код

#!/usr/bin/env python                                 
import pygtk                                          
pygtk.require('2.0')                                  
import gtk                                            

class MyPaned:
    def __init__(self):
        window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        window.set_title("MyPaned ")            
        window.connect("destroy", lambda w: gtk.main_quit())
        window.set_size_request(400, 200)                   
                                                            
        vpaned = gtk.VPaned()                                                     
        window.add(vpaned)                                                        
        vpaned.show()                                                             
#####################################                                             
        hbox = gtk.HBox()                                                         
        link_button_widget = gtk.LinkButton("http://google.com/")                 
        hbox.pack_start(link_button_widget)                                       
        link_button_widget.show()

        widg = gtk.Button()
        img = gtk.Image()
        img.set_from_icon_name('gtk-go-forward-rtl', gtk.ICON_SIZE_BUTTON)
        widg.add(img)
        img.show()
        hbox.pack_start(widg)
        widg.show()

        widg = gtk.Button()
        img = gtk.Image()
        img.set_from_icon_name('gtk-go-forward-ltr', gtk.ICON_SIZE_BUTTON)
        widg.add(img)
        img.show()
        hbox.pack_start(widg)
        widg.show()

        vpaned.add1(hbox)
        hbox.show()
######################################

        self.message_desc_widget = gtk.TextView()
        self.message_desc_widget.show()

        sw = gtk.ScrolledWindow()
        sw.add_with_viewport(self.message_desc_widget)
        sw.show()

        vpaned.add2(sw)
        window.show()

if __name__ == "__main__":
    mp=MyPaned()
    gtk.main()


PM MAIL   Вверх
theworldcreator
Дата 18.10.2009, 23:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



Это вроде обычный, я говорил о нижнем, вот так(мой вариант):
Код

#!/usr/bin/env python                                 
import pygtk                                          
pygtk.require('2.0')                                  
import gtk                           
class MyPaned:
    def __init__(self):
        self.filters_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.filters_window.resize(400,200)
        self.filters_window_vpaned = gtk.VPaned()
        self.filters_window_vpaned.add1(gtk.Button('1'))
        self.filters_window_vpaned.add2(gtk.Button('Close'))
        self.filters_window.add(self.filters_window_vpaned)
        self.filters_window_vpaned.show()
        self.filters_window_vpaned_last_position = 0
        self.filters_window.connect("size-allocate", self.change_filters_vpaned_position)
        self.filters_window.show_all()
            
            
            
    def change_filters_vpaned_position(self, allocation, rectangle):
            if not self.filters_window_vpaned_last_position == rectangle.height:
                self.filters_window_vpaned.set_position(rectangle.height - 30)
            self.filters_window_vpaned_last_position = rectangle.height


if __name__ == "__main__":
    
        app = MyPaned()
        
        gtk.main()


PM MAIL WWW ICQ   Вверх
gmorgunov
Дата 20.10.2009, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 17.5.2008

Репутация: 5
Всего: 5



theworldcreator
Методом тыка нашел вариант попроще smile :
Код

#!/usr/bin/env python
import pygtk
pygtk.require('2.0')
import gtk
class MyPaned:
    def __init__(self):
        self.filters_window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.filters_window.connect("destroy", lambda w: gtk.main_quit())
        self.filters_window.resize(400,200)
        self.filters_window_vpaned = gtk.VPaned()

        self.filters_window_vpaned.pack1(gtk.Button('1'), True, False)
        self.filters_window_vpaned.pack2(gtk.Button('Close'), False, True)
        self.filters_window_vpaned.set_position(170)
        # self.filters_window_vpaned.queue_resize() <----- NOT  NEED

        self.filters_window.add(self.filters_window_vpaned)
        self.filters_window_vpaned.show()
        self.filters_window.show_all()

if __name__ == "__main__":
        app = MyPaned()
        gtk.main()


PM MAIL   Вверх
theworldcreator
Дата 22.10.2009, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 362
Регистрация: 25.8.2007
Где: Москва

Репутация: нет
Всего: 13



gmorgunov
Спасибо!
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Python: Разработка GUI | Следующая тема »


 




[ Время генерации скрипта: 0.0763 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.