Bonsoir.

Je voudrais avoir le comportement suivant : dans une DrawingArea, lorsque j'appuie sur le clavier (0-9 ou lettre), une Entry apparaît, reprenant le premier caractère que j'ai tapé, puis me permettant de continuer un texte ou un nombre.

J'ai réussi à le faire mais la première fois que l'Entry apparaît, le premier caractère est sélectionné, donc il est effacé lorsque je tape la suite.

Cela ne se reproduit pas les fois suivantes que je tape un nouveau texte.

Voici mon code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#!/usr/bin/python
#-*- coding: utf-8 -*-
 
import gtk
import math
import cairo
 
class PyApp(gtk.Window):
 
    def __init__(self):
        super(PyApp, self).__init__()
 
        self.set_title("Simple drawing")
        self.resize(230, 150)
        self.set_position(gtk.WIN_POS_CENTER)
 
        self.connect("destroy", gtk.main_quit)
 
        darea = gtk.DrawingArea()
        darea.connect("expose-event", self.expose)
        darea.connect("key-press-event", self.toucheEnfoncee)
        darea.add_events(gtk.gdk.BUTTON_PRESS_MASK | gtk.gdk.BUTTON_RELEASE_MASK |
                    gtk.gdk.POINTER_MOTION_MASK | gtk.gdk.KEY_PRESS_MASK | gtk.gdk.KEY_RELEASE_MASK)
        darea.set_flags(gtk.CAN_FOCUS)
        self.add(darea)
 
        self.show_all()
 
        # interface pour entrer un nombre lorsqu'on a appuyé sur un chiffre
        self.interfacePourNombres = gtk.Window()
        self.interfacePourNombres.set_modal(True)
        self.zonePourNombres = gtk.Entry(3)
        self.zonePourNombres.set_flags(gtk.CAN_DEFAULT)
        self.zonePourNombres.grab_default()
        self.zonePourNombres.select_region(0,0)
        self.zonePourNombres.set_activates_default(True)
        self.zonePourNombres.set_width_chars(5)
        self.zonePourNombres.set_position(1)
        # self.zonePourNombres.set_override_mode(False)
        self.zonePourNombres.size_allocate((0, 0, 100, 20))
        self.zonePourNombres.connect("activate", self.obtenirLeNombre)
        self.zonePourNombres.show()
        self.interfacePourNombres.add(self.zonePourNombres)     
 
        # interface pour entrer un texte lorsqu'on a appuyé sur une lettre ou '/'
        self.interfacePourTextes = gtk.Window()
        self.interfacePourTextes.set_modal(True)
        self.zonePourTextes = gtk.Entry(64)
        self.zonePourTextes.set_flags(gtk.CAN_DEFAULT)
        self.zonePourTextes.grab_default()
        self.zonePourTextes.select_region(0,0)
        self.zonePourTextes.set_activates_default(True)
        self.zonePourTextes.set_width_chars(68)
        self.zonePourTextes.set_position(1)
        # self.zonePourTextes.set_override_mode(False)
        self.zonePourTextes.size_allocate((0, 0, 100, 20))
        self.zonePourTextes.connect("activate", self.obtenirLeTexte)
        self.zonePourTextes.show()
        self.interfacePourTextes.add(self.zonePourTextes)       
 
    def toucheEnfoncee(self, widget, event):
      print "toucheEnfoncee : "+str(event.keyval)
      if event.keyval >= ord('1') and event.keyval <= ord('9'):
        self.zonePourNombres.set_text(chr(event.keyval))
        self.zonePourNombres.set_position(1)
        self.zonePourNombres.select_region(0,0)
        self.interfacePourNombres.show_all()
      elif event.keyval < 255:
        if chr(event.keyval).isalnum() or event.keyval == ord('/'):
          self.zonePourTextes.set_text(chr(event.keyval))
          self.zonePourTextes.set_position(1)
          self.zonePourTextes.select_region(0,0)
          self.interfacePourTextes.show_all()
 
    def obtenirLeNombre(self, widget):
      self.interfacePourNombres.hide()
      print "nombre obtenu : "+str(widget.get_text())
 
    def obtenirLeTexte(self, widget):
      self.interfacePourTextes.hide()
      print "texte obtenu : "+str(widget.get_text())
 
    def expose(self, widget, event):
 
        cr = widget.window.cairo_create()
 
        cr.set_source_rgb(0, 0, 0)
        cr.select_font_face("Sans", cairo.FONT_SLANT_NORMAL, cairo.FONT_WEIGHT_BOLD)
        cr.set_font_size(48)
 
        w = self.allocation.width
        h = self.allocation.height
 
        cr.move_to(w/2, h/2)
 
        cr.show_text("A")
 
        xbearing, ybearing, width, height, xadvance, yadvance = cr.text_extents("A")
 
        cr.rectangle(w/2, h/2-height, width, height)
        cr.stroke()
 
PyApp()
gtk.main()
Merci pour toute aide.

--
F. Delente