folder Tahribat.com Forumları
linefolder Python
linefolder Python Dokunmatik Sanal Klavye



Python Dokunmatik Sanal Klavye

  1. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cnr437
    cnr437's avatar
    Banlanmış Üye
    Kayıt Tarihi: 03/Nisan/2007
    Erkek

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

    Bizim olduğumuz her yerde herşey bizim yüzümüzden olmuştur. Ben benim amk bana bişey olmasın!
  2. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Reskam
    Reskam's avatar
    Kayıt Tarihi: 14/Mayıs/2012
    Erkek

    helal hocam güzel proje :)


    Memento Mori
  3. KısayolKısayol reportŞikayet pmÖzel Mesaj
    DrKill
    DrKill's avatar
    Kayıt Tarihi: 10/Mart/2004
    Erkek

    Eline sağlık güzelmiş hocam.


    Bu imzayı her gördüğünüzde 4gb kotanızın 0,00000358559191226959228515625 azalmaktadır. Bilerek ve istenerek bu imza yapılmıştır. Amaç kotanızı sömürmektir
  4. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nick6
    0x656e
    0x656e's avatar
    Kayıt Tarihi: 19/Mayıs/2012
    Homo

    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ı?

  5. KısayolKısayol reportŞikayet pmÖzel Mesaj
    n3xt
    n3xt's avatar
    Kayıt Tarihi: 07/Aralık/2009
    Erkek

    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

    İş kurma işi biraz uzun sürdü. ben askere gitmicem demedim ki lan.
  6. KısayolKısayol reportŞikayet pmÖzel Mesaj
    Jilet_Boris
    Jilet_Boris's avatar
    Kayıt Tarihi: 04/Mart/2009
    Erkek

    Genç developer adayları için şu yorum satırlarını kullanın artık hacım :)

  7. KısayolKısayol reportŞikayet pmÖzel Mesaj
    n3xt
    n3xt's avatar
    Kayıt Tarihi: 07/Aralık/2009
    Erkek

    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.


    İş kurma işi biraz uzun sürdü. ben askere gitmicem demedim ki lan.
  8. KısayolKısayol reportŞikayet pmÖzel Mesaj
    cnr437
    cnr437's avatar
    Banlanmış Üye
    Kayıt Tarihi: 03/Nisan/2007
    Erkek
    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


    Bizim olduğumuz her yerde herşey bizim yüzümüzden olmuştur. Ben benim amk bana bişey olmasın!
  9. KısayolKısayol reportŞikayet pmÖzel Mesaj
    nick6
    0x656e
    0x656e's avatar
    Kayıt Tarihi: 19/Mayıs/2012
    Homo
    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 

Toplam Hit: 1719 Toplam Mesaj: 9