from gi.repository import Gtk, Gdk, GObject
import math
TRACKER_COLORS = [
(0.0,0.0,1.0), #blue
(0.0,0.75,0.0), #green
(0.6,0.0,1.0), #purple
(1.0,0.5,0), #orange
(0.5,0.5,0.5), #grey
(0.6,0.15,0.15), #maroonish
(0,0.3,0.0), #dark green
(0,0,0.5), #dark blue
(0.5,0.35,0.1), #muddy
(0.5,0.25,0), #dark orange
]
def Gtkcolor_to_rgb (c):
return c.red/float(2**16),c.green/float(2**16),c.blue/float(2**16)
def overlay (color_1, color_2, method=1):
return color_1[0]+color_2[0]*method,color_1[1]+color_2[1]*method,color_1[2]+color_2[2]*method
ERROR_HIGHLIGHT_COLOR = (1.0,0,0)
BASE_SIZE = 35 # The "normal" size of a box (in pixels)
BORDER_WIDTH = 9.0 # The size of space we leave for a box
BORDER_LINE_WIDTH = 4 # The size of the line we draw around a selected box
LITTLE_LINE_WIDTH = 0.25
NORMAL_LINE_WIDTH = 1 # The size of the line we draw around a box
SPACING_FACTOR = 40 # The size of a box compared (roughly) to the size
# of padding -- the larger this is, the smaller
# the spaces
SMALL_TO_BIG_FACTOR = 3 # The number of times wider than a small line a big line is.
LATIN_QWERTY_TH_LOWER = {1:'q',2:'w',3:'e',4:'r',5:'t', 6:'y', 7:'u',
8: 'i', 9:'o', 10:'p'}
LATIN_QWERTY_TM_LOWER = {1:'a', 2:'s', 3:'d', 4:'f', 5:'g', 6:'h',
7:'j', 8:'k', 9:'l'}
LATIN_QWERTY_TL_LOWER = {1:'z', 2:'x', 3: 'c', 4:'v', 5:'b', 6:'n',
7:'m', 8:'ABC'}
LATIN_QWERTY_TH_UPPER = {1:'Q',2:'W',3:'E',4:'R',5:'T', 6:'Y', 7:'U',
8: 'I', 9:'O', 10:'P'}
LATIN_QWERTY_TM_UPPER = {1:'A', 2:'S', 3:'D', 4:'F', 5:'G', 6:'H',
7:'J', 8:'K', 9:'L'}
LATIN_QWERTY_TL_UPPER = {1:'Z', 2:'X', 3: 'C', 4:'V', 5:'B', 6:'N',
7:'M', 8:'abc'}
LATIN_QKEY_LOWER = {1: LATIN_QWERTY_TH_LOWER, 2: LATIN_QWERTY_TM_LOWER,
3: LATIN_QWERTY_TL_LOWER}
LATIN_QKEY_UPPER = {1: LATIN_QWERTY_TH_UPPER, 2: LATIN_QWERTY_TM_UPPER,
3: LATIN_QWERTY_TL_UPPER}
class NumberSelector (Gtk.EventBox):
__gsignals__ = {
'changed':(GObject.SIGNAL_RUN_LAST,GObject.TYPE_NONE,()),
}
def modifykeys(self):
if self.caseflg:
Key_Layout = LATIN_QKEY_UPPER
else:
Key_Layout = LATIN_QKEY_LOWER
for y in Key_Layout:
for x in Key_Layout[y]:
b = self.bdict[(y,x)]
b.set_label(Key_Layout[y][x])
self.bdict[(y,x)] = b
self.show_all()
def setkeys(self):
if self.caseflg:
Key_Layout = LATIN_QKEY_UPPER
else:
Key_Layout = LATIN_QKEY_LOWER
self.bdict = {}
for y in Key_Layout:
for x in Key_Layout[y]:
b = Gtk.Button()
l = Gtk.Label()
if Key_Layout[y][x]==self.value:
l.set_markup('%s'%Key_Layout[y][x])
else:
l.set_markup('%s'%Key_Layout[y][x])
b.add(l)
b.set_relief(Gtk.ReliefStyle.HALF)
l = b.get_children()[0]
b.set_border_width(0)
l.set_padding(0,0)
l.get_alignment()
b.connect('clicked',self.alpha_clicked, (y,x))
self.table.attach(b,x,x+1,y,y+1)
self.bdict[(y,x)] = b
def __init__ (self,default=None,upper=9):
self.caseflg = 0
self.value = default
Gtk.EventBox.__init__(self)
self.table = Gtk.Table()
self.add(self.table)
self.setkeys()
self.connect('key-release-event',self.key_press_cb)
self.show_all()
def key_press_cb (self, w, e):
txt = Gdk.keyval_name(e.keyval)
if txt.isalpha():
self.value = txt
self.emit('changed')
else:
self.emit('changed')
def alpha_clicked (self, button, val):
if self.caseflg:
Key_Layout = LATIN_QKEY_UPPER
y,x = val
aval = Key_Layout[y][x]
else:
Key_Layout = LATIN_QKEY_LOWER
y,x = val
aval = Key_Layout[y][x]
if not aval == 'ABC' and not aval == 'abc':
self.value = aval
self.emit('changed')
else:
if aval == 'ABC':
self.caseflg = 1
self.modifykeys()
else:
self.caseflg = 0
self.modifykeys()
def get_value (self):
return self.value
def set_value (self,val):
self.value = val
w = Gtk.Window()
w.set_app_paintable(True)
w.set_type_hint(Gdk.WindowTypeHint.POPUP_MENU)
w.set_decorated(False)
ns = NumberSelector()
def number_changed_cb (b):
w.destroy()
print('value:', ns.get_value())
Gtk.main_quit()
ns.connect('changed',number_changed_cb)
w.grab_focus()
w.connect('focus-out-event',lambda *args: w.destroy())
w.add(ns)
w.show_all()
Gtk.main()
r = w.get_allocation()
w.show()
This is a pop up window for a QWERTY keyboard using latest gtk3+ libraries in python. Albeit has resizing issues initially when toggling caps, this provides a structural framework for on screen pop up keyboard (e.g., something that might be similarly used in tablet based apps).
No comments:
Post a Comment