Ошибка полосы прокрутки 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.

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

1 ответ

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

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

Другие вопросы по тегам