2011-12-18 37 views
5

Tôi muốn tạo một bảng toàn màn hình để chặn truy cập vào mọi thứ trên màn hình (desktop, menu, Unity Panel, vv trong Ubuntu (11.10)), nhưng vẫn ở dưới các cửa sổ đã mở của các ứng dụng khác.Toàn màn hình Python TKinter hoặc cửa sổ wxPython, nhưng 'ở phía dưới cùng' của tất cả các cửa sổ?

Điều này chủ yếu để làm bằng chứng máy tính xách tay cho trẻ em. Tôi muốn đứa trẻ (4 tuổi) có quyền truy cập vào một số ứng dụng được chọn, ví dụ: gcompris, childs play, tux math, v.v. nhưng không thực sự đối với các ứng dụng và cài đặt khác. Nội dung như bảng điều khiển máy tính để bàn tùy chỉnh + trình khởi chạy mà không cần phải truy cập vào tệp, v.v.

Tôi muốn bảng chứa một số nút sẽ khởi động các ứng dụng khác (sử dụng subprocess.call) nhưng chính bảng điều khiển cần phải ở dưới bất kỳ thứ gì được khởi chạy từ nó hoặc để làm cho mọi thứ trở nên dễ dàng hơn chỉ để nó ở dưới mọi trò chơi toàn màn hình đã mở và mọi cửa sổ đã mở (ngay cả khi bảng điều khiển lấy nét).

Trình quét ngược toàn màn hình của Python (True) sẽ hoàn hảo (với nút đóng được bảo vệ bằng mật khẩu) nếu không thực tế là nó không cho phép các ứng dụng khác xuất hiện trên đó và tôi không chắc chắn ở dưới cùng của mọi thứ.

Bất kỳ ý tưởng nào về cách thay đổi hành vi này nếu có thể, hoặc bất kỳ công cụ nào khác có thể cho phép tôi thực hiện điều này bằng python hay cách khác?

Chỉnh sửa: thông tin bổ sung:

Tôi nhận được nó gần như hoạt động nhưng một hành vi lạ khác với overrideredirect (True). Tôi có thể hạ thấp() các ứng dụng lúc bắt đầu và ok của nó, nhưng khi tôi làm điều đó với overrideredirect (True) ứng dụng biến mất hoàn toàn. Không kín màn hình thử nghiệm mã bên dưới:

from tkinter import * 

def btn1_click():app.quit();app.destroy() 
def btn2_click():app.lower()  
def handler(): 
    if tkinter.messagebox.askyesno("Quit?", "Are you sure you want to quit?"): 
     app.quit();app.destroy() 

app = Tk() 
app.title("Testing...") 
app.geometry('300x100+200+100') 
#app.overrideredirect(True) 
#app.lower() 

b1 = Button(app, text = "Exit!", width = 10, command = btn1_click);b1.pack() 
b2 = Button(app, text = "Lower", width = 10, command = btn2_click);b2.pack() 
app.protocol("WM_DELETE_WINDOW", handler) 
app.mainloop() 

khi bạn chạy nó vì nó là nó sẽ mở ra cửa sổ mới và nhấn nút 'thấp' sẽ gửi cho phía sau, nhưng nếu bạn bỏ ghi chú app.overrideredirect (True) và nhấn nút ứng dụng sẽ vẫn chạy nhưng sẽ không còn hiển thị nữa.

Chỉnh sửa ... Ok, tôi nghĩ rằng tôi nhận được nó:

>>>help(tkinter) 
... 
    | overrideredirect = wm_overrideredirect(self, boolean=None) 
    |  Instruct the window manager to ignore this widget 
    |  if BOOLEAN is given with 1. Return the current value if None 
    |  is given. 
... 

Vì vậy, lần đầu tiên tôi yêu cầu người quản lý cửa sổ để bỏ qua cửa sổ của tôi, nhưng sau đó tôi vẫn muốn wm để làm điều gì đó để tôi window ... hypcracy :)

Bất kỳ cách nào khác để loại bỏ trang trí cửa sổ mà không yêu cầu wm bỏ qua cửa sổ?

Chỉnh sửa. Một cái nhìn khác về vấn đề với một công cụ khác - wxPython

Lần này tôi đang thử nó một cách dễ dàng - sử dụng Boa Constructor. Trong khi app.lower() trên một khung cửa sổ làm việc tốt với Tkinter, vì lý do nào đó tôi có một vấn đề với wxPython bây giờ. Trong đoạn code dưới đây - nhấn nút sẽ mở một cửa sổ gedit trên Frame, hơn 2 giây sau khung được đưa lên đầu và 2 giây sau nó sẽ rơi xuống dưới cùng của ngăn xếp cửa sổ, nhưng điều đó không xảy ra, ít nhất không phải trên Ubuntu của tôi.

def OnButton3Button(self, event): 
    subprocess.call("gedit") #opens gedit above the Frame 
    time.sleep(2) #waits for 2 seconds 
    self.Raise() #brings the Frame to the top 
    time.sleep(2) #waits for another 2 seconds 
    self.Lower() #should Lower the Frame to the bottom, but it doesn't 

nếu tôi có thể làm cho Hạ() làm việc bằng cách nào đó nó sẽ được dễ dàng thực hiện bằng cách ví dụ .:

def OnFrame1Activate(self, event): 
    self.ShowFullScreen(True) 

def OnFrame1EnterWindow(self, event): 
    self.Lower() 

Bây giờ tôi chạy ra khỏi ý tưởng, có lẽ tôi sẽ chỉ dính vào các tài khoản Guest như đề nghị.

+2

Làm thế nào về chỉ cần nhấp vào "Switch User"> Khách? – unutbu

+0

Cảm ơn đề xuất, đáng để thử, sẽ cho phép Khách xem tài khoản 'Khách' là bằng chứng của người dùng, ý tôi là "không đọc cú nhấp chuột ngẫu nhiên", nhưng vẫn tự hỏi nếu có thể chặn mọi thứ bằng python :) – Ireneusz

Trả lời

2

Đây là cách tôi đặt vị trí cửa sổ trong pygame trên cửa sổ. Với điều này, nó sẽ bao gồm tất cả các cửa sổ khác, nếu bạn thay đổi -1 đến 1 nó sẽ được đằng sau các cửa sổ khác, tôi chỉ biết nó hoạt động trong các cửa sổ.

import pygame, time, datetime, ctypes 
from pygame.locals import * 
from ctypes import windll 

pygame.init() 
set_window_pos = windll.user32.SetWindowPos 
monitorsize = ctypes.windll.user32 
resolution_X = monitorsize.GetSystemMetrics(0) 
resolution_Y = monitorsize.GetSystemMetrics(1) 

screen = pygame.display.set_mode((255, 242), pygame.NOFRAME) 
set_window_pos(pygame.display.get_wm_info()['window'], -1, (resolution_X - 255), 50, 0, 0, 0x0001) 

Làm một toàn màn hình cửa sổ được thực hiện với:

screen = pygame.display.set_mode((800, 350), FULLSCREEN) # this works in linux 
Các vấn đề liên quan