Цель: я пытаюсь создать текстовый редактор, который отображает номер вертикальной строки сбоку от вашего текста.
Проблема: я связал текстовое поле, в котором вы редактируете свой текст, и список, отображает число рядом с отредактированным текстом. Если вы go вниз достаточно строк, чтобы вам пришлось прокрутить и попробовать ввести. Вы вернетесь наверх. Я пробовал запустить метод «see», и он просто заставляет текстовое поле прокручиваться в случайные места. Я также пробовал использовать другое текстовое поле, но, похоже, оно действует так же, как поле со списком. Надеюсь, этой информации хватит на go. спасибо
from tkinter import *
class MainScreen(Frame):
def __init__(self, master, **kwargs):
Frame.__init__(self, master)
'''Set Up Vertical Numbers'''
self.verticalNumbers = Listbox(self, **kwargs)
#self.verticalNumbers.config(state='disabled')
self.verticalNumbers.pack(side='left', fill='y')
'''Set Up Text Box'''
self.textBox = Text(self, **kwargs)
self.textBox.pack(side='left', fill='both', expand='yes')
self.textBox.bind('<Key>', self.placeVerticalNumbers)
'''Set up scrollbar'''
self.scrollbar = Scrollbar(self)
self.scrollbar.pack(side='right', fill='y')
# Changing the settings to make the scrolling work
self.scrollbar['command'] = self.on_scrollbar
self.verticalNumbers['yscrollcommand'] = self.on_textscroll
self.textBox['yscrollcommand'] = self.on_textscroll
self.placeVerticalNumbers()
"""Scrollbar"""
def on_scrollbar(self, *args):
'''Scrolls both text widgets when the scrollbar is moved'''
self.verticalNumbers.yview(*args)
self.textBox.yview(*args)
def on_textscroll(self, *args):
'''Moves the scrollbar and scrolls text widgets when the mousewheel
is moved on a text widget'''
self.scrollbar.set(*args)
self.on_scrollbar('moveto', args[0])
"""Vertical Numbers"""
def placeVerticalNumbers(self, event=None):
# Get the largest digit.
largest_number = self.textBox.index(END).split('.')
largest_number = largest_number[0]
largest_digit = len(largest_number)
# get the cusors last postion.
self.cursor_last_pos = self.textBox.index('insert')
self.cursor_last_pos = self.cursor_last_pos.split('.')
print(f'last pos: {self.cursor_last_pos}')
# Place numbers on side. list box
self.verticalNumbers.delete(1, END)
for number in range(1, int(largest_number)):
# get values
number = str(number)
spaces = largest_digit - len(number)
# right align numbers
number = ' '*spaces + number
self.verticalNumbers.insert(int(number), number)
self.verticalNumbers.see(self.cursor_last_pos[0]) # Broken
if __name__ == '__main__':
root = Tk()
MS = MainScreen(root)
MS.pack()
root.mainloop()