Python Dokunmatik Sanal Klavye
-
http://i.imgur.com/4wHjLGX.png
Öncelerde (2010) dokunmatik CNC tezgah için şu şekilde bi sanal klavye yazmıştım, birilerinin işine yarayabilir veya geliştirilebilir, eksikleri olabilir yada belki de son versiyonu olmayabilir bu :) kolay gelsin
#!/usr/bin/python import os import pygtk pygtk.require('2.0') import gtk import math import gobject import cairo import string qwerty = ( ('"', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0',), ('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p'), ('a', 's', 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';'), ('<', 'z', 'x', 'c', 'v', 'b', 'n', 'm', ',', '.'), ) left_control = (('tab', 1.5), ('caps', 1.7), ('shift', 1.0), ) right_control = (('backspace', None), ('enter', None), ('shift', None), ) class Keyboard: def __init__(self): self.windows = {} self.keys = [] self.released = True self.spacing = 10 self.ascii_width, self.ascii_height = (70,70) self.control_width, self.control_height = (150, 70) self.radius = 30 self.font_size = 40 self.line_width = 2 self.preview_width, self.preview_height = (250,250) self.preview_radius = 20 self.preview_font_size = 230 self.preview_line_width = 2 self.keyboard_width = (14 * self.ascii_width) + (12 * self.spacing) self.keyboard_height = 4 * (self.ascii_width + self.spacing) self.x, self.y = ((1280 - self.keyboard_width) / 2, 400) self.ascii_keys() # self.enter_key() def window(self,width, height): window = gtk.Window(gtk.WINDOW_TOPLEVEL) window.set_property("skip-taskbar-hint", True) window.set_decorated(False) window.set_keep_above(True) window.set_app_paintable(True) window.set_geometry_hints(None,width, height, width, height) self.screen_changed(window) return window def screen_changed(self, widget, old_screen=None): screen = widget.get_screen() colormap = screen.get_rgba_colormap() if colormap == None: colormap = screen.get_rgb_colormap() self.supports_alpha = False else: widget.set_colormap(colormap) self.supports_alpha = True return True def ascii_press(self, widget, event): if not self.released: return width, height = (self.preview_width + self.preview_line_width, self.preview_height + self.preview_line_width ) self.preview = self.window(width, height) self.preview.move(int(event.x_root - width/2), int(event.y_root - height - 20)) preview_key = Key() preview_key.set_key(widget.key, self.preview_width, self.preview_height, self.preview_radius, self.preview_font_size, self.preview_line_width ) self.preview.add(preview_key) preview_key.set_fill_color((1.0, 1.0, 1.0, 0.2)) self.preview.show_all() self.released = False print widget.key def ascii_release(self, widget, event): gobject.timeout_add(400, self.destroy_preview) def control_press(self, widget, event): def capitalize(): for key in self.keys: if key.key in string.ascii_letters: n = string.ascii_letters.index(key.key) if n < 26: n += 26 elif n > 25: n -= 26 key.set_key_name(string.ascii_letters[n]) key.redraw() def punctuation(): punc = "=!'^+%&/()" for key in self.keys: if key.key in string.digits: n = string.digits.index(key.key) key.set_key_name(punc[n]) elif key.key in punc: n = punc.index(key.key) key.set_key_name(string.digits[n]) key.redraw() if widget.key == "caps": widget.toggle() capitalize() if widget.key == "shift": punctuation() # capitalize() def control_keys(self, control): if control[1]: width = int(self.ascii_width * control[1]) else: width = int(self.keyboard_width - ((12 * self.ascii_width) + (12 * self.spacing))) if control[0] == "enter": self.x += self.spacing width -= int(self.ascii_width * 0.6) height = self.control_height * 2 + self.spacing else: height = self.control_height window = self.window(width + self.line_width, height + self.line_width) window.move(int(self.x), int(self.y)) self.x += (width + self.spacing) window.connect("destroy",self.destroy) window.connect("configure-event", self.drag_window) key = Key() key.set_key(control[0], width, height, self.radius, 20, self.line_width ) key.connect("button-press-event", self.control_press) self.windows[window] = window.get_position() window.add(key) window.show_all() return key def ascii_keys(self): rowx = self.x for i, row in enumerate(qwerty): self.x = rowx if i > 0 and i < 4: self.control_keys(left_control[i-1]) for k in row: width, height=(self.ascii_width + self.line_width, self.ascii_height + self.line_width ) window = self.window(width, height) window.move(int(self.x), int(self.y)) window.connect("destroy",self.destroy) window.connect("configure-event", self.drag_window) key = Key() key.set_key(k, self.ascii_width, self.ascii_height, self.radius, self.font_size, self.line_width ) key.connect("button-press-event", self.ascii_press) key.connect("button-release-event", self.ascii_release) self.keys.append(key) self.windows[window] = window.get_position() window.add(key) window.show_all() self.x += (self.ascii_width + self.spacing) if i < 2: self.control_keys(right_control[i]) elif i == 3: self.control_keys(right_control[2]) self.y += (self.ascii_height + self.spacing) def drag_window(self, widget, data=None): old_pos = self.windows[widget] new_pos = widget.get_position() if new_pos == old_pos: return x,y = old_pos widget.move(x,y) def destroy_preview(self): self.preview.destroy() self.released = True return False def destroy(self, widget, data=None): gtk.main_quit() def main(self): gtk.main() class Key(gtk.DrawingArea): __gsignals__ = {"expose-event" : "override", "button-press-event" : "override", "button-release-event" : "override", } def set_key(self, key, width, height, radius=20, font_size=40, line_width=2): self.set_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK) self.radius = radius self.font_size = font_size self.line_width = line_width self.key = key self.width = width / 2 self.height = height / 2 self.x = self.width + self.line_width/2 self.y = self.height + self.line_width/2 self.set_size_request(width+self.line_width, height+self.line_width) self.frame_color = (1.0, 0.2, 0.2, 0.7) self.text_color = (0.0, 0.0, 0.0, 0.9) self.fill_color = (1.0, 0.2, 0.2, 0.4) self.frame_rgba = (1.0, 0.2, 0.2, 0.7) self.text_rgba = (0.0, 0.0, 0.0, 1.0) self.fill_rgba = (1.0, 0.2, 0.2, 0.4) self.toggled = False def do_expose_event(self, event): self.redraw() def do_button_press_event(self, event): rangex = range(self.x - self.width - self.line_width, self.x + self.width + self.line_width) rangey = range(self.y - self.height - self.line_width, self.x + self.height + self.line_width) if event.x in rangex and event.y in rangey: self.set_fill_color((0.0, 1.0, 0.0, 0.7)) self.redraw() def do_button_release_event(self, event): if not self.toggled: self.set_fill_color(self.fill_color) self.redraw() def set_fill_color(self,color): self.fill_rgba = color # self.redraw() def set_frame_color(self,color): self.frame_rgba = color # self.redraw() def set_radius(self,radius): self.radius = radius # self.redraw() def set_line_width(self, width): self.line_width = width # self.redraw() def set_size(self, width, height): self.width = width self.height = height # self.redraw() def get_key_name(self): return self.key def set_key_name(self, name): self.key = name def toggle(self): self.toggled = not self.toggled def redraw(self): self.window.clear() self.cairo = self.window.cairo_create() # print dir(self.window) # print self.window.get_children() self.cairo.set_source_rgba(1.0, 1.0, 1.0, 0.0) self.cairo.set_operator(cairo.OPERATOR_SOURCE) self.cairo.paint() # self.window.clear() # self.cairo = self.window.cairo_create() # self.cairo.rectangle(self.x*2 - self.width*2, # self.y*2 - self.height*2, # self.x*2 + self.width*2, # self.y*2 + self.height*2) # self.cairo.clip() self.draw() def draw(self): self.cairo.select_font_face("FreeMono") self.cairo.set_font_size(self.font_size) n = len(self.key) self.cairo.move_to(self.x - n*(self.font_size/3), self.y + (self.font_size/3)) r,g,b,a = self.text_rgba self.cairo.set_source_rgba(r,g,b,a) self.cairo.set_operator(cairo.OPERATOR_OVER) self.cairo.show_text(self.key) self.cairo.set_line_width(self.line_width) self.cairo.move_to(self.x- self.width + self.radius, self.y - self.height) self.cairo.line_to(self.x + self.width - self.radius, self.y - self.height) self.cairo.curve_to(self.x + self.width, self.y - self.height, self.x + self.width, self.y - self.height, self.x + self.width, self.y - self.height + self.radius) self.cairo.line_to(self.x + self.width, self.y + self.height - self.radius) self.cairo.curve_to(self.x + self.width, self.y + self.height, self.x + self.width, self.y + self.height, self.x + self.width - self.radius, self.y + self.height) self.cairo.line_to(self.x - self.width + self.radius, self.y + self.height) self.cairo.curve_to(self.x - self.width, self.y + self.height, self.x - self.width, self.y + self.height, self.x - self.width, self.y + self.height - self.radius) self.cairo.line_to(self.x - self.width, self.y - self.height + self.radius) self.cairo.curve_to(self.x - self.width, self.y - self.height, self.x - self.width, self.y - self.height, self.x - self.width + self.radius, self.y - self.height) r,g,b,a = self.frame_rgba self.cairo.set_source_rgba(r,g,b,a) self.cairo.stroke_preserve() r,g,b,a = self.fill_rgba self.cairo.set_source_rgba(r,g,b,a) # self.cairo.set_operator(cairo.OPERATOR_OVER) self.cairo.fill_preserve() def draw_arc(self): self.cairo.select_font_face("FreeMono") self.cairo.set_font_size(self.font_size) n = len(self.key) self.cairo.move_to(self.x - n*(self.font_size/3), self.y + (self.font_size/3)) r,g,b,a = self.text_rgba self.cairo.set_source_rgba(r,g,b,a) self.cairo.set_operator(cairo.OPERATOR_OVER) self.cairo.show_text(self.key) self.cairo.set_line_width(self.line_width) self.cairo.move_to(self.x - (self.font_size/3), self.y + (self.font_size/3)) self.cairo.show_text(self.key) self.cairo.set_line_width(self.line_width) self.cairo.move_to(self.x- self.width + self.radius, self.y - self.height) self.cairo.arc(self.x + self.width - self.radius, self.y - self.height + self.radius, self.radius, -0.5 * math.pi, 0 ) self.cairo.move_to(self.x + self.width, self.y - self.height + self.radius) self.cairo.arc(self.x + self.width - self.radius, self.y + self.height - self.radius, self.radius, 0 , 0.5 * math.pi ) # self.cairo.move_to(self.x + self.width - self.radius, self.y + self.height) self.cairo.arc(self.x - self.width + self.radius, self.y + self.height - self.radius, self.radius, 0.5 * math.pi , 1 * math.pi ) # self.cairo.move_to(self.x - self.width, self.y + self.height - self.radius) self.cairo.arc(self.x - self.width + self.radius, self.y - self.height + self.radius, self.radius, 1 * math.pi , 1.5 * math.pi ) # self.cairo.move_to(self.x- self.width + self.radius, self.y - self.height) self.cairo.close_path() r,g,b,a = self.frame_rgba self.cairo.set_source_rgba(r,g,b,a) self.cairo.stroke_preserve() r,g,b,a = self.fill_rgba self.cairo.set_source_rgba(r,g,b,a) # self.cairo.set_operator(cairo.OPERATOR_OVER) self.cairo.fill_preserve() if __name__ == "__main__": keyboard = Keyboard() keyboard.main()
-
helal hocam güzel proje :)
-
Eline sağlık güzelmiş hocam.
-
Bir bilişim forumu olarak python bölümüne olan ilgi çok az nedense
Konuya gelirsek gayet yararlı hocam çoğu koddan anlayamasamda :)
hocam birde bilmiyordum kod aralarında <br> gibi bir kod kullanabiliyormuyduk yoksa bunlar import ettiğin modüllerden mi kaynaklı? -
2 sene mi olmuş helal =)
edit : bu arada <br> formdan kaynaklanıyor kodda böyle birşey yok
n3xt tarafından 03/Mar/13 22:41 tarihinde düzenlenmiştir -
Genç developer adayları için şu yorum satırlarını kullanın artık hacım :)
-
Ticari bir ürün olduğu için gerek duymamıştır bide bildigim kadarıyla aceleye gelmişti ondandır.
Caner cok sağlam comment yazar aslında.
-
n3xt bunu yazdı
Ticari bir ürün olduğu için gerek duymamıştır bide bildigim kadarıyla aceleye gelmişti ondandır.
Caner cok sağlam comment yazar aslında.
aynen, bir satır bile olsa comment önemli hacı :D
-
cnr437 bunu yazdın3xt bunu yazdı
Ticari bir ürün olduğu için gerek duymamıştır bide bildigim kadarıyla aceleye gelmişti ondandır.
Caner cok sağlam comment yazar aslında.
aynen, bir satır bile olsa comment önemli hacı :D
Bekliyoruz o zaman :D