Как правильно отображать большое всплывающее меню?

Картина рисует тысячу слов ...:

введите описание изображения здесь

В моем приложении Python 2.7 у меня есть кнопка, при нажатии на которую открывается меню.

В некоторых случаях этот список превышает размер экрана.

  • В Ubuntu 12.04 (использует Gtk 3.4.2) это нормально, потому что вы получаете стрелки прокрутки (как показано справа от изображения).

  • В Ubuntu 12.10 / 13.04 и Fedora 17 (использует Gtk 3.6) я получаю то же меню, но без стрелок прокрутки, и вы не можете прокручивать вверх или вниз с помощью мыши.

Странно то, что если я снова нажму кнопку - стрелки прокрутки снова появятся.

Так что это похоже на какую-то проблему с распределением размера - она ​​не рассчитывалась при первом всплывающем окне, но учитывается при последующих всплывающих окнах.

Отсюда мой вопрос

Что-то явно изменилось с новыми библиотеками GTK - каков теперь правильный метод отображения большого всплывающего меню, гарантирующего отображение стрелок прокрутки?

Есть какие-нибудь подсказки, как мне решить эту очевидную разницу между разными версиями GTK, чтобы я мог получать согласованные стрелки при первом щелчке?

Ниже приведена простая программа тестирования Python, демонстрирующая эту проблему.

Я не мог использовать GTKParasite для диагностики этого, потому что всплывающее окно исчезает, как только вы нажимаете кнопку «Проверить» на самом GtkParasite.

# -*- Mode: python; coding: utf-8; tab-width: 4; indent-tabs-mode: nil; -*-

#!/usr/bin/env python

from gi.repository import Gtk

def popupclick(self, *args):
    popup.popup(None, None, None, None, 0,
            Gtk.get_current_event_time())

window = Gtk.Window()
window.connect('delete_event', Gtk.main_quit)
window.set_default_size(200,200)

first_item = None
popup = Gtk.Menu()

for i in range(100):
    label = 'Item %d' % i
    if not first_item:
        new_menu_item = Gtk.RadioMenuItem(label=label)
        first_item = new_menu_item
    else:
        new_menu_item = Gtk.RadioMenuItem.new_with_label_from_widget(
            group=first_item, label=label)

    new_menu_item.show()
    popup.append(new_menu_item)
    
button = Gtk.Button()
button.connect('clicked', popupclick)
mainbox = Gtk.Box()
mainbox.pack_start(button, True, True, 0)
scroller = Gtk.ScrolledWindow()
scroller.add_with_viewport(mainbox)
window.add(scroller)
    
window.show_all()

Gtk.main()

person fossfreedom    schedule 20.01.2013    source источник
comment
Обратный ответ: не делайте этого, это кошмар UX ;-)   -  person ptomato    schedule 20.01.2013
comment
@ptomato - хммм - есть какие-нибудь мысли по поводу альтернативного виджета, поддерживающего GTK, чтобы вывести что-то, что может содержать множество вариантов - мне не хочется писать много кода с нуля - надеюсь, я смогу позаимствовать какой-нибудь виджет GPL2 / 3, например всплывающий прокручиваемый список?   -  person fossfreedom    schedule 20.01.2013


Ответы (2)


Используйте GtkComboBoxText. Но, как сказал Птомато, такая презентация не адаптирована к спискам из огромного количества ценностей. Либо уменьшите количество отображаемых значений, либо используйте GtkTreeView, который будет иметь полоса прокрутки, и для отображения значений не потребуется первый щелчок.

person liberforce    schedule 21.01.2013

Я немного просмотрел документацию, и вместо использования popup.append(new_menu_item) вы можете использовать popup.attach(new_menu_item, left, right, top, bottom) для размещения пунктов меню в сетке вместо одной длинной строки.

Но, похоже, вам лучше открыть окно с прокручиваемым списком!

person ptomato    schedule 21.01.2013