2011-08-05 28 views
6

Tôi muốn bật lên menu ngữ cảnh khi người dùng nhấp chuột phải vào hàng tiêu đề của Gtk.TreeView. Trong GTK3, Gtk.TreeViewColumn có phương thức get_button(), điều này giúp dễ dàng; chỉ cần đính kèm menu vào nút và kết nối nó với sự kiện 'được nhấp'. Tuy nhiên, trong GTK2, điều này sẽ không hoạt động. Bạn chỉ có thể gọi phương thức get_widget(), trả về Không nếu bạn chưa đặt tiện ích qua set_widget(). Tôi đã thử đặt một Gtk.Label với tên cột vào một Gtk.EventBox và đặt làm tiện ích Sau khi kết nối EventBox với gọi lại cho 'button_press_event', việc nhấp vào nó không tạo ra sự kiện.Làm cách nào để bạn đính kèm menu bật lên vào nút tiêu đề cột trong GTK2 bằng PyGObject?

Tôi đã cố gắng làm một cái gì đó giống như những gì được liệt kê here nhưng làm get_parent() trên tiện ích cột trả về Không có và không bao giờ đạt đến nút như mã của chúng.

Giải pháp nào mà mọi người tìm thấy cho điều này?

+0

Tôi nên làm rõ rằng bằng "trong GTK2, điều này sẽ không hoạt động", tôi nên nói, "trong GTK2, phương thức' get_button() 'không được triển khai. –

+0

Bây giờ tôi cũng tìm ra rằng' menu.attach_to_widget() 'và' menu.popup() 'dường như không thể quan sát được trong GTK2.Theo [PyGObject site] (https://live.gnome.org/PyGObject/IntrospectionPorting), trong menu GTK3' menu.popup() 'đã được thực hiện thông qua một ghi đè, tuy nhiên tôi không thể tìm thấy tài liệu về cách thức này được thực hiện –

Trả lời

3

Điều này khá dễ thực sự, nhưng bạn cần một vài lỗi.

Trước tiên, bạn cần phải buộc Gtk để tạo ra một nút tiêu đề cho GtkTreeViewColumn:

label = gtk.Label("Column title") 
    label.show() 
    treeview_column.set_widget(label) 

Sau đó bạn cần phải lấy GtkButton nội bộ của tiêu đề:

widget = treeview_column.get_widget() 
    while not isinstance(widget, gtk.Button): 
     widget = widget.get_parent() 

Cuối cùng với một nút tham chiếu bạn có thể làm điều gì đó hữu ích:

def button_release_event(button, event): 
     if event.button == 3: 
      menu.popup(event) 

    widget.connect('button-release-event', button_release_event) 

Điều này được lấy từ 0 Thư việncó một số ObjectList cung cấp danh sách python như api để tạo GtkTreeViews.

+0

Tôi đang viết trong Perl, nhưng cách tiếp cận này hoạt động tương tự. trước khi gọi get_widget. – TheAmigo

0

Điều này thực sự có vẻ phức tạp, tôi đã xem source. Rõ ràng là thủ thuật parent hoạt động (và trả về đối tượng căn chỉnh), tuy nhiên nhãn tùy chỉnh của bạn chỉ được thêm vào nút sau khi TreeviewColumn đã được nhận ra, vì vậy trước khi thuộc tính parent giữ nguyên None Vì vậy, có lẽ mới nhất sau lệnh hiển thị của bạn về Treeview, bạn nên có thể lấy bố mẹ (Button-> HBox-> Alignment-> Label) và có thể gắn bộ xử lý của bạn vào tín hiệu.

0

Tôi thích các ví dụ hoạt động trên S.O, vì vậy tôi quyết định đăng bài. Tất cả các khoản tín dụng đều dành cho @Johan Dahlin!

#!/usr/bin/env python3 

from gi.repository import Gtk 

def button_release_event(button, event): 
    if event.button == 3: 
     menu.popup(None, None, None, None, event.button, event.time) 


window = Gtk.Window() 
window.connect("destroy", lambda q: Gtk.main_quit()) 

liststore = Gtk.ListStore(str) 
liststore.append(["1"]) 
liststore.append(["2"]) 

menu=Gtk.Menu() 
menu.append(Gtk.ImageMenuItem("Yep it works!")) 
menu.append(Gtk.ImageMenuItem(":)")) 
menu.show_all() 

treeview = Gtk.TreeView(model=liststore) 
window.add(treeview) 

treeviewcolumn = Gtk.TreeViewColumn() 
treeview.append_column(treeviewcolumn)  

# Set the treeviewcolum as clickable 
# 
treeviewcolumn.set_clickable(True) 

# force Gtk to create a header button for the Gtk.TreeViewColumn 
# 
label = Gtk.Label("Numbers") 
label.show() 
treeviewcolumn.set_widget(label) 

# fetch the internal GtkButton of the header: 
# 
widget = treeviewcolumn.get_widget() 
while not isinstance(widget, Gtk.Button): 
    widget = widget.get_parent() 

widget.connect('button-release-event', button_release_event) 

cellrenderertext = Gtk.CellRendererText() 
treeviewcolumn.pack_start(cellrenderertext, True) 
treeviewcolumn.add_attribute(cellrenderertext, 'text', 0) 

window.show_all() 
Gtk.main() 

hacking hạnh phúc!

Các vấn đề liên quan