2009-08-19 21 views
5

Đối với nền, tôi đang chạy Debian Lenny, và đã thử điều này với cả GNOME và Fluxbox.Tại sao X choke sau khi tôi vẽ đến cửa sổ gốc

Dù sao, tôi đã nhìn vào như thế nào để vẽ trên máy tính để bàn, và tôi thấy và cố gắng mã này ở đây: http://blog.prashanthellina.com/2007/08/24/drawing-on-your-desktop/

Nó hoạt động tốt, ngoại trừ khi chấm dứt nó (bằng cách nhấn kiểm soát C), X mất khả năng tạo cửa sổ mới.

Tôi đã nghĩ rằng có lẽ vấn đề đã được pygame không phát hành một số tài nguyên, vì vậy tôi thêm vào trong một khối mã để bẫy các tín hiệu kill, đem lại cho tôi những điều sau đây:

""" 
Run the following command in the shell before executing this script 
export SDL_WINDOWID=`xwininfo -root|grep "id:"|sed 's/^.*id: //'|sed 's/ (.*$//'` 
""" 
import pygame 
import sys 
import random 
import time 
import signal 





pygame.init() 

window = pygame.display.set_mode((1280, 1024)) 
screen = pygame.display.get_surface() 


def handle_sigint(signum, frame): 
    """I want to ensure resources are released before bailing.""" 
    print("SIGINT received."); 
    pygame.display.quit() 
    pygame.quit() 
    sys.exit(0) 


# Set handler to catch C^C Interupts 
signal.signal(signal.SIGINT, handle_sigint) 


while 1: 
    for event in pygame.event.get(): 
     if event.type == pygame.QUIT: sys.exit(0) 

    x = random.choice(range(640)) 
    y = random.choice(range(480)) 
    radius = random.choice(range(100)) 
    col_r = random.choice(range(255)) 
    col_g = random.choice(range(255)) 
    col_b = random.choice(range(255)) 

    time.sleep(.03) 
    rect = pygame.draw.circle(screen, (col_r, col_g, col_b), (x,y), radius) 
    pygame.display.update(rect) 

Và vì vậy tôi cố gắng một lần nữa. Lệnh in trong trình xử lý ngắt cho tôi biết rằng trình xử lý chạy khi tôi thoát, nhưng tôi vẫn có cùng một vấn đề. Và thậm chí thú vị hơn, X không có vấn đề gì trong khi nó đang chạy. Chỉ sau khi chấm dứt nó.

Có ai có thể biết được điều gì đang xảy ra và tôi có thể làm gì để sửa mã để nó không phá hỏng phiên X của tôi? Cảm ơn trước.

Trả lời

1

câu hỏi, ý tưởng & điều để thử:

  1. Nếu bạn có một thiết bị đầu cuối lên trước khi bạn thử một -c, bạn vẫn có thể gõ vào nó sau? Nếu có, có thể có sự cố trong phiên hoặc trình quản lý cửa sổ của bạn, chứ không phải máy chủ x.
  2. Bạn đã thử Ctrl-Alt-Backspace chưa? Điều này có khắc phục được sự cố của bạn không?
  3. Trình quản lý phiên bản gtk-window và x-session-manager có đang chạy không?

pygame thường chạy ra ngoài cửa sổ và thường sẽ cố gắng tự dọn dẹp. Bạn đã thêm một lời gọi rõ ràng vào pygame.display.quit(), nhưng tôi không nghĩ rằng điều này thay đổi bất cứ điều gì - pygame cố gắng xóa cửa sổ được tham chiếu bởi biến SDL_WINDOWID. Trên thực tế thành công trong việc xóa cửa sổ gốc của bạn có lẽ là một điều xấu. Tôi sẽ đoán rằng anh chàng này bạn có này, chạy ubuntu, pygame không xóa cửa sổ vì anh ta không có quyền. Bạn có thể trên hệ điều hành của bạn.

Kể từ khi giết cửa sổ gốc của bạn là xấu, làm thế nào về khôi phục lại kiểm soát của cửa sổ gốc trở lại nautilus (gnome)? một cái gì đó như gconftool-2 --type bool --set /apps/nautilus/preferences/show_desktop true?

+0

Trong câu trả lời cho các câu hỏi: 1.) Tôi vẫn có thể nhập vào thiết bị đầu cuối, mặc dù những thứ kỳ lạ bắt đầu xảy ra. Ví dụ: khi tôi nhập nhận xét này trong Firefox, tôi không có con trỏ. 2.) Có, điều đó khắc phục được sự cố. 3.) Tôi không chắc chắn làm thế nào để nói. Tôi đã thử ps ax | grep gtk và ps axe | grep phiên, nhưng tôi không thấy một trong các quy trình đó. Và thực sự, chạy trong fluxbox, tôi không sử dụng nautilus, do đó, những thứ liên quan đến gconftool có vẻ không liên quan. Nhưng trong mọi trường hợp, cảm ơn lời khuyên. – BigBeagle

+0

Vâng, bạn đã đề cập đến cả gnome & fluxbox. Tôi nên nói rằng tất cả những lời bình luận của tôi đều hướng về phía gnome. Xin lỗi vì điều đó. Nếu bạn đang chạy gnome, bạn * chắc chắn * sẽ thấy những tiến trình đang chạy. Ngoài ra, nautilus còn quản lý desktop (gnome) của bạn, ngoài chức năng như một trình duyệt tập tin. – DaveParillo

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