Ошибка полосы прокрутки Tkinter на Mac с ActiveTcl 8.5.18

В tkinter есть странная ошибка графического интерфейса при взаимодействии между указателем мыши и tkinter.Scrollbar. Ползунок полосы прокрутки находится не в месте, показанном графически, и не движется с той же скоростью, что и указатель мыши. Это очень затрудняет использование. Вот пример кода, заимствованный из http://effbot.org/tkinterbook/scrollbar.htm. :

#!/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()

Попробуйте щелкнуть и перетащить ползунок: он не работает. Если щелкнуть и перетащить ниже ползунка, все заработает. Похоже, что ползунок, реагирующий на мышь, не соответствует визуальному ползунку. Кроме того, скорость, с которой движется ползунок при перетаскивании, не соответствует скорости мыши...

Это происходит только на Mac с использованием ActiveTcl 8.5.18 (рекомендуемая версия на Mac для Python >= 2.7.10, включая Python 3). Все работает нормально при использовании osx-native python 2.7.5 и osx-native Tcl 8.5.9 (os x 10.9.5).

Проблема отсутствует в linux с python 3.4.3 и Tcl 8.6.1, в windows не уверен.

Кто-нибудь знает обходной путь/исправление? Использование версии Scrollbar с тематическим виджетом не решает проблему.


person armando.sano    schedule 15.01.2016    source источник
comment
Как вы запускаете tkinter с ActiveTcl? У меня есть ActiveTcl и ActivePython, установленные на моем компьютере с OSX, и ваш код отлично работает для меня.   -  person Bryan Oakley    schedule 15.01.2016
comment
@BryanOakley: не уверен, что ты имеешь в виду. В основном я установил ActiveTcl и python 2.7.10 и 3 с python.org, как описано здесь. У меня нет другой установки Tcl/Tk, кроме родной для osx (8.5.9) и ActiveTcl (8.5.18), поэтому я предполагаю, что когда я использую tkinter с python 3, и он говорит мне, что номер версии 8.5.18, это должно быть ActiveTcl... Приятно знать, что все работает с ActivePython! Интересно, что создает проблему тогда!   -  person armando.sano    schedule 16.01.2016


Ответы (1)


Это не ошибка в tkinter, а ошибка в реализации Tk для Mac, начиная с версии 8.5.18 и 8.6.4. В этих двух версиях родная полоса прокрутки была удалена, потому что в управлении прокруткой Cocoa были всевозможные скрытые проблемы с Tk. Полоса прокрутки теперь рисуется с помощью HItheme, но это привело к описанному смещению между визуальным ползунком и областью, которая действует как ползунок. В настоящее время нет исправления для этого. Подробнее см. здесь:

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

person Torsten Berg    schedule 11.04.2017
comment
спасибо за отслеживание этой ошибки вплоть до реализации Tk для Mac. Меня только заинтриговал тот факт, что это, похоже, не повлияло на ActiveTcl с ActivePython (комментарий BryanOakley выше) - person armando.sano; 12.04.2017