Текст Tkinter с оберткой = none не может быть прокручен по горизонтали более чем на ширину видимой строки.Python

Программы на Python
Anonymous
Текст Tkinter с оберткой = none не может быть прокручен по горизонтали более чем на ширину видимой строки.

Сообщение Anonymous »

Я возился с реализацией виджетов прокрутки в PAGE, когда заметил, что горизонтальная полоса прокрутки виджета ScrolledText исчезает, если длинные строки не видны. Оказывается, это не имеет ничего общего с горизонтальной полосой прокрутки и является оригинальным поведением Tk:

pathName xview
Возвращает список, содержащий два элемента. Каждый элемент представляет собой действительную дробь от 0 до 1; вместе они описывают часть горизонтального диапазона документа, видимую в окне. Например, если первый элемент имеет значение .2, а второй элемент — .6, 20 % текста находится за пределами экрана слева, средние 40 % видны в окне, а 40 % текста — за кадром. экран вправо. Дроби относятся только к тем строкам, которые действительно видны в окне: если все строки в окне очень короткие и полностью видны, возвращаемые дроби будут 0 и 1, даже если есть другие строки в тексте намного шире окна.

При автоматическом скрывании полос прокрутки вертикальная прокрутка заставляет горизонтальную полосу прокрутки постоянно сжиматься или расширяться. и иногда исчезают (позже влияет на вертикальную полосу прокрутки).
Как это обойти?
Соответствующий источник (в основном созданный PAGE, с некоторыми дополнениями из я за еще один виджет с прокруткой):
class AutoScroll(object):
"""Configure the scrollbars for a widget."""

def __init__(self, master, cbl=None):
try:
vsb = ttk.Scrollbar(master, orient='vertical', command=self.yview)
except:
pass
hsb = ttk.Scrollbar(master, orient='horizontal', command=self.xview)

try:
self.configure(yscrollcommand=self._autoscroll(vsb, cbl))
except:
pass
self.configure(xscrollcommand=self._autoscroll(hsb, cbl))

self.grid(column=0, row=0, sticky='nsew')
try:
vsb.grid(column=1, row=0, sticky='ns')
except:
pass
hsb.grid(column=0, row=1, sticky='ew')

master.grid_columnconfigure(0, weight=1)
master.grid_rowconfigure(0, weight=1)
# Copy geometry methods of master (taken from ScrolledText.py)

methods = (
Pack.__dict__.keys() |
Grid.__dict__.keys() |
Place.__dict__.keys()
)

for meth in methods:
if (meth[0] != "_" and meth not in ("config", "configure") and
meth not in type(self).__bases__[0].__dict__):
setattr(self, meth, getattr(master, meth))

def clscroll(self, cbl):
# Checklist elements scroll
root.update()
for i, w in enumerate(cbl[1]):
bb = ttk.Treeview.bbox(self, i, "#0")
if bb == "":
w.place_forget()
else:
x, y, _, _ = bb
w.place(x=x+(tvhh-2)/2, y=y+tvrh/2, anchor='center')
cbl[0].place(x=x+(tvhh-2)/2, anchor='center')
root.update()

# @staticmethod
def _autoscroll(self, sbar, cbl):
"""Hide and show scrollbar as needed."""
def wrapped(first, last):
if cbl:
self.clscroll(cbl)
first, last = float(first), float(last)
if first = 1:
sbar.grid_remove()
else:
sbar.grid()
sbar.set(first, last)
return wrapped

def __str__(self):
return str(self.master)

def _create_container(func):
"""Creates a ttk Frame with a given master, and use this new frame to
place the scrollbars and the widget."""
def wrapped(cls, master, **kw):
container = ttk.Frame(master)
return func(cls, container, **kw)
return wrapped

class ScrolledText(AutoScroll, Text):
"""A standard Tkinter Text widget with scrollbars that will
automatically show/hide as needed."""
@_create_container
def __init__(self, master, **kw):
Text.__init__(self, master, **kw)
AutoScroll.__init__(self, master)


Под редакцией TheLizzard
Короче:
import tkinter as tk

class MyScrollbar(tk.Canvas):
def __init__(self, master):
super().__init__(master, bg="red", height=10, width=1,
highlightthickness=0)

def set(self, low, high):
if (low == "0.0") and (high == "1.0"):
self.pack_forget()
elif (low != "0.0") or (high != "1.0"):
self.pack(side="bottom", fill="x")

if __name__ == "__main__":
root = tk.Tk()

scrollbar = MyScrollbar(root)
scrollbar.pack(side="bottom", fill="x")

text = tk.Text(root, width=30, height=10, wrap="none",
xscrollcommand=scrollbar.set)
text.insert("end", "aa"+"\n"*12+"a"*31)
text.pack(side="top", fill="both")

# Scroll up/down to see the scrollbar (in red) disappear and reappear


Подробнее здесь: https://stackoverflow.com/questions/354 ... -than-a-wi

Вернуться в «Python»