2012-02-19 19 views
5

Tôi hơi bối rối với một số khái niệm gtk và gnome. Tôi đang cố gắng để có được danh sách các cửa sổ không thu nhỏ trên máy tính để bàn gnome2 của tôi, nhưng sau khi đọc tài liệu pygtk và kiểm tra kết quả, tôi không thể hiểu được kết quả.Làm cách nào để có danh sách tất cả các cửa sổ trên máy tính để bàn gnome2 của tôi bằng pygtk?

Không một trong hai đoạn dưới đây có vẻ hoạt động.

Đầu tiên tôi đã cố gắng này ..

>>> gtk.gdk.window_get_toplevels() 
[<gtk.gdk.Window object at 0xb74339b4 (GdkWindow at 0x8a4c170)>] 

>>> gtk.gdk.window_get_toplevels()[0].get_children() 
[] 

thì đây

>>> d = gtk.gdk.DisplayManager() 
>>> d.get_default_display().get_screen(0).get_root_window().get_children() 
[<gtk.gdk.Window object at 0x89dcc84 (GdkWindow at 0x8a4c170)>, <gtk.gdk.Window object at 0x89dccac (GdkWindow at 0x8a4c0c0)>] 

Như đã thấy trong giao diện điều khiển đầu ra, tùy chọn thứ hai trả về hai cửa sổ. Nhưng tôi đã không thể tìm ra chúng là gì. Không ai trong số họ có bất kỳ trẻ em và tôi allways có được hai cửa sổ bất kể có bao nhiêu cửa sổ tôi có trên máy tính để bàn của tôi.

Ai đó có thể giải thích thứ bậc của các đối tượng của môi trường máy tính để bàn dựa trên gtk điển hình? Tôi không thể hiểu tại sao mã trên không hoạt động.

Vui lòng không đăng các giải pháp thay thế có nguồn lực cho wnck, xlib, qt, v.v. Tôi quan tâm nhiều hơn đến việc hiểu những gì tôi đang làm sai hơn trong việc nhận lời khuyên như chúng tôi kiểm tra các thư viện khác.

Trả lời

9

Hạn chế của bạn giống như nói "Tôi muốn xây dựng một đầu đĩa CD chỉ bằng cách sử dụng một quả chuối. Vui lòng không đăng các giải pháp thay thế cho khu nghỉ mát bằng laser". GTK không thể làm điều đó, bạn đang sử dụng công cụ sai cho công việc.

Dưới đây là một lời giải thích về những gì một "cửa sổ" thực sự có nghĩa và lý do tại sao mã của bạn không hoạt động:

Trước hết, bạn cần phải hiểu sự khác biệt giữa một gtk.Windowgtk.gdk.Window. Cửa sổ GTK là tiện ích GTK cấp cao nhất có thể chứa các tiện ích con khác. Nó thường được liên kết với một cửa sổ trên máy tính của bạn, nhưng không phải là - trong GTK 3 có một OffscreenWindow.

Một cửa sổ GDK, phụ thuộc vào nền tảng. Trên một máy tính để bàn X nó là một wrapper mỏng xung quanh một cửa sổ X, mà không nhất thiết phải là một cửa sổ máy tính để bàn toplevel. Trên các hệ thống khác, nó tồn tại để trừu tượng hóa hệ thống cửa sổ. Một cửa sổ GDK nhận các sự kiện, vì vậy một số tiện ích không có cửa sổ GTK có các cửa sổ GDK của riêng chúng. "Cửa sổ" thực sự là một tên khủng khiếp đối với các đối tượng này, nhưng nó được thừa kế từ X và nó có thể sẽ không thay đổi.

Mỗi quy trình GTK chỉ biết về các cửa sổ riêng của mình. Bạn có thể nhận danh sách các cửa sổ GTK toplevel của ứng dụng của riêng bạn bằng cách sử dụng gtk.window_list_toplevels(). Bắt con cái của các cửa sổ này sẽ trả lại cho bạn các tiện ích GTK mà chúng chứa. Tuy nhiên, bạn không thể đi sâu vào phân cấp widget của các cửa sổ các tiến trình khác. Ví dụ: nếu quá trình khác có cửa sổ với tiện ích con là tiện ích con tùy chỉnh mà quy trình của bạn không biết? Báo cáo sẽ là loại tiện ích con nào?

