GtkIconView, kullanıcı pencereyi yeniden boyutlandırdığında alanı otomatik olarak simgeyle doldurmaz


9

Ubuntu Başarıları projesinde birkaç olağandışı hata var:

Yani bir sayfada GtkNotebook ve GtkIconView içeren bir pencere, başka bir sayfada başka bir pencere var.

Kullanıcı pencereyi yeniden boyutlandırdığında, iconview alanı otomatik olarak simgelerle doldurmaz (orijinal sütun düzeninde kalır), ancak kullanıcı GtkNotebook sayfalarını değiştirir ve böylece simge görünümünü yeniler, alan beklendiği gibi alınır. Pencereyi yeniden boyutlandırırken alanı otomatik olarak nasıl kullanabiliriz?

Daha da önemlisi, pencere göründüğünde, pencereyi daha küçük boyutlandırabiliriz - simge görünümü bizi yeniden boyutlandırmamızı engelliyor ve daha sonra simgeler için kaydırılabilir bir bölgeye sahip gibi görünüyor.

Kod şuna benzer. IconView'ları çalıştıran ListStores:

    self.trophystore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon accomplished, locked, app, accomplishment
    self.trophystore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.trophy_icon.set_model(self.trophystore)

    self.oppstore = Gtk.ListStore(str, GdkPixbuf.Pixbuf, bool, bool, str, str) # title, icon, accomplished, locked, app, accomplishment
    self.oppstore.set_sort_column_id(COL_TITLE, Gtk.SortType.ASCENDING)
    self.opp_icon.set_model(self.oppstore)

    self.trophy_icon.set_text_column(COL_TITLE)
    self.trophy_icon.set_pixbuf_column(COL_PIXBUF)

    self.opp_icon.set_text_column(COL_TITLE)
    self.opp_icon.set_pixbuf_column(COL_PIXBUF)

Bunun dışında, gerçekten IconView'lerle uğraşmıyoruz, sadece görünümleri güncellemek için ListStores'a içerik ekliyoruz.

Proje kodu burada - herkes bu iki sorunu nasıl çözebileceğimizi önerebilir mi?


Sadece bir açıklama: Kullanıcı Not Defteri sayfalarını değiştirdiğinde, uygulama kodu temel alınan modeli temizler ve tüm öğeleri tekrar ekler.
Rafał Cieślak

Yanıtlar:


3

Tamam, bunu nasıl düzeltebileceğimizi anladığımız için, başka birinin bu sorunu olması durumunda çözümü burada anlatacağım.

Hile GtkIconView bir GtkScrolledWindow yerleştirmek ve hscrollbar_policy "her zaman" olarak ayarlamaktır. Daha sonra, kullanıcı pencereyi yeniden boyutlandırdığında tepki vermek için bir kontrol yeniden boyutlandırma sinyali kullanılmalıdır (örneğin, pencere sürüklendiğinde de sinyal yayıldığı için boyutun değişip değişmediğinin kontrol edilmesi gerektiğini unutmayın).

Boyut değiştiğinde, GtkIconView tarafından kullanılan modelin temizlenmesi ve yeniden oluşturulması gerekir; Ayrıca, sonuç olarak yatay kaydırma çubuğu hiçbir zaman görülmeyecektir, çünkü GtkIconView GtkScrolledWindow'un kullandığı alanın tamamını kullanır.


Bu son derece yardımcı oldu, cevap için teşekkürler! Ben lp: qreator üzerinde etkilendim ve düzeltme ile ana simge görünümünde simge sütunlarının sayısı yeniden boyutlandırma üzerine dinamiktir.
David Planella

1

Bu soruna tercih ettiğim çözüm, Gtk.IconView'ın çok küçük bir alt sınıfıdır:

class FluidIconView (Gtk.IconView):
    def __init__ (self):
        Gtk.IconView.__init__ (self)
        self.connect ("size-allocate", FluidIconView.on_size_allocate)

    def do_get_preferred_width (self):
        return (0,0)

    def on_size_allocate (self, allocation):
        [self.set_columns (m) for m in [1,self.get_columns ()]]

Get_preferred_width geçersiz kılma, görünümün keyfi olarak dar olmasına olanak tanır. Boyut ayırma geri araması, sütun sayısını 1 ve geri ayarlayarak geçişi zorlar.


1

Boyut değiştiğinde sütunları 0 ve -1 olarak da ayarlayabilirsiniz. Bu şekilde simgelerin seçimi kaldırılmaz:

iconview.set_columns(0)
iconview.set_columns(-1)

(Bu yapılmalıdır ilaveten için @ rafalcieslak cevabı .)


Bu neden rafalcieslak'ın cevabına ek olarak? Sütun sayısını değiştirirseniz, bir geçiş elde edersiniz; yine de modeli yeniden oluşturmak anlamsız olurdu.
cscarney
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.