Tkinter- python: Как создать текстовое поле и список рядом с ним, в котором отображаются номера строк? - PullRequest
0 голосов
/ 12 июля 2020

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

Проблема: я связал текстовое поле, в котором вы редактируете свой текст, и список, отображает число рядом с отредактированным текстом. Если вы 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()
...