Полноэкранное окно Python TKinter или wxPython, но «оставаться внизу» всех окон? - PullRequest
5 голосов
/ 18 декабря 2011

Я хочу создать полноэкранную панель, которая визуально блокирует доступ ко всему на экране (рабочий стол, меню, панель Unity и т. Д. В Ubuntu (11.10)), но остается под открытыми окнами других приложений.

Это сделано главным образом для защиты ноутбука от детей. Я хочу, чтобы ребенок (4 года) имел доступ к некоторым выбранным приложениям, т.е. gcompris, childs play, tux math и т. д., но не совсем для других приложений и настроек. Что-то вроде нестандартного рабочего стола + панель запуска без каких-либо поломок, без доступа к файлам и т. Д.

Я хочу, чтобы панель содержала некоторые кнопки, которые запускали бы другие приложения (используя subprocess.call), но сама панель должна оставаться под всем, что запускается из нее, или чтобы было проще, просто чтобы она оставалась под любыми открытыми полноэкранными играми и каждое открытое окно (даже когда панель фокусируется).

Полноэкранный переадресованный интерфейс Python tkinter (True) был бы идеальным (с кнопкой закрытия, защищенной паролем), если бы не тот факт, что он не позволяет другим приложениям появляться над ним, и я не уверен, возможно ли заставить его остаться внизу всего.

Есть идеи, как изменить это поведение, если это возможно, или какие-либо другие инструменты, которые позволили бы мне сделать это на python или другим способом?

Редактировать: дополнительная информация:

У меня это почти работает, но другое странное поведение с overrideredirect (True). Я мог бы понизить () приложение в начале и все в порядке, но когда я делаю это с помощью переопределенной (True), приложение полностью исчезает. Не полноэкранный тестовый код ниже:

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

когда вы запустите его как есть, откроется новое окно, и нажатие кнопки «Lower» отправит его назад, но если вы раскомментируете строку app.overrideredirect (True) и нажмете кнопку, приложение все равно будет работать но больше не будет виден.

Редактировать ... Хорошо, я думаю, я понял:

>>>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.
...

Итак, сначала я прошу оконного менеджера игнорировать мое окно, но позже я все еще хочу, чтобы wm сделал что-то с моим окном ... hypcracy:)

Есть ли другие способы убрать украшение окна, не попросив wm игнорировать окно?

Edit. Еще один взгляд на проблему с другим инструментом - wxPython

На этот раз я пытаюсь сделать это простым способом - используя Конструктор Боа. Хотя app.lower () для оконного фрейма отлично работал с Tkinter, по некоторым причинам у меня сейчас проблема с wxPython. В приведенном ниже коде - нажатие кнопки открывает окно gedit над фреймом, чем через 2 секунды фрейм переносится наверх, а еще через 2 секунды он должен опуститься на дно стека окон, но этого не происходит, по крайней мере, не в моей Ubuntu.

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

если бы я мог каким-то образом заставить Lower () работать, это было бы легко сделать с помощью ie.:

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

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

Теперь у меня закончились идеи, возможно, я просто буду придерживаться учетной записи гостя, как предложено.

1 Ответ

2 голосов
/ 19 декабря 2011

Так я устанавливаю положение окна в пигаме на окнах. При этом он покроет все остальные окна, если вы измените -1 на 1, он будет позади других окон, я знаю только, что он работает в окнах.

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)

Создание окна FULLSCREEN выполняется с помощью:

screen = pygame.display.set_mode((800, 350), FULLSCREEN) # this works in linux
...