I had a chance to try the Wacom Bamboo tablet today, and the "good" news 
is  that mine doesn't work either,  so the problem is not just with your 
tablet model. 

In my case, the raw device names are "Wacom Bamboo Pen" and "Wacom Bamboo 
Pad". At the very least, the function needs to be fixed to properly detect 
the newer evdev tablet names. I don't know if any of the core pyglet devs 
are using tablets anymore, but maybe we can fix this. 

-Ben





On Saturday, July 30, 2016 at 5:58:27 PM UTC+9, Jesus Luis wrote:
>
> I get no feedback from the others either. 
> No feedback when I remove "... and len(device.axis) >= 3"
>
> printing the cursor list gives me:
> [XInputTabletCursor(Wacom Cintiq 13HD Pen stylus), 
> XInputTabletCursor(Wacom Cintiq 13HD Pad pad), XInputTabletCursor(Wacom 
> Cintiq 13HD Pen eraser)]
>
> I'm not quite sure how to check if the controls are being detected and 
> created correctly however, so no data on your forth option.
>
> On Sat, 30 Jul 2016 at 17:35 Benjamin Moran <[email protected] 
> <javascript:>> wrote:
>
>> Ah, I get the "Exception Ignored...." message sometimes on Arch. It's 
>> good to know that it affects other people as well. Maybe I'll try to track 
>> that one down when I have time and submit a patch. In any case, you can 
>> ignore that one for now, as it's harmless. I'm not sure if this affects 
>> other Linux distributions, or maybe just caused by the newer Xorg version 
>> in Arch. 
>>
>> Anyway, do you get any feedback at all? Anything from printing cursor, x, 
>> y? If not, from this point, I would try to remove the "... and 
>> len(device.axis) >= 3"  from the method. Maybe some of the tablet devices 
>> have a matching name, but they don't have enough axis to be included in the 
>> "cursors" list?  Or, maybe just print the cursor list in the method to see 
>> if it's picking up all of the devices. 
>> If that doesn't work, the next step is to make sure all of the Controls 
>> are being detected and created correctly. This would be done by looking 
>> though the raw devices, though that might be a little difficult. 
>>
>> If none of this works, I think I have a tablet at the office I can test 
>> for you. It's an older Wacom Bamboo, but at least I can confirm if that 
>> works or not.
>>
>> -Ben
>>
>>
>>
>>
>>
>>
>>
>>
>> On Saturday, July 30, 2016 at 4:40:36 PM UTC+9, Jesus Luis wrote:
>>
>>> Hi Benjamin,  I Made the changes you suggested:
>>>
>>> def get_tablets(display=None):
>>>     # Each cursor appears as a separate xinput device; find devices 
>>> that look
>>>     # like Wacom tablet cursors and amalgamate them into a single 
>>> tablet. 
>>>     cursors = []
>>>     devices = get_devices(display)
>>>     for device in devices:
>>>         if device.name in ('Wacom Cintiq 13HD Pen stylus',
>>>                            'Wacom Cintiq 13HD Pad pad',
>>>                            'Wacom Cintiq 13HD Pen eraser') and \
>>>            len(device.axes) >= 3:
>>>             cursors.append(XInputTabletCursor(device))
>>>
>>>     if cursors:
>>>         return [XInputTablet(cursors)]
>>>     return []
>>>
>>>
>>> And here's the test code:
>>>
>>>
>>> import pyglet
>>>
>>> window = pyglet.window.Window()
>>>
>>> tablet = pyglet.input.get_tablets()
>>>
>>> print(tablet[0])
>>> # <pyglet.input.x11_xinput_tablet.XInputTablet object at 0x7f89dea640f0>
>>>
>>> tablet[0].open(window)
>>>
>>>
>>> @window.event
>>> def on_motion(cursor, x, y, pressure):
>>>     print(pressure)
>>>
>>>
>>> pyglet.app.run()
>>>
>>>
>>> No print on the on_motion event, and when I close the windo I get a 
>>> Traceback:
>>>
>>> Exception ignored in: <bound method BaseWindow.__del__ of 
>>> XlibWindow(width=1, height=1)>
>>> Traceback (most recent call last):
>>>   File 
>>> "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/window/__init__.py", line 
>>> 582, in __del__
>>>   File 
>>> "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/window/xlib/__init__.py", 
>>> line 477, in close
>>>   File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/xlib.py", line 
>>> 344, in destroy
>>>   File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/base.py", line 
>>> 334, in destroy
>>>   File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/xlib.py", line 
>>> 334, in detach
>>>   File "/home/jesus/Code/Yeh/tablet_test/pyglet/pyglet/gl/lib.py", line 
>>> 97, in errcheck
>>>   File "<frozen importlib._bootstrap>", line 969, in _find_and_load
>>>   File "<frozen importlib._bootstrap>", line 954, in 
>>> _find_and_load_unlocked
>>>   File "<frozen importlib._bootstrap>", line 887, in _find_spec
>>> TypeError: 'NoneType' object is not iterable
>>>
>>> On Sat, 30 Jul 2016 at 15:57 Benjamin Moran <[email protected]> wrote:
>>>
>> Great, at least we can say it's being detected OK. 
>>>> I took a look at the pyglet.input.x11_xinput_tablet.py file, and it 
>>>> looks like this function might need some updating. Tablets seem to be 
>>>> created as a few separate devices, combined into one device. You can see 
>>>> it's looking for devices with the names below. Your tablet, instead, has 
>>>> device names like "Wacom Cintiq 13HD Pen stylus", etc. 
>>>>
>>>> Maybe a good test is to update this function with your actual device 
>>>> names, and see if it can detect and create the Tablet Device. 
>>>>
>>>> The real question is if the Wacom device names have changed because of 
>>>> the newer Linux kernel, or if only some devices have different names. 
>>>>
>>>>
>>>>
>>>> def get_tablets(display=None):
>>>>  # Each cursor appears as a separate xinput device; find devices that 
>>>> look
>>>>  # like Wacom tablet cursors and amalgamate them into a single tablet. 
>>>>  cursors = []
>>>>  devices = get_devices(display)
>>>>  for device in devices:
>>>>  if device.name in ('stylus', 'cursor', 'eraser') and \
>>>>  len(device.axes) >= 3:
>>>>  cursors.append(XInputTabletCursor(device))
>>>>
>>>>  if cursors:
>>>>  return [XInputTablet(cursors)]
>>>>  return []
>>>>
>>>>
>>>>
>>>>
>>>>
>>>> On Saturday, July 30, 2016 at 3:19:07 PM UTC+9, Jesus Luis wrote:
>>>>>
>>>>> Great job, it's working!
>>>>>
>>>>> But only with get_devices(), get_tablets() still returns an empty list.
>>>>>
>>>>>
>>>>> Python 3.5.2 (default, Jun 28 2016, 08:46:01) 
>>>>> [GCC 6.1.1 20160602] on linux
>>>>> Type "help", "copyright", "credits" or "license" for more information.
>>>>> >>> import pyglet
>>>>> >>> window = pyglet.window.Window()
>>>>> >>> tablets = pyglet.input.get_tablets()
>>>>> >>> tablets
>>>>> []
>>>>> >>> devices = pyglet.input.get_devices()
>>>>> >>> devices
>>>>> [XInputDevice(name=Virtual core pointer), XInputDevice(name=Virtual 
>>>>> core keyboard), XInputDevice(name=Virtual core XTEST pointer), 
>>>>> XInputDevice(name=Virtual core XTEST keyboard), XInputDevice(name=Power 
>>>>> Button), XInputDevice(name=Video Bus), XInputDevice(name=Power Button), 
>>>>> XInputDevice(name=USB Keyboard), XInputDevice(name=USB Keyboard), 
>>>>> XInputDevice(name=Logitech USB Receiver), XInputDevice(name=Logitech USB 
>>>>> Receiver), XInputDevice(name=Wacom Cintiq 13HD Pen stylus), 
>>>>> XInputDevice(name=Wacom Cintiq 13HD Pad pad), XInputDevice(name=Logitech 
>>>>> USB Receiver), XInputDevice(name=Wacom Cintiq 13HD Pen eraser), 
>>>>> XInputDevice(name=00:08:E0:4B:4C:80)]
>>>>> >>> devices[11].get_controls()
>>>>> [Button(name=button0, raw_name=None), Button(name=button1, 
>>>>> raw_name=None), Button(name=button2, raw_name=None), Button(name=button3, 
>>>>> raw_name=None), Button(name=button4, raw_name=None), Button(name=button5, 
>>>>> raw_name=None), Button(name=button6, raw_name=None), Button(name=key0, 
>>>>> raw_name=None), Button(name=key1, raw_name=None), Button(name=key2, 
>>>>> raw_name=None), Button(name=key3, raw_name=None), Button(name=key4, 
>>>>> raw_name=None), Button(name=key5, raw_name=None), Button(name=key6, 
>>>>> raw_name=None), Button(name=key7, raw_name=None), Button(name=key8, 
>>>>> raw_name=None), Button(name=key9, raw_name=None), Button(name=key10, 
>>>>> raw_name=None), Button(name=key11, raw_name=None), Button(name=key12, 
>>>>> raw_name=None), Button(name=key13, raw_name=None), Button(name=key14, 
>>>>> raw_name=None), Button(name=key15, raw_name=None), Button(name=key16, 
>>>>> raw_name=None), Button(name=key17, raw_name=None), Button(name=key18, 
>>>>> raw_name=None), Button(name=key19, raw_name=None), Button(name=key20, 
>>>>> raw_name=None), Button(name=key21, raw_name=None), Button(name=key22, 
>>>>> raw_name=None), Button(name=key23, raw_name=None), Button(name=key24, 
>>>>> raw_name=None), Button(name=key25, raw_name=None), Button(name=key26, 
>>>>> raw_name=None), Button(name=key27, raw_name=None), Button(name=key28, 
>>>>> raw_name=None), Button(name=key29, raw_name=None), Button(name=key30, 
>>>>> raw_name=None), Button(name=key31, raw_name=None), Button(name=key32, 
>>>>> raw_name=None), Button(name=key33, raw_name=None), Button(name=key34, 
>>>>> raw_name=None), Button(name=key35, raw_name=None), Button(name=key36, 
>>>>> raw_name=None), Button(name=key37, raw_name=None), Button(name=key38, 
>>>>> raw_name=None), Button(name=key39, raw_name=None), Button(name=key40, 
>>>>> raw_name=None), Button(name=key41, raw_name=None), Button(name=key42, 
>>>>> raw_name=None), Button(name=key43, raw_name=None), Button(name=key44, 
>>>>> raw_name=None), Button(name=key45, raw_name=None), Button(name=key46, 
>>>>> raw_name=None), Button(name=key47, raw_name=None), Button(name=key48, 
>>>>> raw_name=None), Button(name=key49, raw_name=None), Button(name=key50, 
>>>>> raw_name=None), Button(name=key51, raw_name=None), Button(name=key52, 
>>>>> raw_name=None), Button(name=key53, raw_name=None), Button(name=key54, 
>>>>> raw_name=None), Button(name=key55, raw_name=None), Button(name=key56, 
>>>>> raw_name=None), Button(name=key57, raw_name=None), Button(name=key58, 
>>>>> raw_name=None), Button(name=key59, raw_name=None), Button(name=key60, 
>>>>> raw_name=None), Button(name=key61, raw_name=None), Button(name=key62, 
>>>>> raw_name=None), Button(name=key63, raw_name=None), Button(name=key64, 
>>>>> raw_name=None), Button(name=key65, raw_name=None), Button(name=key66, 
>>>>> raw_name=None), Button(name=key67, raw_name=None), Button(name=key68, 
>>>>> raw_name=None), Button(name=key69, raw_name=None), Button(name=key70, 
>>>>> raw_name=None), Button(name=key71, raw_name=None), Button(name=key72, 
>>>>> raw_name=None), Button(name=key73, raw_name=None), Button(name=key74, 
>>>>> raw_name=None), Button(name=key75, raw_name=None), Button(name=key76, 
>>>>> raw_name=None), Button(name=key77, raw_name=None), Button(name=key78, 
>>>>> raw_name=None), Button(name=key79, raw_name=None), Button(name=key80, 
>>>>> raw_name=None), Button(name=key81, raw_name=None), Button(name=key82, 
>>>>> raw_name=None), Button(name=key83, raw_name=None), Button(name=key84, 
>>>>> raw_name=None), Button(name=key85, raw_name=None), Button(name=key86, 
>>>>> raw_name=None), Button(name=key87, raw_name=None), Button(name=key88, 
>>>>> raw_name=None), Button(name=key89, raw_name=None), Button(name=key90, 
>>>>> raw_name=None), Button(name=key91, raw_name=None), Button(name=key92, 
>>>>> raw_name=None), Button(name=key93, raw_name=None), Button(name=key94, 
>>>>> raw_name=None), Button(name=key95, raw_name=None), Button(name=key96, 
>>>>> raw_name=None), Button(name=key97, raw_name=None), Button(name=key98, 
>>>>> raw_name=None), Button(name=key99, raw_name=None), Button(name=key100, 
>>>>> raw_name=None), Button(name=key101, raw_name=None), Button(name=key102, 
>>>>> raw_name=None), Button(name=key103, raw_name=None), Button(name=key104, 
>>>>> raw_name=None), Button(name=key105, raw_name=None), Button(name=key106, 
>>>>> raw_name=None), Button(name=key107, raw_name=None), Button(name=key108, 
>>>>> raw_name=None), Button(name=key109, raw_name=None), Button(name=key110, 
>>>>> raw_name=None), Button(name=key111, raw_name=None), Button(name=key112, 
>>>>> raw_name=None), Button(name=key113, raw_name=None), Button(name=key114, 
>>>>> raw_name=None), Button(name=key115, raw_name=None), Button(name=key116, 
>>>>> raw_name=None), Button(name=key117, raw_name=None), Button(name=key118, 
>>>>> raw_name=None), Button(name=key119, raw_name=None), Button(name=key120, 
>>>>> raw_name=None), Button(name=key121, raw_name=None), Button(name=key122, 
>>>>> raw_name=None), Button(name=key123, raw_name=None), Button(name=key124, 
>>>>> raw_name=None), Button(name=key125, raw_name=None), Button(name=key126, 
>>>>> raw_name=None), Button(name=key127, raw_name=None), Button(name=key128, 
>>>>> raw_name=None), Button(name=key129, raw_name=None), Button(name=key130, 
>>>>> raw_name=None), Button(name=key131, raw_name=None), Button(name=key132, 
>>>>> raw_name=None), Button(name=key133, raw_name=None), Button(name=key134, 
>>>>> raw_name=None), Button(name=key135, raw_name=None), Button(name=key136, 
>>>>> raw_name=None), Button(name=key137, raw_name=None), Button(name=key138, 
>>>>> raw_name=None), Button(name=key139, raw_name=None), Button(name=key140, 
>>>>> raw_name=None), Button(name=key141, raw_name=None), Button(name=key142, 
>>>>> raw_name=None), Button(name=key143, raw_name=None), Button(name=key144, 
>>>>> raw_name=None), Button(name=key145, raw_name=None), Button(name=key146, 
>>>>> raw_name=None), Button(name=key147, raw_name=None), Button(name=key148, 
>>>>> raw_name=None), Button(name=key149, raw_name=None), Button(name=key150, 
>>>>> raw_name=None), Button(name=key151, raw_name=None), Button(name=key152, 
>>>>> raw_name=None), Button(name=key153, raw_name=None), Button(name=key154, 
>>>>> raw_name=None), Button(name=key155, raw_name=None), Button(name=key156, 
>>>>> raw_name=None), Button(name=key157, raw_name=None), Button(name=key158, 
>>>>> raw_name=None), Button(name=key159, raw_name=None), Button(name=key160, 
>>>>> raw_name=None), Button(name=key161, raw_name=None), Button(name=key162, 
>>>>> raw_name=None), Button(name=key163, raw_name=None), Button(name=key164, 
>>>>> raw_name=None), Button(name=key165, raw_name=None), Button(name=key166, 
>>>>> raw_name=None), Button(name=key167, raw_name=None), Button(name=key168, 
>>>>> raw_name=None), Button(name=key169, raw_name=None), Button(name=key170, 
>>>>> raw_name=None), Button(name=key171, raw_name=None), Button(name=key172, 
>>>>> raw_name=None), Button(name=key173, raw_name=None), Button(name=key174, 
>>>>> raw_name=None), Button(name=key175, raw_name=None), Button(name=key176, 
>>>>> raw_name=None), Button(name=key177, raw_name=None), Button(name=key178, 
>>>>> raw_name=None), Button(name=key179, raw_name=None), Button(name=key180, 
>>>>> raw_name=None), Button(name=key181, raw_name=None), Button(name=key182, 
>>>>> raw_name=None), Button(name=key183, raw_name=None), Button(name=key184, 
>>>>> raw_name=None), Button(name=key185, raw_name=None), Button(name=key186, 
>>>>> raw_name=None), Button(name=key187, raw_name=None), Button(name=key188, 
>>>>> raw_name=None), Button(name=key189, raw_name=None), Button(name=key190, 
>>>>> raw_name=None), Button(name=key191, raw_name=None), Button(name=key192, 
>>>>> raw_name=None), Button(name=key193, raw_name=None), Button(name=key194, 
>>>>> raw_name=None), Button(name=key195, raw_name=None), Button(name=key196, 
>>>>> raw_name=None), Button(name=key197, raw_name=None), Button(name=key198, 
>>>>> raw_name=None), Button(name=key199, raw_name=None), Button(name=key200, 
>>>>> raw_name=None), Button(name=key201, raw_name=None), Button(name=key202, 
>>>>> raw_name=None), Button(name=key203, raw_name=None), Button(name=key204, 
>>>>> raw_name=None), Button(name=key205, raw_name=None), Button(name=key206, 
>>>>> raw_name=None), Button(name=key207, raw_name=None), Button(name=key208, 
>>>>> raw_name=None), Button(name=key209, raw_name=None), Button(name=key210, 
>>>>> raw_name=None), Button(name=key211, raw_name=None), Button(name=key212, 
>>>>> raw_name=None), Button(name=key213, raw_name=None), Button(name=key214, 
>>>>> raw_name=None), Button(name=key215, raw_name=None), Button(name=key216, 
>>>>> raw_name=None), Button(name=key217, raw_name=None), Button(name=key218, 
>>>>> raw_name=None), Button(name=key219, raw_name=None), Button(name=key220, 
>>>>> raw_name=None), Button(name=key221, raw_name=None), Button(name=key222, 
>>>>> raw_name=None), Button(name=key223, raw_name=None), Button(name=key224, 
>>>>> raw_name=None), Button(name=key225, raw_name=None), Button(name=key226, 
>>>>> raw_name=None), Button(name=key227, raw_name=None), Button(name=key228, 
>>>>> raw_name=None), Button(name=key229, raw_name=None), Button(name=key230, 
>>>>> raw_name=None), Button(name=key231, raw_name=None), Button(name=key232, 
>>>>> raw_name=None), Button(name=key233, raw_name=None), Button(name=key234, 
>>>>> raw_name=None), Button(name=key235, raw_name=None), Button(name=key236, 
>>>>> raw_name=None), Button(name=key237, raw_name=None), Button(name=key238, 
>>>>> raw_name=None), Button(name=key239, raw_name=None), Button(name=key240, 
>>>>> raw_name=None), Button(name=key241, raw_name=None), Button(name=key242, 
>>>>> raw_name=None), Button(name=key243, raw_name=None), Button(name=key244, 
>>>>> raw_name=None), Button(name=key245, raw_name=None), Button(name=key246, 
>>>>> raw_name=None), Button(name=key247, raw_name=None), 
>>>>> AbsoluteAxis(name=axis0, raw_name=None), AbsoluteAxis(name=axis1, 
>>>>> raw_name=None), AbsoluteAxis(name=axis2, raw_name=None), 
>>>>> AbsoluteAxis(name=axis3, raw_name=None), AbsoluteAxis(name=axis4, 
>>>>> raw_name=None), AbsoluteAxis(name=axis5, raw_name=None), 
>>>>> Button(name=proximity, raw_name=None)]
>>>>> >>> 
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>>
>>>>> On Saturday, 30 July 2016 14:30:21 UTC+9, Benjamin Moran wrote:
>>>>>>
>>>>>> Jesus, 
>>>>>>
>>>>>> give the development branch of pyglet a try. It contains a fix for 
>>>>>> the ctypes crash on Python 3. I also extended the evdev stuff on Linux a 
>>>>>> bit to detect more joysticks, so it may work with your tablet as well. 
>>>>>> Could you give that a try and let me know the results? 
>>>>>> (The quickest way to try out the development version would be to 
>>>>>> download the repo, and just copy the pyglet folder into your project). 
>>>>>>
>>>>>> If the crash is gone, but your tablet is still not detected by 
>>>>>> pyglet.input.get_tablets():
>>>>>> Start with pyglet.input.get_devices(), and see if your tablet shows 
>>>>>> up in there. If it does, great. You should be able to open the device, 
>>>>>> and 
>>>>>> try the device.get_controls() method to see what inputs on your tablet 
>>>>>> are 
>>>>>> being detected. Tablets (and joysticks) are just a subset of "devices" 
>>>>>> that 
>>>>>> have specific controls). 
>>>>>>
>>>>>> Let me know how far along you get. Hopefully your tablet will work 
>>>>>> with the dev branch, but if not it should be fixable.
>>>>>>
>>>>>>
>>>>>>
>>>>>> On Saturday, July 30, 2016 at 2:05:34 AM UTC+9, Jesus Luis wrote:
>>>>>>>
>>>>>>> Hey Benjamin,
>>>>>>>
>>>>>>> It works on python2, but it doesn't find my Wacom tablet.
>>>>>>>
>>>>>>> Python 2.7.12 (default, Jun 28 2016, 08:31:05) 
>>>>>>> [GCC 6.1.1 20160602] on linux2
>>>>>>> Type "help", "copyright", "credits" or "license" for more 
>>>>>>> information.
>>>>>>> >>> import pyglet
>>>>>>> >>> window = pyglet.window.Window()
>>>>>>> >>> tablets = pyglet.input.get_tablets()
>>>>>>> >>> tablets
>>>>>>> []
>>>>>>> >>> 
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> On Saturday, 30 July 2016 00:45:15 UTC+9, Benjamin Moran wrote:
>>>>>>>>
>>>>>>>> It looks like you might have hit a bug in the crowd bindings, 
>>>>>>>> probably due to the new Python 2/3 dual compatible codebase.
>>>>>>>>
>>>>>>>> Could you try running it again with Python2, and see if it works? 
>>>>>>>> If so, it should be easily fixable for Python 3. Let me know how it 
>>>>>>>> goes.
>>>>>>>>
>>>>>>> -- 
>>>> You received this message because you are subscribed to a topic in the 
>>>> Google Groups "pyglet-users" group.
>>>> To unsubscribe from this topic, visit 
>>>> https://groups.google.com/d/topic/pyglet-users/NnF2xH_5GSY/unsubscribe.
>>>>
>>> To unsubscribe from this group and all its topics, send an email to 
>>>> [email protected].
>>>> To post to this group, send email to [email protected].
>>>
>>>
>>>> Visit this group at https://groups.google.com/group/pyglet-users.
>>>> For more options, visit https://groups.google.com/d/optout.
>>>>
>>> -- 
>> You received this message because you are subscribed to a topic in the 
>> Google Groups "pyglet-users" group.
>> To unsubscribe from this topic, visit 
>> https://groups.google.com/d/topic/pyglet-users/NnF2xH_5GSY/unsubscribe.
>> To unsubscribe from this group and all its topics, send an email to 
>> [email protected] <javascript:>.
>> To post to this group, send email to [email protected] 
>> <javascript:>.
>> Visit this group at https://groups.google.com/group/pyglet-users.
>> For more options, visit https://groups.google.com/d/optout.
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"pyglet-users" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/pyglet-users.
For more options, visit https://groups.google.com/d/optout.

Reply via email to