2014-10-18 6 views
1

Я пытаюсь раздвинуть холст и заключить контракт на основе размера окна с помощью прокрутки по необходимости. Я не добавил горизонтальные полосы прокрутки, но она не масштабирует ни по горизонтали, ни по вертикали, а не упорно оставаясь в произвольный размер.Tkinter, Canvas отказывается расширяться или сокращаться при изменении размера окна

Причина, по которой у меня есть 2 кадра, состоит в том, что внутренний кадр прокручивается горизонтально, потому что у меня есть несколько холстов, которые должны прокручиваться вместе, только один из которых также прокручивается по вертикали.

root = Tk() 
maxtick = 1000 

frame = ttk.Frame(root)  # , padding="3 3 12 12") 
frame.grid(column=0, row=0, sticky=(N, W, E, S)) 
frame.columnconfigure(0, weight=1) 
frame.rowconfigure(0, weight=1) 

inner_frame = ttk.Frame(frame) 
inner_frame.grid(column=0, row=0, sticky=(N, W, E, S)) 
inner_frame.columnconfigure(0, weight=1) 
inner_frame.rowconfigure(0, weight=1) 

# Primary canvas (inner_frame) 
canvas = Canvas(inner_frame, bg='#FFF', width=maxtick, 
       scrollregion=(0, 0, maxtick, 16 * (128 + 1 + 1))) 
canvas.grid(column=0, row=0, sticky=(N, W, E, S)) 

for y in range(1, 128 + 1 + 1): 
    canvas.create_line(0, 16 * y - 1, maxtick, 16 * y - 1) 

# Vertical scrollbar 
vbar = ttk.Scrollbar(frame, orient=VERTICAL, command=canvas.yview) 
vbar.grid(column=1, row=0, sticky=(N, W, E, S)) 
canvas.configure(yscrollcommand=vbar.set) 

# canvas.create_line(10, 10, 200, 50) 

root.mainloop() 

ответ

3

Вам также необходимо настроить внешний вид сетки.

... 
root = Tk() 
root.columnconfigure(0, weight=1) 
root.rowconfigure(0, weight=1) 
... 

Кстати, как насчет использования pack с expand=1, fill=BOTH.

root = Tk() 
frame = ttk.Frame(root) 
frame.pack(expand=1, fill=BOTH) 

maxtick = 1000 

inner_frame = ttk.Frame(frame) 
inner_frame.pack(expand=1, fill=BOTH, side=LEFT) 

# Primary canvas (inner_frame) 
canvas = Canvas(inner_frame, bg='#FFF', width=maxtick, 
       scrollregion=(0, 0, maxtick, 16 * (128 + 1 + 1))) 
canvas.pack(expand=1, fill=BOTH) 

for y in range(1, 128 + 1 + 1): 
    canvas.create_line(0, 16 * y - 1, maxtick, 16 * y - 1) 

# Vertical scrollbar 
vbar = ttk.Scrollbar(frame, orient=VERTICAL, command=canvas.yview) 
vbar.pack(fill=Y, side=LEFT) 
canvas.configure(yscrollcommand=vbar.set) 

root.mainloop() 
+0

Будет много холстов, уложенных вертикально, пакет по-прежнему подходит? – jimbo1qaz

+0

@ jimbo1qaz, Да, это потому, что вы уже использовали фреймы. – falsetru

+0

@ jimbo1qaz: пакет часто является лучшим выбором, если вы укладываете виджеты вертикально или горизонтально внутри рамки. Сетка хорошо работает, но для использования пакета требуется несколько строк кода. –

Смежные вопросы