2016-01-15 2 views
0

Il y a un bug d'interface graphique étrange dans tkinter sur l'interaction entre le pointeur de la souris et un tkinter.Scrollbar. Le curseur de la barre de défilement n'est pas à l'emplacement indiqué graphiquement et il ne se déplace pas à la même vitesse que le curseur de la souris. Cela le rend très difficile à utiliser. Voici un exemple de code, emprunté à http://effbot.org/tkinterbook/scrollbar.htm:Tkinter bug Scrollbar sur mac avec ActiveTcl 8.5.18

#!/usr/bin/env python3 # python 3.4.3 using ActiveTcl 8.5.18 
#!/usr/bin/env python # python 2.7.10 using ActiveTcl 8.5.18 
#!/usr/bin/python # os-x-native python 2.7.5 using os-x-native Tcl 8.5.9 [WORKS] 

# Example from http://effbot.org/tkinterbook/scrollbar.htm 
try: 
    # Python2 
    import Tkinter as tk 

except ImportError: 
    # Python3 
    import tkinter as tk 
    import tkinter.ttk as ttk 

import sys 

master = tk.Tk() 

# print version info: 
sys.stdout.write("Python: %s.%s.%s\nTcl: %s\n" % (sys.version_info[0], sys.version_info[1], sys.version_info[2], tk.Tcl().eval("info patchlevel"))) 

# scrollbar = ttk.Scrollbar(master) 
scrollbar = tk.Scrollbar(master) 
scrollbar.pack(side=tk.RIGHT, fill=tk.Y) 

listbox = tk.Listbox(master, yscrollcommand=scrollbar.set) 
for i in range(1000): 
    listbox.insert(tk.END, str(i)) 
listbox.pack(side=tk.LEFT, fill=tk.BOTH) 

scrollbar.config(command=listbox.yview) 

tk.mainloop() 

Essayez de cliquer-glisser le curseur: il ne fonctionne pas. Si vous cliquez et faites glisser ci-dessous le curseur, alors cela fonctionne. Il semble que le curseur de souris-réactif ne correspond pas au curseur visuel. En outre, la vitesse à laquelle le curseur se déplace lors du glissement ne correspond pas à la vitesse de la souris ...

Cela ne se produit que sur Mac en utilisant ActiveTcl 8.5.18 (la version recommandée sur mac pour Python> = 2.7.10 y compris Python 3). Tout fonctionne correctement avec le python 2.7.5 osx-native et Tcl 8.5.9 osx-native (os x 10.9.5).

Le problème est absent sur Linux avec python 3.4.3 et Tcl 8.6.1, pas sûr sur windows.

Quelqu'un connaîtrait-il une solution de contournement? L'utilisation de la version à thème de la barre de défilement ne résout pas le problème.

+0

Comment vous utilisez tkinter avec Active ** Tcl **? J'ai ActiveTcl et ActivePython installé sur ma boîte OSX et votre code fonctionne bien pour moi. –

+0

@BrianOakley: je ne sais pas ce que tu veux dire. J'ai fondamentalement installé ActiveTcl et python 2.7.10 et 3 de python.org, comme décrit [là] (https://www.python.org/download/mac/tcltk). Je n'ai pas d'autre installation de Tcl/Tk que celle de "osx-native" (8.5.9) et ActiveTcl's (8.5.18), donc je suppose que quand j'utilise tkinter avec python 3 et qu'il me dit que le numéro de version est 8.5. 18 il doit être ActiveTcl's ... Bon à savoir tout fonctionne avec ActivePython bien! Je me demande ce qui crée le problème alors! –

Répondre

0

Ce n'est pas un bogue dans tkinter, mais un bogue dans l'implémentation Mac de Tk, à partir de la version 8.5.18 et 8.6.4. Dans ces deux versions, la barre de défilement native a été supprimée car la gestion du défilement Cocoa présentait toutes sortes de problèmes cachés avec Tk. La barre de défilement est maintenant dessinée en utilisant HItheme, mais cela introduit le décalage décrit entre le curseur visuel et la zone qui agit comme le curseur. Il n'y a actuellement aucune solution pour cela. Voir ici pour plus de détails:

https://sourceforge.net/p/tcl/mailman/tcl-mac/?viewmonth=201703

+0

merci de suivre ce bug jusqu'à l'implémentation mac de Tk. Je suis seulement intrigué par le fait qu'il ne semble pas affecter ActiveTcl avec ActivePython (commentaire par BryanOakley ci-dessus) –