Прокрутка tk.Text с помощью метода yview_scroll иногда приводит к сбоямPython

Программы на Python
Anonymous
Прокрутка tk.Text с помощью метода yview_scroll иногда приводит к сбоям

Сообщение Anonymous »

У меня есть виджет tk.Text внутри фрейма, который находится внутри блокнота. Внутри tk.Text я встраиваю еще один tk.Frame, который имеет заголовок tk.Frame и содержимое tk.Text. Проблема в том, что когда я пытаюсь прокрутить основной tk.Text снизу вверх, при прокрутке вверх появляется чисто черное фоновое поле, которое в конечном итоге исчезает после дальнейшей прокрутки. Не происходит при прокрутке вниз. Это происходит только при использовании self.yview_scroll(-2, "units"). Если я прокручиваю обычные события с помощью колеса мыши или полосы прокрутки, этого не происходит. Но иногда мне нужно прокручивать программно. Есть идеи, в чем может быть проблема?
Изображение

На этом изображении встроенный фрейм находится ниже, заголовок — Язык: ржавчина. Это происходит, когда я прокручиваю вверх снизу.
Кроме того, это происходит только при определенных размерах окна, например, --width 900 --height 1000.
Это происходит вот как я добавляю встроенный фрейм (фрагмент):

Код: Выделить всё

def format_snippets(self) -> None:
from .snippet import Snippet
start_index = self.position
text = self.get(start_index, "end-1c")
pattern = r"^```([\w#]*)\n(.*?)\n```$"
matches = []

for match in re.finditer(pattern, text, flags=re.MULTILINE | re.DOTALL):
language = match.group(1)
content_start = match.start(2)
content_end = match.end(2)
matches.append((content_start, content_end, language))

for content_start, content_end, language in reversed(matches):
start_line_col = self.index_at_char(content_start, start_index)
end_line_col = self.index_at_char(content_end, start_index)
snippet_text = self.get(start_line_col, end_line_col)
self.delete(f"{start_line_col} - 1 lines linestart", f"{end_line_col} + 1 lines lineend")

snippet = Snippet(self, snippet_text, language)
self.window_create(f"{start_line_col} - 1 lines", window=snippet)
self.snippets.append(snippet)
Пока я использую это как обходной путь:

Код: Выделить всё

def get_fraction(self, num_lines: int = 1) -> float:
total_lines = self.count("1.0", "end-1c lineend", "displaylines")[0]
fraction = num_lines / total_lines
return fraction

def scroll_up(self, check: bool = False) -> None:
fraction = self.get_fraction()
self.yview_moveto(self.yview()[0] - fraction)
Он вычисляет % одной строки.


Подробнее здесь: https://stackoverflow.com/questions/781 ... -sometimes

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