Tkinter,Canvas在窗口调整大小时不扩展或收缩

2 投票
1 回答
2922 浏览
提问于 2025-04-28 05:26

我想让我的画布根据窗口的大小自动变大或变小,并在需要的时候出现滚动条。目前我还没有添加横向的滚动条,但画布的大小既不横向也不纵向变化,反而固执地保持在一个随便的大小。

我有两个框架的原因是,里面的框架需要横向滚动,因为我有好几个画布需要一起滚动,其中只有一个画布还需要纵向滚动。

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()
暂无标签

1 个回答

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()

撰写回答