tkinter: полоса прокрутки и колесико мыши с текстом и изображением - PullRequest
0 голосов
/ 18 апреля 2020

В одном родительском виджете LabelFrame я хочу отобразить

1. картинки и несколько текстовых полей

2., имея полосу прокрутки

3. и работающую

4.mousewheel.

Я еще не видел, чтобы найти этот сценарий кода на стеке потока. Пример 1 - самый близкий, который я получил, но колесо мыши работает только при наведении полосы прокрутки, что бесполезно. Как я могу изменить колесо мыши, чтобы оно было активным на холсте без наведения? Попробовал метод Брайана Окли и не повезло. Любая помощь приветствуется.

from tkinter import *
root = Tk()
root.state('zoomed')
root.configure(background='black')

# ---Global---    ##### Configure you file name
# img1=PhotoImage(file="C:\\Users\\ name \\Downloads\\example.png")

# ---Parent Widget---
lf = LabelFrame(root, background='red')
lf.pack(pady=60)

# ---Canvas / Scroll / Frame---
canvas = Canvas(lf, width=1000, height=527)
scroll = Scrollbar(lf, orient="vertical", command=canvas.yview)
frame = Frame(canvas)

# ---Images and Text---
text1 = "#1"
text2 = "#2"
text3 = "#3"

a = Label(frame, text=text1, bg='lightgrey')
a.config(font=("times new roman", 15, "bold"))
a.pack(fill=X)

#       ###### Image input method
# b=Label(frame,image=img1,width=1000,height=500,bg='lightgrey')
# b.pack(fill=X)

c = Label(frame, text=text2, bg='white')
c.config(font=("times new roman", 15, "bold"))
c.pack(fill=X)

d = Label(frame, text=text3, bg='lightgrey', height=25, width=90)
d.config(font=("times new roman", 15, "bold"))
d.pack(fill=X)

# ---Canvas / Scroll / Frame---
canvas.create_window(0, 0, anchor='nw', window=frame)
canvas.update_idletasks()
canvas.config(scrollregion=canvas.bbox('all'), yscrollcommand=scroll.set)
canvas.pack(fill='both', expand=True, side='left')
scroll.pack(fill='y', side='right')

mainloop()

В настоящее время выясняется, является ли .window_create возможным вариантом добавления изображений в текстовый файл, где это колесо мыши работает идеально.

from tkinter import *
root=Tk()
lf=LabelFrame(root,background='lightgrey')
lf.pack()
S=Scrollbar(lf)
T=Text(lf, background='lightgrey', height=25, width=100)
T.configure(font=("times new roman", 15, "bold"))
S.pack(side=RIGHT, fill=Y)
T.pack(side=LEFT, fill=Y)
S.config(command=T.yview)
T.config(yscrollcommand=S.set)
quote = """  ╔═══════════════════════════════ஓ๑☠๑ஓ═══════════════════════════════╗                      























╚═══════════════════════════════ஓ๑☠๑ஓ═══════════════════════════════╝"""
T.insert(END, quote)
mainloop()

Ответы [ 2 ]

0 голосов
/ 20 апреля 2020

Спасибо за помощь. Вот подарок для будущих читателей. Когда используется внутри функции, она должна писать вверху функции, прежде чем окно будет создано.

from tkinter import *
root=Tk()
root.state('zoomed')
#img = PhotoImage(file="C:\\Users\\   \\Downloads\\example.png")
#---
def remove_frame(lf):
    lf.destroy()
def b1():
    a1.config(relief=SUNKEN, state=DISABLED)
    a2.config(relief=RAISED, state=ACTIVE)
    def on_mouse_wheel(event):
        if event.widget.master is frame:
            canvas.yview_scroll(-event.delta // 30, 'units')  # adjust the first argument to suit what you want
    root.bind('<MouseWheel>', on_mouse_wheel)

    lf = LabelFrame(root, background='lightgrey', padx=0, pady=0)
    lf.pack(padx=0, pady=0)

    canvas = Canvas(lf, width=1000, height=575)
    sb = Scrollbar(lf, orient="vertical", command=canvas.yview)
    frame = Frame(canvas, bg="lightgrey")
    a = Label(frame, padx=0, pady=0, bg='lightgrey', text='title 1')
    a.config(font=("times new roman", 15, "bold"))
    a.pack()
    # b = Label(frame, image=img, width=1000, height=490)
    # b.pack()
    c = Label(frame, text='text', width=0, height=0, bg="lightgrey")
    c.config(width=85, height=30)
    c.config(font=("times new roman", 15, "bold"))
    c.pack()

    canvas.create_window(0, 0, anchor='n', window=frame)
    canvas.update_idletasks()
    canvas.config(scrollregion=canvas.bbox('all'), yscrollcommand=sb.set)
    canvas.pack(fill='both', expand=True, side='left')
    sb.pack(fill='y', side='right')

    a2.config(command=lambda: [remove_frame(lf), b2()])
def b2():
    a1.config(relief=RAISED,state=ACTIVE)
    a2.config(relief=SUNKEN,state=DISABLED)
    def on_mouse_wheel(event):
        if event.widget.master is frame:
            canvas.yview_scroll(-event.delta // 30, 'units')  # adjust the first argument to suit what you want
    root.bind('<MouseWheel>', on_mouse_wheel)

    lf = LabelFrame(root, background='lightgrey', padx=0, pady=0)
    lf.pack(padx=0, pady=0)

    canvas = Canvas(lf, width=1000, height=575)
    sb = Scrollbar(lf, orient="vertical", command=canvas.yview)
    frame = Frame(canvas, bg="lightgrey")
    a = Label(frame, padx=0, pady=0, bg='lightgrey', text='title 2')
    a.config(font=("times new roman", 15, "bold"))
    a.pack()
    # b = Label(frame, image=img, width=1000, height=490)
    # b.pack()
    c = Label(frame, text='text', width=0, height=0, bg="lightgrey")
    c.config(width=85, height=30)
    c.config(font=("times new roman", 15, "bold"))
    c.pack()

    canvas.create_window(0, 0, anchor='n', window=frame)
    canvas.update_idletasks()
    canvas.config(scrollregion=canvas.bbox('all'), yscrollcommand=sb.set)
    canvas.pack(fill='both', expand=True, side='left')
    sb.pack(fill='y', side='right')

    a1.config(command=lambda: [remove_frame(lf), b1()])
#---
L=LabelFrame(root,bg='lightgrey',padx=30,pady=20)
L.pack(padx=0,pady=30)
a1=Button(L,text='1',font='bold',width=11,borderwidth=4,command=b1)
a1.grid(row=0,column=1)
a2=Button(L,text='2',font='bold',width=11,borderwidth=4,command=b2)
a2.grid(row=1,column=1)

mainloop()
0 голосов
/ 19 апреля 2020

Обычно вы можете связать событие MouseWheel с frame, но, поскольку frame покрыто этими Label, обратный вызов не будет вызван.

Поэтому вам необходимо выполнить привязку по root, чтобы сделать его прикладным. В обратном вызове прокрутку можно выполнять только в том случае, если она вызвана дочерними элементами frame:

def on_mouse_wheel(event):
    if event.widget.master is frame:
        canvas.yview_scroll(-event.delta//30, 'units') # adjust the first argument to suit what you want

root.bind('<MouseWheel>', on_mouse_wheel)
.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...