GTK4 ColumnView Satır Seçim Sorunu

Python ve GTK4 ile denemeler yapıyordum. Ancak GTK4’teki ColumnView widget’ı kullanıldığında her satırın alt ve üst sınırlarında sağ tıklanıp menü açılmayan bölgeler var. Bu nasıl aşılabilir? Tıklamaya duyarsız alanları aşağıdaki resimde kırmızıyla işaretledim. Sağ tıklayınca menü açılmıyor. Ama satırların orta kısımlarına sağ tıklayınca menü açılıyor. Bu durum GTK3’teki TreeView’da yoktu.

gtk4_columnview

Basitleştirilmiş bir Python kodunu aşağıya ekledim.

import gi
gi.require_version("Gtk", "4.0")
gi.require_version("Gio", "2.0")
from gi.repository import Gtk, Gio, GObject, Gdk

class Person(GObject.Object):
    def __init__(self, name, city):
        super().__init__()
        self.name = name
        self.city = city

class AppWindow(Gtk.ApplicationWindow):
    def __init__(self, app):
        super().__init__(application=app, title="GTK4 ColumnView", default_width=400, default_height=300)

        self.model = Gio.ListStore(item_type=Person)
        self.model.append(Person("Abc Def", "İstanbul"))
        self.model.append(Person("Klm Mno", "Ankara"))
        self.model.append(Person("Prs Tui", "İzmir"))
        self.selection_model = Gtk.SingleSelection(model=self.model)
        
        self.column_view = Gtk.ColumnView(model=self.selection_model)
        self.add_column("İsim", "name")
        self.add_column("Şehir", "city")

        scrolled = Gtk.ScrolledWindow()
        scrolled.set_child(self.column_view)
        self.set_child(scrolled)

    def add_column(self, title, property_name):
        factory = Gtk.SignalListItemFactory()
        factory.connect("setup", self.on_factory_setup)
        factory.connect("bind", self.on_factory_bind, property_name)
        column = Gtk.ColumnViewColumn(title=title, factory=factory)
        self.column_view.append_column(column)

    def on_factory_setup(self, factory, list_item):
        label = Gtk.Label(xalign=0)
        list_item.set_child(label)

        gesture = Gtk.GestureClick(button=3)
        gesture.connect("pressed", self.on_row_right_click, list_item)
        label.add_controller(gesture)

    def on_factory_bind(self, factory, list_item, property_name):
        item = list_item.get_item()
        label = list_item.get_child()
        label.set_text(getattr(item, property_name))

    def on_row_right_click(self, gesture, n_press, x, y, list_item):
        index = list_item.get_position()
        self.selection_model.set_selected(index)

        popover = Gtk.PopoverMenu()
        popover.set_parent(list_item.get_child())
        popover.set_has_arrow(True)
        
        rect = Gdk.Rectangle()
        popover.popup()

    def on_edit_clicked(self, action, parameter):
        pass

    def on_delete_clicked(self, action, parameter):
        pass

def on_activate(app):
    win = AppWindow(app)
    win.present()

app = Gtk.Application(application_id="com.example.ColumnViewMenu")
app.connect("activate", on_activate)
app.run(None)

Attığınız kodu birebir açıp deneyeyim dedim, ben arada hiç boşluk hissedemedim, temayla alakalı bir durum da olabilir.

gtk4

ColumnView’in css temasını override edip belirli bir padding, margin veya spacing değerine zorlayabilirsiniz.

Örneğin aralarına 9px boşluk eklemek için ColumnView objenize bosluklu css_class’ını ekleyin :

.bosluklu > listview > row {
	margin-top: 9px;
}

Veya 0px yaparak aradaki boşluğu sıfırlamaya zorlayabilirsiniz.

Sol tıklama çalışıyor. Sağ tıklayarak deneyin. Menü o kısımlarda açılmıyor. Ortalara tıklanınca açılıyor.
Menü deneme amaçlı boş bir menü.

Pardus 25’in varsayılan temasını kullanıyorum. Başka bir tema yüklemedim.

@eminfedar, hatayı yeniden üretebildiniz mi?

Bahsettiğiniz gibi bendede aynı . Sağ tıklama menüsü açılması için illaki Yazı üzerine gelmesi lazım . Yazı sınırları dışında sağ tıklama menüsü açılmıyor .
Ekran Görüntüsü 2025-12-18 16-38-08

Aşağıdaki gibi büyük bir listede olunca sorun oluyor. Sağ tıklama duyarsız yerlere denk geliyor çok satır olunca.

Ben anlamıyom sadece denedim . Bendede aynı bahsettiğiniz gibi . sizin satıra tıkladığında menü açılması lazım . şuan metini tıklayınca açılıyor sanki .Yapay zekaya sorup düzelttirmeye çalışırdım ama kodlar size ait olunca yapay zekanın veri bankasına hediye etmiyiyim diye bişi yapmadım.

Yapay zekada aramak için kullanabilirsiniz.

GTK Inspector kullarak tıpkı tarayıcıdaki öğeyi denetledeki gibi widget’leri denetleyebilir, boyutlarını görebilir ve property’lerini değiştirebilirsiniz.

Problemin özeti şu:

