2012-02-19 4 views
5

저는 gtk 및 gnome 개념과 약간 혼동합니다. 내 gnome2 바탕 화면에서 최소화되지 않은 창의 목록을 얻으려고하지만 pygtk 설명서를 읽고 결과를 검사 한 후에 결과를 이해할 수 없습니다.pygtk를 사용하여 gnome2 데스크탑의 모든 창 목록을 얻으려면 어떻게합니까?

아래의 두 스 니펫 중 어느 것도 작동하지 않습니다.

는 우선 다음 콘솔 출력에서 ​​볼이

>>> 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)>] 

바와 같이, 두 번째 옵션은 두 개의 창을 반환이 ..

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

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

을 시도했다. 그러나 나는 그들이 무엇인지 알아낼 수 없었습니다. 그들 중 누구도 아이가 없으며 데스크탑에 얼마나 많은 윈도우가 있는지에 관계없이 항상 두 개의 윈도우를 얻습니다.

누구나 전형적인 gtk 기반 데스크탑 환경의 객체 계층을 설명 할 수 있습니까? 위의 코드가 작동하지 않는 이유를 이해할 수 없습니다.

자원을 wnck, xlib, qt 등으로 대체 할 수있는 대안 솔루션을 게시하지 마십시오. 다른 라이브러리를 확인하는 것과 관련하여 조언을받는 것보다 내가 뭘 잘못하고 있는지 이해하는 데 더 많은 관심이 있습니다.

답변

9

귀하의 제약은 "바나나 만 사용하여 CD 플레이어를 제작하고 싶습니다. 레이저에 의존하는 대체 솔루션을 게시하지 마십시오." GTK는 그렇게 할 수 없다. 당신은 그 일을 위해 잘못된 도구를 사용하고있다.

는 여기에 "창"실제로 의미와 코드가 작동하지 않는 이유는 무엇인지에 대한 설명입니다 :

첫째로, 당신은 gtk.Windowgtk.gdk.Window의 차이를 이해할 필요가있다. GTK 윈도우는 다른 위젯을 포함 할 수있는 최상위 GTK 위젯입니다. 일반적으로 바탕 화면의 창에 연결되지만 반드시 필요하지는 않습니다. GTK 3에는 OffscreenWindow이 있습니다.

GDK 창은 플랫폼에 따라 다릅니다. X 데스크탑에서 X 윈도우를 감싸는 얇은 래퍼입니다. 반드시 최상위 데스크탑 윈도우 일 필요는 없습니다. 다른 시스템에서는 윈도우 시스템을 추상화하기 위해 존재합니다. GDK 창은 이벤트를 수신하므로 일부 GTK 비 창 위젯에는 자체 GDK 창이 있습니다. "창"은이 객체에 대한 참으로 끔찍한 이름이지만 X에서 상속 받았으며 아마도 변경되지 않을 것입니다.

각 GTK 프로세스는 자신의 개의 창만 알고 있습니다. gtk.window_list_toplevels()을 사용하여 자신의 응용 프로그램의 최상위 GTK 창 목록을 가져올 수 있습니다. 이 윈도우의 자식을 가져 오면 포함 된 GTK 위젯을 반환해야합니다. 그러나 다른 프로세스의 창 위젯 계층 구조로 내려갈 수는 없습니다. 예를 들어, 다른 프로세스에 프로세스에서 알지 못하는 사용자 정의 위젯 인 하위 위젯이있는 창이있는 경우 어떻게할까요? 위젯의 유형으로 무엇을보고해야합니까?

gtk.gdk.window_get_toplevels()으로 최상위 GDK 윈도우의 목록을 얻는 것은 기본적으로 최상위 X 윈도우의 목록을 얻는 것과 같습니다. 이해합니다. Gnome Panel 일 수도 있고 Qt 창일 수도 있고 데스크톱 창과 일치하지 않는 뭔가 일 수도 있습니다.

Libwnck (내용은 개략적으로 link)은 최소화되지 않은 창의 목록과 제목을 제공하지만 사용자가 볼 수는 없습니다. 그렇게 할 방법이 없습니다. Libwnck은 내부적으로 GDK를 사용하기 때문에 기술적으로 GDK를 사용하여 수행 할 수 있습니다.하지만 이미 그렇게하는 라이브러리가 있다면 왜 귀찮을까요? 정말로 직접하고 싶다면 libwnck 소스 코드를보십시오.

+1

나는 무례하다는 뜻이 아니지만 귀하의 답변이 만족스럽지 않다고 생각합니다. 회신이 끝날 때까지, 귀하는 귀하의 초기 바나나 -CA 판독기 비유를 털어 놓았습니다. 나는 gtk와 dtk.gdk 윈도우 사이의 차이점을 알고있다. 당신이 내 질문을주의 깊게 읽으면, 그것은 약간 오프 - 주제라는 것을 알게 될 것이다. 내가 언급 했음에도 불구하고 나는 혼란 스러웠다. 그래서 나는 mea-culpa라고 주장한다. – Pico

+0

제가 생각하기에'gtk.gdk.window_get_toplevels()'가 당신이 기술 한 결과를 출력하지 않는 이유는 무엇입니까? 창 정렬에 관해서, 나는 그 유일한 목적을위한 속성을 가지고 있다는 인상하에있었습니다. – Pico

+0

좋아, 내가 왜 당신이 창문의 _widgets_을 얻을 수 없었는지에 대한 질문을 해석했다고 생각한다. 나는 왜 GDK 호출이 당신이 원하는 것을하지 않고 있는지 모른다. 아마도 libwnck 소스 코드를보고 거기에서 어떻게 작동하는지보아야 할 것입니다. – ptomato

7

얻을 수있는 창은 프로세스 내에서 만들어진 창입니다. 창 목록을 얻으려면, 당신은 다음과 같이 루트 윈도우의 속성을 조회해야합니다

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]) 

GDK가 (X11/석영/아쿠아/GDI 등 기본 OS 그래픽 엔진을 통해 얇은 층이 있습니다 NIX 장치에 따라 결과가 다를 수 있습니다.

+0

응답의 마지막 문장은 끔찍하게 잘못되었습니다. GDK는 ** 위젯 엔진에 대한 "얇은 래퍼가 아닙니다. ** ** GTK를 구현하는 데 사용되는 드로잉/윈도우 라이브러리입니다. Qt와 Motif는 어떤 식 으로든 GDK와 연결되지 않습니다. – user4815162342

+0

@ user4815162342 고마워요. 고침. – grigoryvp

관련 문제