LINUX.ORG.RU

[PyGTK][GTK]Gtk.Notebook

 ,


0

2

Можно ли как-нибудь узнать ширину табов у виджета Gtk.Notebook? И если нет, то как можно сделать, чтобы Gtk.Button не мог быть больше по ширине, чем Gtk.ScrolledWindow?

★★★★
Ответ на: комментарий от baverman

хм, интересная идея, сейчас попробую.

drakmail ★★★★
() автор топика
Ответ на: комментарий от baverman

Да, способ работает, но не очень точно =/ Да и выглядит костыльно немного. Но за идею спасибо, пока лучший вариант.

drakmail ★★★★
() автор топика
Ответ на: комментарий от drakmail

ширина таба устанавливается автоматически. можно выбрать два режима - растягиваться на всю длинну виджета ноутбука, либо по длинне виджета заголовка таба. управлять шириной можно через размер виджета заголовка. это не костыльное решение, а единственное правильное, поскольку в гтк в основе любого виджета лежит «резиновость». Это сделано для возможности безболезненного растягивания (либо всего приложения, либо при увеличении размера шрифта). Другими словами, если даже и запрашивается размер через size_request, то это носит характер «желаемый», но ни в коем разе не «декларативный». Если есть возможность выставить этот размер, виджету оный назначается, в противном случае никакого эффекта не будет. Только благодаря этой возможности в гтк никогда не увидите «наезжание» текста кнопки на соседний виджет ибо там все и вся основанно на контейнерах и параметрах элементов, которые в них встраиваются. Если вспомнить, то любая упаковка виджета сопровождается заданием параметров expand и fill. вот... ну это в кратце :)

Deleted
()
Ответ на: комментарий от Deleted

Спасибо за развернутый комментарий. Но хотелось бы узнать, почему тогда у меня происходит такая ситуация:

http://xyec.info/?v=python.png

,где прямоугольники — кнопки. Верхняя часть показывает ситуацию сейчас (заштрихованный прямоугольник — вылезающая за пределы notebook часть (на самом деле она обрезана)). Это случается из-за того, что у кнопки слишком длинный текст, и кнопка растягивается, чтобы вместить его. А хотелось бы, чтобы выглядела, как прямоугольник снизу (чтобы текст на кнопке обрезался).

drakmail ★★★★
() автор топика
Ответ на: комментарий от Deleted

ммм, ща скриншоты сделаю минут через -дцать :)

drakmail ★★★★
() автор топика
Ответ на: комментарий от ananas

О, спасибо, посмотрю, как буду дома.

drakmail ★★★★
() автор топика
Ответ на: комментарий от baverman

>Что в качестве чайлда в ноутбуке выступает?

Gtk.ScrolledWindow

drakmail ★★★★
() автор топика
Ответ на: комментарий от ananas

>для этого - gtk_label_set_ellipsize

О, спасибо! Именно то, что нужно!

PS. Не проверял, но описание радует.

drakmail ★★★★
() автор топика
Ответ на: комментарий от ananas

>лови size-allocate и GtkNotebook и устанавливай нужные размеры у кнопки

scrolled.connect(«size-request», allocate_size_def)

def allocate_size_def(widget, allocation):
print allocation.width

allocation.width дает то, что мне нужно. Но проблема в том, что отрабатывает callback уже после показа виджета. А мне нужно значение сразу после создания :(

Хотя тут можно пробежаться по всем итемам-кнопкам, попробовать после получения события выставить им нужный размер...

drakmail ★★★★
() автор топика
Ответ на: комментарий от baverman

Как раз делаю, но проблема в том, что мне нужно знать размеры ScrolledWindow, чтобы сделать правильный size_request (иначе текст будет обрезаться слишком рано, или слишком поздно).

drakmail ★★★★
() автор топика
Ответ на: комментарий от baverman

(сейчас это делается так:

bt_label.set_size_request(width-250,-1) #Button label width...

, где width — ширина окна, а 250 — ширина табов в моем случае (но она может меняться). Ну а bt_label — Label на Button в VBox в ScrolledWindow.

drakmail ★★★★
() автор топика
Ответ на: комментарий от drakmail

Насколько я понял требуется как то так. Ноутбук опустил, он вообще не при делах.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import gtk, pango

box = gtk.VBox()

for i in range(100):
    lb = gtk.Label('Label text %d' % i)
    lb.set_ellipsize(pango.ELLIPSIZE_END)
    lb.set_alignment(0, 0.5)
    btn = gtk.Button()
    btn.add(lb)
    box.pack_start(btn)

sw = gtk.ScrolledWindow()
sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC)
sw.add_with_viewport(box)

w = gtk.Window(gtk.WINDOW_TOPLEVEL)
w.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG)
w.set_default_size(200, 400)
w.add(sw)
w.show_all()

# В этом кусочке происходит, как раз, ресайз полоски с кнопками в шируну 50ти пикселей
# У тебя оно будет width_of_tab_label, по видимому.
box.set_size_request(50, -1)
_, h = w.get_size()
w.resize(w.size_request()[0], h)

gtk.main()
baverman ★★★
()
Ответ на: комментарий от baverman

а накой там set_size_request? и в примере, и судя про скриншотам тс-а вполне достаточно разруливать ширину размерами окна

ananas ★★★★★
()
Ответ на: комментарий от baverman

Ширина как раз должна быть изменяемая, в идеале.

drakmail ★★★★
() автор топика
Ответ на: комментарий от ananas

>а накой там set_size_request? и в примере, и судя про скриншотам тс-а вполне достаточно разруливать ширину размерами окна

Весь вопрос в том, как узнать необходимую ширину кнопок, если табы (вкладки слева) имеют динамический размер? Или же, как сделать, чтобы кнопки не могли иметь ширину больше, чем родительский виджет?

drakmail ★★★★
() автор топика
Ответ на: комментарий от baverman

О, пример работает как надо, осталось узнать, почему в моем случае всё глючит :)

drakmail ★★★★
() автор топика

Нашел, почему кнопка вылазила за границу — внутри этой кнопки был HBox, в котором были Image и Label. Если в кнопку поместить напрямую Label, то всё нормально обрезается. Осталось придумать, как сделать, чтобы на кнопке было изображение, и всё нормально обрезалось )

drakmail ★★★★
() автор топика

Или вопрос можно даже так поставить: как сделать, чтобы Hbox не «распирал» родительский виджет? :)

drakmail ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.