Как я могу заставить полосу прокрутки двигаться с помощью моего курсора - PullRequest
0 голосов
/ 29 апреля 2019

Я хотел бы привязать курсор к полосе прокрутки, чтобы при переходе к следующему виджету «Текст» окно прокручивалось до положения курсора.

В моем коде много текстовых виджетов иокно прокручивается.Я использую Ctrl-Tab для перехода к следующему виджету Текст, но когда курсор находится в виджете, а не в окне, полоса прокрутки не перемещается.Я понимаю, что у меня есть полоса прокрутки, связанная с колесом мыши.Как я могу также сделать полосу прокрутки связанной с курсором.

import tkinter as tk
from tkinter import *
from tkinter import ttk


def on_mousewheel(event):
    canvas.yview_scroll(int(-1 * (event.delta / 120)), "units")

def on_configure(event):
    # update scrollregion after starting 'mainloop'
    # when all widgets are in canvas
    canvas.configure(scrollregion=canvas.bbox('all'))
    canvas.itemconfigure('internal_frame', width=event.width - 10)

# Create new window
new_win = tk.Tk()
new_win.focus_force()

# Create a canvas with a scrollbar
canvas = tk.Canvas(new_win)
canvas.grid(row=0, column=0, sticky=tk.N + tk.S + tk.E + tk.W)

scrollbar = ttk.Scrollbar(new_win, command=canvas.yview)
scrollbar.grid(sticky=(N, S), row=0, column=1)
canvas.config(yscrollcommand=scrollbar.set)

# --- put frame in canvas ---
new_frame = tk.Frame(canvas)
new_frame.grid(row=0, column=0, sticky=tk.N + tk.S + tk.E + tk.W)

canvas.create_window((0, 0), window=new_frame, anchor='nw', tags=('internal_frame',))

# update scrollregion after starting 'mainloop when all widgets are in canvas
canvas.bind('<Configure>', on_configure)
new_win.bind('<MouseWheel>', on_mousewheel)

# Add Widgets
insert_box = []
for i in range(10):
    insert_box.append(tk.Text(new_frame, borderwidth=2, height=4, width=30, wrap=WORD))
    insert_box[i].grid(column=1, row=i, sticky=tk.N + tk.S + tk.E + tk.W)

# configure
new_win.grid_columnconfigure(0, weight=1)
new_win.grid_rowconfigure(0, weight=1)

new_frame.grid_columnconfigure(1, weight=1)
new_frame.grid_rowconfigure(0, weight=1)

canvas.grid_columnconfigure(0, weight=1)
canvas.grid_rowconfigure(0, weight=1)

new_win.mainloop()

1 Ответ

0 голосов
/ 30 апреля 2019

Если вы хотите перейти к текущему виджету Text с помощью Ctrl + Tab или курсора, поскольку у вас уже есть список insert_box. Просто свяжите команду yview_moveto с каждым созданным вами Text виджетом с FocusIn:

for i in insert_box:
    i.bind("<FocusIn>",lambda e, i=i:canvas.yview_moveto(insert_box.index(i)/len(insert_box)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...