2011-10-11 33 views
18

Tôi đang cố gắng tạo canvas có thể cuộn. Tuy nhiên, một khi tôi cố gắng thiết lập thanh cuộn để làm việc với canvas, tkinter dường như hoàn toàn bỏ qua các kích thước ban đầu tôi đặt cho canvas của mình. Tôi đã thử đóng gói tất cả chúng trong một khung, thiết lập khung hình để lấp đầy khung và sau đó thiết lập kích thước khung hình, nhưng điều đó trình bày cùng một vấn đề trừ khi tôi đặt khung để lấp đầy cửa sổ, đó không phải là thứ tôi muốn . Về cơ bản, tôi muốn có một canvas có kích thước cố định với các thanh cuộn trên đó. mã hiện tại của tôi trông như thế này (trong python 3.1):python và tkinter: sử dụng thanh cuộn trên canvas

from tkinter import * 
root=Tk() 
frame=Frame(root,width=300,height=300) 
frame.grid(row=0,column=0) 
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500)) 
hbar=Scrollbar(canvas,orient=HORIZONTAL) 
hbar.pack(side=BOTTOM,fill=X) 
hbar.config(command=canvas.xview) 
vbar=Scrollbar(canvas,orient=VERTICAL) 
vbar.pack(side=RIGHT,fill=Y) 
vbar.config(command=canvas.yview) 
canvas.config(width=300,height=300) 
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) 
canvas.pack(side=LEFT,expand=True,fill=BOTH) 

root.mainloop() 

Trả lời

26

thanh cuộn của bạn cần phải có khung như cha mẹ, không phải là Canvas:

from tkinter import * 
root=Tk() 
frame=Frame(root,width=300,height=300) 
frame.grid(row=0,column=0) 
canvas=Canvas(frame,bg='#FFFFFF',width=300,height=300,scrollregion=(0,0,500,500)) 
hbar=Scrollbar(frame,orient=HORIZONTAL) 
hbar.pack(side=BOTTOM,fill=X) 
hbar.config(command=canvas.xview) 
vbar=Scrollbar(frame,orient=VERTICAL) 
vbar.pack(side=RIGHT,fill=Y) 
vbar.config(command=canvas.yview) 
canvas.config(width=300,height=300) 
canvas.config(xscrollcommand=hbar.set, yscrollcommand=vbar.set) 
canvas.pack(side=LEFT,expand=True,fill=BOTH) 

root.mainloop() 

Lý do tại sao các công trình này là do cách pack hoạt động. Theo mặc định, nó sẽ cố gắng thu nhỏ (hoặc phát triển) một vùng chứa để khớp chính xác với các con của nó. Bởi vì thanh cuộn là con của canvas trong ví dụ ban đầu, canvas co lại để vừa.

Nếu bạn muốn thanh cuộn xuất hiện bên trong canvas, mẹo là sử dụng khung phụ. Đặt canvas và thanh cuộn trong khung bên trong này, chuyển các đường viền ra khỏi khung và bật cho khung. Đặt nền của khung giống với canvas và nó sẽ xuất hiện các thanh cuộn nằm bên trong khung vẽ.

+0

Tại sao chúng ta phải đóng gói canvas cuối cùng? Tôi đã nhận thấy rằng khi tôi gói canvas trước khi bất kỳ thanh cuộn nào kết thúc chồng chéo thanh cuộn ngang - tôi chỉ mới bắt đầu sử dụng tkinter, nhưng tôi nghĩ rằng gói đó sẽ không chồng chéo lên nhau. Cảm ơn – Lanfear

+1

Và cốt lõi là 'scrollregion = (0,0,500,500)', mà không có toàn bộ nó không thể hoạt động !! – Turtle

Các vấn đề liên quan