ListItem’in içerisine set_child ile eklediğiniz Gtk.Label’in boyutları satırı tamamen kaplamıyor. Etrafında boşluk var. Bunu da içinde olduğu GtkColumnViewCellWidget ve css’si cell nesnesinin padding’i yapıyor.

Çözüm ise, bu cell’in padding’ini sıfırlayıp Label’a padding vermek. ColumnView’e yine bir css sınıfı atayın, ismi paddingli olabilir örneğin:

/* Column Cell'in paddingini sıfırla */
.paddingli > listview > row > cell {
	padding:0px;
}

/* Column Cell'in içindeki label'e padding ver */
.paddingli > listview > row > cell > label {
	padding: 6px;
}

Bu şekilde olduğunda sağ tıkladığınız zaman Cell’e değil, Label’e tıklarsınız çünkü Label bütün Cell’in boyutunu kaplamış olur artık. Siz aradaki boşluğa tıklayınca menünün gelmeme sebebi Label’e tıklamıyor oluşunuz. Çünkü sağ tık eventi label’e ait.

Normal hali:
image

Label’a padding verilmiş hali (tüm hücreyi kapladı):
image

1 Beğeni

Bir kontrol edin olmuşmu . (Yapay zeka ile çözüldü . Kontrol edilmesi gerek . )
bana göre oldu. Fakat koddan anlıyan biri değilim kontrol edilmesinde fayda var .

import gi
gi.require_version("Gtk", "4.0")
gi.require_version("Gio", "2.0")
from gi.repository import Gtk, Gio, GObject, Gdk

class Person(GObject.Object):
    def __init__(self, name, city):
        super().__init__()
        self.name = name
        self.city = city

class AppWindow(Gtk.ApplicationWindow):
    def __init__(self, app):
        super().__init__(application=app, title="GTK4 ColumnView", default_width=600, default_height=400)
        
        self.model = Gio.ListStore(item_type=Person)
        self.model.append(Person("Abc Def", "İstanbul"))
        self.model.append(Person("Klm Mno", "Ankara"))
        self.model.append(Person("Prs Tui", "İzmir"))
        
        self.selection_model = Gtk.SingleSelection(model=self.model)
       
        self.column_view = Gtk.ColumnView(model=self.selection_model)
        
        # CSS ile hücre padding'ini sıfırlayıp label'ın hücreyi tamamen kaplamasını sağla
        css_provider = Gtk.CssProvider()
        css_provider.load_from_data(
            ".tamkapla listview row cell { padding: 0px; }\n"
            ".tamkapla listview row cell label { padding: 8px 12px; }\n".encode()
        )
        Gtk.StyleContext.add_provider_for_display(
            Gdk.Display.get_default(),
            css_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
        )
        self.column_view.add_css_class("tamkapla")
        
        self.add_column("İsim", "name")
        self.add_column("Şehir", "city")
        
        scrolled = Gtk.ScrolledWindow()
        scrolled.set_child(self.column_view)
        self.set_child(scrolled)

    def add_column(self, title, property_name):
        factory = Gtk.SignalListItemFactory()
        factory.connect("setup", self.on_factory_setup)
        factory.connect("bind", self.on_factory_bind, property_name)
        column = Gtk.ColumnViewColumn(title=title, factory=factory)
        self.column_view.append_column(column)

    def on_factory_setup(self, factory, list_item):
        label = Gtk.Label(xalign=0)
        list_item.set_child(label)
        
        # Sağ tık gesture'ını label'a ekliyoruz
        # CSS sayesinde label hücreyi tamamen kapladığı için satırın her yerinde çalışacak
        gesture = Gtk.GestureClick(button=3)
        gesture.connect("pressed", self.on_row_right_click, list_item)
        label.add_controller(gesture)

    def on_factory_bind(self, factory, list_item, property_name):
        item = list_item.get_item()
        label = list_item.get_child()
        label.set_text(getattr(item, property_name))

    def on_row_right_click(self, gesture, n_press, x, y, list_item):
        index = list_item.get_position()
        self.selection_model.set_selected(index)
        
        # Senin orijinalindeki gibi boş bir PopoverMenu (konuşma baloncuğu)
        popover = Gtk.PopoverMenu()
        popover.set_parent(list_item.get_child())
        popover.set_has_arrow(True)
        
        # İçerik eklemiyoruz → tamamen boş balon
        popover.popup()

def on_activate(app):
    win = AppWindow(app)
    win.present()

app = Gtk.Application(application_id="com.example.ColumnViewMenu")
app.connect("activate", on_activate)
app.run(None)

Bu arada sizin önerinizi yapay zekada kullandım . Teşekkürler . Bir kontrol edermisiniz nekadar doğru yazmış .

Yardımlarınız için teşekkürler. Sorun temadan kaynaklanıyormuş. Cell için olan padding değeri sıfırlanıp Label’e eklenince sorun gitti.

İlk cevabı yazanın mesajını cevap olarak işaretleyeceğim.

1 Beğeni

Sizin mesajınızdaki css kodunu deneyince de sorun düzeldi.

Kendi yazdığın daha iyidir . Bu arada Sistem Gözlem Merkezini bugün indirdim Pardus 25 Gnome de kullanmaya devam . Pardus Mağazada yok ama . Githup dan indirdim .