Можно ли сделать кнопку прокручиваемой внутри холста? - PullRequest
1 голос
/ 10 июля 2019

Я пытался сделать кнопку внутри холста прокручиваемой, но она не будет прокручиваться.

Я пытался поместить ее в ListBox, холст, рамку, чтобы она не работала.Я пытался сделать все, но до сих пор не знаю, что делать на этом этапе.

from tkinter import *

FrameU = Tk()
frameN=Frame(FrameU,width=540,height=800,bg="#A0522D")
frameN.place(x=0,y=0,relx=.2,rely=.2)
canvas=Canvas(frameN,bg="#A0522D",width=400,height=800)
scrollbar = Scrollbar(frameN, orient = VERTICAL,width=20,relief=SUNKEN)
scrollbar.pack(side=RIGHT, fill=Y)
scrollbar.config(command=canvas.yview)
canvas.config(width=540,height=800,relief=SUNKEN)
canvas.config(yscrollcommand=scrollbar.set)



mylist=Listbox(canvas,bg="#A0522D",width=100,height=41,bd=5,highlightthickness=0,yscrollcommand=scrollbar.set )
for i in range(100):
    mylist.insert(END, i)

b = Button(canvas,bg="blue",width=5,height=5)
b.place(rely=.5,relx=.5)

mylist.config(yscrollcommand=scrollbar.set)
mylist.pack(side=LEFT,fill=BOTH)
canvas.pack(side=LEFT)

Я не получаю никаких ошибок или чего-либо еще, но если я помещаю его в свой список, он показывает внутри "для меня в диапазоне (100): «он показывает внутри холста».! frame.! canvas.! listbox.! button "

1 Ответ

0 голосов
/ 16 июля 2019

Кнопка прокрутки.Вы имеете в виду, что положение кнопки изменяется при перемещении ползунка полосы прокрутки?На первый взгляд в простейшем случае это выглядит так, как будто это невозможно.

Но вы можете привязать функцию обратного вызова к вашей полосе прокрутки, и эта функция изменит положение кнопки синхронно с ползунком полос прокрутки, перемещаемым мышью.Вот рабочий пример:

from tkinter import *
from tkinter import ttk

rx, ry = 0.45, 0.45           # the button position (relative)

root=Tk()

wCanvas, hCanvas = 400, 350   # size of canvas
w1, h1 = 800, 700             # size of scrollable area

vBar = ttk.Scrollbar(root, orient = VERTICAL)
can1 = Canvas(root, scrollregion = (0,0,w1,h1), width = wCanvas, height = hCanvas, yscrollcommand = vBar.set)
vBar['command'] = can1.yview

vBar.pack(side=RIGHT,fill=Y)
can1.pack()

can1.create_line(10, 10, 100, 100)   # for canvas scrolling confirmation only

but1 = Button(can1)
but1.place(relx = rx, rely = ry)

def VscrollBarMove(event):  # callback function
    but1.place(relx = rx, rely = ry + vBar.get()[0])  # Scrollbar.get() returns a tuple with relative positions of upper (for vertical scrollbar) and lower edges of a slider

vBar.bind('<B1-Motion>', VscrollBarMove)

root.mainloop()

Версия функции обратного вызова для случая с двумя кнопками:

def VscrollBarMove(event):  # callback function
    but1.place(relx = rx, rely=ry+vBar.get()[0])
    but2.place(rely = ry2 + vBar.get()[0])  # You can set the only desirable coordinate if You want
...