Картина рисует тысячу слов ...:
В моем приложении 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()