【发布时间】:2015-12-10 20:58:59
【问题描述】:
我想在 tkinter 应用程序中绘图。在最终程序中,将有许多垂直排列的子图,超出了屏幕的大小。所以我想要一个大小合适的窗口,带有一个向下滚动的滚动条。
从Tkinter Scrollbar Patterns 找到的 Canvas 示例开始,我创建了这个挣扎的最小示例:
#!/usr/bin/python
from Tkinter import Tk, Frame, Canvas, Scrollbar, HORIZONTAL, VERTICAL, BOTH, X, Y, BOTTOM, RIGHT, LEFT, S, N, W, E
from numpy import arange, sin
from matplotlib.figure import Figure
from matplotlib.backends.backend_tkagg import FigureCanvasTkAgg
class Test(Tk):
def __init__(self):
Tk.__init__(self, None)
self.frame=Frame(None)
self.frame.columnconfigure(0,weight=1)
self.frame.rowconfigure(0,weight=1)
self.frame.grid(row=0,column=0, sticky=W+E+N+S)
fig = Figure()
xval = arange(200)/10.
yval = sin(xval)
ax1 = fig.add_subplot(111)
ax1.plot(xval, yval)
self.hbar=Scrollbar(self.frame,orient=HORIZONTAL)
self.vbar=Scrollbar(self.frame,orient=VERTICAL)
self.canvas=FigureCanvasTkAgg(fig, master=self.frame)
self.canvas.get_tk_widget().config(bg='#FFFFFF',scrollregion=(0,0,500,500))
self.canvas.get_tk_widget().config(width=300,height=300)
self.canvas.get_tk_widget().config(xscrollcommand=self.hbar.set, yscrollcommand=self.vbar.set)
self.canvas.get_tk_widget().grid(row=0, column=0, sticky=W+E+N+S)
self.hbar.grid(row=1, column=0, sticky=W+E)
self.hbar.config(command=self.canvas.get_tk_widget().xview)
self.vbar.grid(row=0, column=1, sticky=N+S)
self.vbar.config(command=self.canvas.get_tk_widget().yview)
self.frame.config(width=100, height=100) # this has no effect
if __name__ == '__main__':
app = Test()
app.mainloop()
这是我的两个主要问题:
- 当我调整窗口大小时,滚动条是静态的,也就是说,如果我通过鼠标拖动来减小窗口大小,它会随着绘图的其余部分消失
- 更重要的是:如果我在代码中增加画布大小,窗口大小也会增加。我尝试添加
self.canvas.get_tk_widget().grid_propagate(0)没有成功...
我需要窗口大小小于一开始的绘图大小。
【问题讨论】:
标签: python matplotlib tkinter