Lấy danh sách các cửa sổ GDK toplevel với gtk.gdk.window_get_toplevels() về cơ bản giống như nhận được một danh sách các cửa sổ X toplevel, theo như tôi hiểu. Bạn không có cách nào biết được chúng là loại cửa sổ nào - chúng có thể là Bảng điều khiển Gnome, hoặc chúng có thể là các cửa sổ Qt, hoặc chúng có thể là một cái gì đó hoàn toàn không tương ứng với một cửa sổ máy tính để bàn.

Libwnck (link với tổng quan về những gì nó làm) có thể giúp bạn có được danh sách cửa sổ không được thu nhỏ và tiêu đề của sách nhưng không cho phép bạn nhìn thấy bên trong. Không có cách nào để làm điều đó. Libwnck sử dụng GDK nội bộ, vì vậy về mặt kỹ thuật bạn có thể làm điều đó bằng cách sử dụng GDK, nhưng tại sao bạn sẽ bận tâm nếu đã có một thư viện mà làm điều đó cho bạn? Nếu bạn thực sự muốn tự mình làm, hãy xem mã nguồn libwnck.

+1

Tôi không có ý là thô lỗ nhưng tôi không nghĩ câu trả lời của bạn là thỏa đáng. Khi kết thúc câu trả lời của bạn, bạn đã gỡ lỗi tương tự ban đầu chuối-cd-reader của mình. Tôi nhận thức được sự khác biệt giữa việc chuyển một cửa sổ gtk và cửa sổ dtk.gdk, nếu bạn đọc kỹ câu hỏi của mình, bạn sẽ nhận thấy rằng đó là một chút chủ đề ... mặc dù tôi đã đề cập đến tôi đã nhầm lẫn, vì vậy tôi đoán tôi yêu cầu mea-culpa. – Pico

+0

Tôi đoán dòng dưới cùng là, tại sao không phải là 'gtk.gdk.window_get_toplevels()' xuất kết quả bạn mô tả? Để phân loại các cửa sổ, tôi đã ấn tượng rằng họ có các thuộc tính cho mục đích duy nhất đó. – Pico

+0

Ok, tôi đoán tôi đã giải thích câu hỏi của bạn có nghĩa là tại sao bạn không thể nhận được _widgets_ con của các cửa sổ. Tôi không biết tại sao cuộc gọi GDK không thực hiện những gì bạn muốn. Có lẽ bạn nên xem mã nguồn libwnck để xem nó hoạt động như thế nào? – ptomato

7

Cửa sổ bạn nhận được là các cửa sổ được tạo trong quá trình của bạn. Để có được danh sách các cửa sổ, bạn cần phải truy vấn các thuộc tính của cửa sổ gốc, như thế này:

import gtk.gdk 
root = gtk.gdk.get_default_root_window() 
for id in root.property_get('_NET_CLIENT_LIST')[2]: 
    w = gtk.gdk.window_foreign_new(id) 
    if w: 
     print(w.property_get('WM_NAME')[2]) 

Xin lưu ý rằng GDK là một lớp mỏng trên engine đồ họa OS tiềm ẩn (X11/Quartz/Aqua/GDI vv) và kết quả có thể khác nhau trên các thiết bị NIX khác nhau.

+0

Câu cuối cùng của câu trả lời là không chính xác khủng khiếp. GDK là ** không ** một "wrapper mỏng trên công cụ widget", nó là thư viện vẽ/cửa sổ được sử dụng để ** thực hiện ** GTK. Qt và Motif không được kết nối với GDK theo bất kỳ cách nào. – user4815162342

+0

@ user4815162342 Cảm ơn rất nhiều, đã khắc phục. – grigoryvp

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